Huffuman树构建过程

Posted solitude-cosmos

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Huffuman树构建过程相关的知识,希望对你有一定的参考价值。

Description

Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:

1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。

2. 重复步骤1,直到{pi}中只剩下一个数。

在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。

本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:

1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。

2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。

3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。

4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。

5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。 

Input

输入的第一行包含一个正整数n(n<=100)。  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。

Output

输出用这些数构造Huffman树的总费用。

Sample Input 1 

5
5 3 8 2 9

Sample Output 1

59
Solution
//自己的比较简单但是很多过程都不必要的

#include<cstdio>
using namespace std;


int n;
int p[101];


void sort(int len) {
  int i, j,temp;
  for (i = 0;i <len ;i++) {
    for (j = 0;j < len - i - 1;j++) {
      if (p[j] > p[j + 1]) {
        temp = p[j];
        p[j] = p[j + 1];
        p[j + 1] = temp;
      }
    }
  }
}


void merge(int result) {
  int i;
  for (i = 0;i < n - 2;i++) {
    p[i] = p[i + 2];
  }
  p[i] = result;
}


int main() {
  int i,cost;
  int result = 0;
  scanf("%d", &n);
  for (i = 0;i < n;i++) {
    scanf("%d", &p[i]);
  }
  while (n!=1) {
    sort(n);
    cost = p[0] + p[1];
    merge(cost);
    result += cost;
    n--;
    /*for (i = 0;i < n;i++) {
      printf("%d ", p[i]);
    }*/
  }
  printf("%d ", result);
  return 0;
}

//参考一下别人比较简单的算法(替换排序与合并)
//首先介绍C++中sort方法
//sort(start,end,排序方法)

#include<iostream>
#include<algorithm>
using namespace std;


int n;
int p[101];


int main() {
int i,cost;
int result = 0;
scanf("%d", &n);
for (i = 0;i < n;i++) {
scanf("%d", &p[i]);
}
sort(p, p + n);
while (n>1) {
i = 0;
p[i] = p[i] + p[i + 1];
result += p[i];
p[i + 1] = -1;
sort(p,p+n);
for (i = 0;i < n;i++) {
p[i] = p[i + 1];
}
n--;
/*for (i = 0;i < n;i++) {
printf("%d ", p[i]);
}*/
}
printf("%d ", result);
return 0;
}

//再来找两个最小值

#include <stdio.h>
#define MAX 10000000
int main()
{
  int n;
  scanf("%d",&n);
  int p[n];
  int i,flag=0,sum=0;
  int min1,min2;
  for(i=0;i<n;i++)
  {
    scanf("%d",&p[i]);
  }
  min1=MAX,min2=MAX;
  while(1)
  {
    for(i=0;i<n;i++)
    {
      if(p[i]<min1)
      {
        min1=p[i];
        flag=i;
      }
    }
    p[flag]=MAX;
    for(i=0;i<n;i++)
    {
      if(p[i]<min2)
      {
        min2=p[i];
        flag=i;
      }

    }
    p[flag]+=min1;
    if(min2==MAX)
    {
      break;
    }
    else
    {
      sum+=min1+min2;
      min1=MAX;
      min2=MAX;
    }
  }
  printf("%d",sum);
  return 0;
}

 

以上是关于Huffuman树构建过程的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯 Huffuman树

试题 基础练习 Huffuman树

蓝桥杯java 基础练习 Huffuman树

蓝桥杯VIP试题 Huffuman树

蓝桥杯VIP试题 Huffuman树

[蓝桥杯][基础练习VIP]Huffuman树