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。

输入格式

  输入的第一行包含一个正整数n(n<=100)。

  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。

输出格式

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

样例输入

5

5 3 8 2 9

样例输出

59

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Scanner;

public class Basic28 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

List<Integer> list = new ArrayList<Integer>();

for(int i =0;i<n;i++){

int a = sc.nextInt();

list.add(a);

}

boolean flag = true;

int sum=0;

while(flag){

if(list.size()<2){

System.out.println(sum);

flag=false;

}else {

int cc []=new int[list.size()];

for(int i =0;i<cc.length;i++){

cc[i]=list.get(i);

}

Arrays.sort(cc);

int b =cc[0];

int c =cc[1];

list.remove(Integer.valueOf(b));

list.remove(Integer.valueOf(c));

int d =b+c;

sum+=d;

list.add(d);

}

}

}

}

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

  1. 基础练习 Huffuman树 _C语言和C++描述!(Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1)

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  2. 哈夫曼树及编码讲解及例题

    哈弗曼树及编码 哈弗曼树算法 第一步: 初始化n个单节点的树,并为它们表上字母中的字符.把每个字符的概率记在树的根中,用来指出树的权重(更一般地说,树的权重等于树中所有叶子的概率之和). 第二部: 重 ...

  3. 3层b+树索引访问磁盘次数_从B+树到LSM树,及LSM树在HBase中的应用

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 前 ...

  4. 从B+树到LSM树,及LSM树在HBase中的应用

    前言 在有代表性的关系型数据库如MySQL.SQL Server.Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树.而在一些主流的NoSQL数据库如HBase.Cassandra ...

  5. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

  6. 贪婪算法在解决哈夫曼树及编码问题中的应用

    哈夫曼编码,是一种可变字长编码(VLC)的高效算法.该算法是Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码. 相比定长编码来 ...

  7. Huffman树及其编码实现

    一个拥有n个待编码的字符串,其哈夫曼树具有 2n-1个节点. 用构造哈夫曼树的过程生成的二进制前缀编码.哈夫曼树是一类带权路径长度最短的树. 特点:长度最短 哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码 ...

  8. 哈夫曼树--链式结构(建立huffman树、编码、解码)

    引子: 用链式结构来建立哈夫曼树. 总体思路是: 将每一棵树(这是每一棵树只有一个节点,头节点)放在一个优先队列中(下面的是链表实现的优先队列),频率(rate)小的在队列头,取出队列头两个,频率相加 ...

  9. mysql树节点路径,关于mysql:从使用物化路径编码树的表中选择,按深度优先排序(无递归/ ltree)...

    我在关系数据库中有一个表,其中我使用称为物化路径(也称为Lineage列)的技术对树进行编码. 也就是说,对于我树中的每个节点,我在表中有一行,并且对于每一行,我有一个名为ancestry的字符串列, ...

最新文章

  1. 基于ceres的后端优化的代码实现
  2. pytorch训练过程中loss出现NaN的原因及可采取的方法
  3. 对于java的命名规范(标识符)
  4. Java读取文件流用什么对象_使用Java IO流实现对文本文件的读写过程中,通常需要处理下列( )异常。_学小易找答案...
  5. C语言中sizeof()的用法
  6. 卷积神经网络(cnn)的体系结构
  7. Docker 容器中“TERM environment variable not set.”问题解决
  8. linux删除第二列为空_Linux之基本文本处理工具(二)
  9. java自定义迭代器作用_Java实现的自定义迭代器功能示例
  10. 转载:GBDT算法梳理
  11. 大一报了c语言班要买电脑吗,少儿编程课程要自己买电脑吗
  12. oraclize预言机资料
  13. android cpu降温代码,Android手机CM设置中CPU模式解释
  14. Power BI数据可视化
  15. Hadoop2.7.1+Hbase1.2.1集群环境搭建(5)hbase安装
  16. java 抛体运动6_抛体运动的公式
  17. ArcGIS10.8安装教程
  18. ps 的一些常见的键位技巧
  19. MAC地址,IP地址和ARP协议
  20. 如何运用政务智慧引导系统提升群众办事效率

热门文章

  1. 对 zebra 的一点理解 thread+socket+read部分 (备忘)
  2. 流水条码标签的制作打印
  3. LED灯的开尔文范围及其最佳应用
  4. 【服务器数据恢复】哪些故障会导致服务器数据丢失?多块硬盘离线的数据恢复案例
  5. ESP32-C3 迷你智能语音照明
  6. canvas绘制字体时遇到Bookshelf Symbol 7字体bug
  7. 5、玩转树莓派音频——打造便携式合成器
  8. 关于hpv3000HPDV2000想把vista改成xp的朋友可以看下
  9. Matlab基本操作和矩阵输入(郭彦甫视频学习笔记)
  10. 【PTA】2022年蓝桥杯及天梯赛赛前训练(C++练习)