1.问题
2.解析
3.设计
int v1, v2;
struct Tree {
int lChild;
int rChild;
int root;
int weight;
}tree[MAX];
void findMin(Tree tree[], int k) {
//初始化v1
for (int i = 0; i < k; ++i) {
if (tree[i].root == -1) {
v1 = i;
break;
}
}
//遍寻找到第一个权值最小的根节点
for (int i = v1 + 1; i < k; i++)
if (tree[i].root == -1 && tree[i].weight < tree[v1].weight)
v1 = i;
//初始化v2
for (int i = 0; i < k; i++)
if (tree[i].root == -1 && v1 != i) {
v2 = i;
break;
}
//遍寻找到第二个权值最小的根节点
for (int i = v2 + 1; i < k; i++)
if (tree[i].root == -1 && tree[i].weight < tree[v2].weight&&i != v1)
v2 = i;
}
void Huffman(Tree tree[], int a[],int n,int k) {
//初始化数组
for (int i = 0; i < k; i++)
{
tree[i].root = -1;
tree[i].lChild = -1;
tree[i].rChild = -1;
}
for (int i = 0; i < n; i++)
tree[i].weight = a[i];
for (int i = n; i < k; i++) {
//找出最小的两个结点
findMin(tree, i);
tree[i].weight = tree[v1].weight + tree[v2].weight;
//将两个子结点的根结点记录为i
tree[v1].root = i;
tree[v2].root = i;
//将根结点的两个子结点记录为v1,v2
tree[i].lChild = v1;
tree[i].rChild = v2;
}
}
4.分析
这个代码的时间复杂度复杂度为O(n²)
基于堆实现的代码复杂度为O(nlogn)
5.源码
https://github.com/LonelyTaker/Algorithm-analysis