蓝桥杯 基础练习 Huffman树 Java实现

it2023-07-10  65

基础练习 Huffman树

试题

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

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

实现思路

/* Scanner in = new Scanner(System.in); int cnt = in.nextInt(); Integer[] num = new Integer[cnt]; */ //参数num数组存储输入的数列 //numMin主要实现找到num[]中最小的两个数并使其相加 public static int sumMin(Integer[] num) { //x, y保存num[]中最小的两个数, 故赋一个较大的初值(其中x为最小数,y为次小数) //iX, iY则保存两个最小数的索引 int i = 0, x = 100000, y = 100000, iX = 0, iY = 0; //遍历num[] while(i < num.length) { //当前的非零数小于最小数时,则使x的值变为次小数,当前数变为x的值 if(num[i] < x && num[i] != 0) { int tmp = x; x = num[i]; y = tmp; tmp = iX; iY = tmp; iX = i; }else if(num[i] < y && num[i] != 0) { y = num[i]; iY = i; } i++; } //用num[iX]保存最小两个数的和,同时对num[iY]赋0,表示为空 num[iX] = x + y; num[iY] = 0; return num[iX]; }

完整代码

import java.util.Arrays; import java.util.*; import java.util.Scanner; import java.math.*; public class Main { public static int cnt = 0; public static void main(String[] args) { Question(); } public static void Question() { Scanner in = new Scanner(System.in); int cnt = in.nextInt(), i; Integer[] num = new Integer[cnt]; int res = 0; for(i = 0; i < cnt; i++) { num[i] = in.nextInt(); } for(i = 0; i < cnt - 1; i++) { res += sumMin(num); } System.out.println(res); } public static int sumMin(Integer[] num) { int i = 0, x = 100000, y = 100000, iX = 0, iY = 0; while(i < num.length) { if(num[i] < x && num[i] != 0) { int tmp = x; x = num[i]; y = tmp; tmp = iX; iY = tmp; iX = i; }else if(num[i] < y && num[i] != 0) { y = num[i]; iY = i; } i++; } num[iX] = x + y; num[iY] = 0; return num[iX]; } }
最新回复(0)