# 1. 熵编码概念

“熵”这一概念原本来自于化学和热力学，用于度量能量退化的指标，即熵越高，物体或系统的做功能力越低。后来香农将这一概念引入到信息论中，用于表示消息的平均信息量。信源的熵通常可以表示信源所发出信息的不确定性，即越是随机的、前后不相关的信息，其熵越高。

A 0.1
B 0.1
C 0.15
D 0.2
E 0.2
F 0.25

• A: 0000
• B: 0001
• C: 001
• D: 10
• E: 11
• F: 01

# 3. 哈夫曼树的构建Demo

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string>

using namespace std;

//每一个符号定义为一个结构体，包括字符和出现频次
typedef struct
{
unsigned char   character;
unsigned int    frequency;
} CharNode;

static bool open_input_file(ifstream &input, const char *inputFileName)
{
input.open(inputFileName);
if (!input.is_open())
{
return false;
}
return true;
}

struct MinHeapNode
{
char data;
unsigned int freq;
MinHeapNode *left, *right;
MinHeapNode(char data, unsigned freq)
{
left = right = NULL;
this->data = data;
this->freq = freq;
}
};
typedef struct MinHeapNode MinHeapNode;

struct compare
{
bool operator()(MinHeapNode* l, MinHeapNode *r)
{
return (l->freq > r->freq);
}
};

static void get_huffman_code(MinHeapNode *root, string code)
{
if (!root)
{
return;
}

if (root->data != -1)
{
cout << root->data << " : " << code << endl;;
}

get_huffman_code(root->left, code + "0");
get_huffman_code(root->right, code + "1");
}

int _tmain(int argc, _TCHAR* argv[])
{
ifstream inputFile;
if (!open_input_file(inputFile, "input.txt"))
{
cout << "Error: opening input file failed!" << endl;
return -1;
}

char buf = inputFile.get();
CharNode nodeArr[256] = { { 0, 0 } };
while (inputFile.good())
{
cout << buf;
nodeArr[buf].character = buf;
nodeArr[buf].frequency++;
buf = inputFile.get();
}
cout << endl;

priority_queue<MinHeapNode*, vector<MinHeapNode*>, compare>  minHeap;
for (int idx = 0; idx < 256; idx++)
{
if (nodeArr[idx].frequency > 0)
{
cout << "Node " << idx << ": [" << nodeArr[idx].character << ", " << nodeArr[idx].frequency << "]" << endl;
minHeap.push(new MinHeapNode(nodeArr[idx].character, nodeArr[idx].frequency));
}
}

MinHeapNode *leftNode = NULL, *rightNode = NULL, *topNode = NULL;
while (minHeap.size() != 1)
{
leftNode = minHeap.top();
minHeap.pop();

rightNode = minHeap.top();
minHeap.pop();

topNode = new MinHeapNode(-1, leftNode->freq + rightNode->freq);
topNode->left = leftNode;
topNode->right = rightNode;
minHeap.push(topNode);
}

get_huffman_code(topNode, "");

inputFile.close();
return 0;
}


|
1月前
|

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

64 9
|
28天前
|

AI算法的道德与社会影响：探索技术双刃剑的边界
【8月更文挑战第22天】AI算法作为一把双刃剑，在推动社会进步的同时，也带来了诸多道德与社会挑战。面对这些挑战，我们需要以开放的心态、严谨的态度和创新的思维，不断探索技术发展与伦理规范之间的平衡之道，共同构建一个更加美好、更加公正的AI未来。
34 1
|
1月前
|

42 2
|
1月前
|

8月更文挑战第11天
36 6
|
1月前
|

45 0
|
1月前
|

【8月更文挑战第10天】机器学习算法的应用已经深入到我们生活的方方面面，理解和掌握机器学习算法对于数据科学家、工程师乃至普通从业者来说都至关重要。通过本文的介绍，希望大家能够对机器学习有一个基本的认识，并学会如何将其应用于实际问题中。当然，机器学习是一个不断发展和演变的领域，只有不断学习和实践，才能跟上时代的步伐。
54 3
|
2月前
|

AI技术实践：利用机器学习算法预测房价

182 3
|
2月前
|

AIGC技术的核心算法与发展趋势
【7月更文第27天】随着人工智能技术的迅速发展，AIGC技术已经逐渐成为内容创造领域的一个重要组成部分。这些技术不仅能够帮助人们提高工作效率，还能创造出以往难以想象的新颖内容。本文将重点介绍几种核心算法，并通过一个简单的代码示例来展示如何使用这些算法。
54 7
|
2月前
|

74 7
|
2月前
|

51 9