<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>算法 on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/%E7%AE%97%E6%B3%95/</link><description>Recent content in 算法 on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 23 Jul 2025 07:54:25 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml"/><item><title>异或</title><link>https://leafcxy.github.io/posts/2025-07-23-10/</link><pubDate>Wed, 23 Jul 2025 07:54:25 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-23-10/</guid><description>&lt;p&gt;异或（Exclusive OR，简称 XOR）是一种数学运算符，常用于逻辑运算与计算机中的位运算。当且仅当两个输入值不同时，异或运算输出为真（1），否则输出为假（0），即“同为 0，异为 1”。异或运算可以通过数学符号“⊕”表示， 具有交换律、结合律、恒等律等性质。&lt;/p&gt;
&lt;p&gt;异或运算常见的应用包括奇偶校验、加法器设计、密码学中的加密与解密操作以及变量交换等。异或运算的一个重要特性是自反性：任何值与自身异或的结果为0，任何值与 0 异或的结果为其本身。&lt;/p&gt;
&lt;p&gt;异或广泛应用于现代信息技术的多个领域，如数据加密、错误检测和纠正、图像处理等，尤其在数字电路设计与密码学中发挥着至关重要的作用。此外，异或运算在代数领域也扮演了关键角色。它所构成的系统是阿贝尔群， 与合取（AND）运算共同构成了著名的两元素域 F2，这是描述布尔函数的代数标准型的重要基础。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="定义"&gt;定义&lt;/h2&gt;
&lt;p&gt;异或是一个数学运算符，它应用于逻辑运算与计算机中的位运算。&lt;/p&gt;
&lt;p&gt;令 p 和 q 为命题。p 和 q 的异或是这样一个命题：当p 和 q 中恰好只有一个为真时命题为真，否则为假。&lt;/p&gt;
&lt;p&gt;p 异或 q 通常记作 p XOR q 或 p⊕ q。在编程语言中通常为 p^q。&lt;/p&gt;
&lt;p&gt;如 p、q 两个值不相同，则异或结果为 1。如果 p、q 两个值相同，异或结果为 0，即异或的运算法则为：0 ⊕ 0 = 0，1 ⊕ 0 = 1，0 ⊕ 1 = 1，1 ⊕ 1 = 0（同为 0，异为 1）。这种运算捕捉了输入位的“排他性”，即输入不能同时为真。&lt;/p&gt;
&lt;p&gt;异或也叫半加运算，其运算法则相当于不带进位的二进制加法：二进制下用1 表示真，0 表示假，这些法则与加法是相同的，只是不带进位，所以异或常被认作不进位加法。&lt;/p&gt;
&lt;h2 id="应用"&gt;应用&lt;/h2&gt;
&lt;p&gt;交换两个变量的值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;^&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;^&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;^&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>哈夫曼编码</title><link>https://leafcxy.github.io/posts/2025-07-22-13/</link><pubDate>Tue, 22 Jul 2025 08:47:16 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-22-13/</guid><description>&lt;h2 id="什么是哈夫曼编码"&gt;什么是哈夫曼编码&lt;/h2&gt;
&lt;p&gt;在数据传送时，信息表现为0和1的二进制形式。为了提高传输的速度，可以采用变长的编码方式，寻找更优的编码方式。同时，必须要保证编码不存在二义性（任意字符编码都不是其它字符编码的前缀）。&lt;/p&gt;
&lt;p&gt;哈夫曼编码就是符合上述要求的编码方式，采用自底向上的形式构造哈夫曼树。按照字符的概率分配码长，实现平均码长最短的编码。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="如何进行哈夫曼编码"&gt;如何进行哈夫曼编码&lt;/h2&gt;
&lt;p&gt;使用需要传送的字符构造字符集C = {c1, c2, &amp;hellip; cn}，并根据字符出现的频率构建概率集W = {w1, w2, &amp;hellip; wn}。哈夫曼编码的流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将字符集C作为叶子节点；&lt;/li&gt;
&lt;li&gt;将频率集W作为叶子节点的权值；&lt;/li&gt;
&lt;li&gt;使用C和W构造哈夫曼树；&lt;/li&gt;
&lt;li&gt;对哈夫曼树的所有分支，左子树分支编码为0，右子树分支编码为1；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过上述流程，即完成了哈夫曼编码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HuffmanCode&lt;/span&gt;(Node &lt;span style="color:#f92672"&gt;*&lt;/span&gt;p, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; numLeafs, string &lt;span style="color:#f92672"&gt;*&lt;/span&gt;codes) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// p为节点数组的指针，codes为string数组的指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 用于存储每个节点的哈夫曼码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// parent表示父节点位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; parent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 每次对一个叶子节点进行编码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// i表示当前叶子节点位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; numLeafs; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// j表示当前节点位置，i是不能在下面循环中改变的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 使用j来记录节点的移动过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; j &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 当前节点的父节点位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p[i].parent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 从当前叶子节点p[i]开始，找到哈夫曼树的根节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 循环结束条件是此时parent为0，即达到哈夫曼树的根节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(parent &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 如果当前节点是父节点的左子树，则此分支编码为0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (p[parent].left &lt;span style="color:#f92672"&gt;==&lt;/span&gt; j) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; codes[i].&lt;span style="color:#a6e22e"&gt;push_back&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 如果当前节点是父节点的右子树，则编码为1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; codes[i].&lt;span style="color:#a6e22e"&gt;push_back&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; j &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p[j].parent;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; codes[i] &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>