【蓝桥杯学习笔记】1. 入门基本语法及练习题
【蓝桥杯学习笔记】2. 常用模型----最大公约数和最小公倍数
【蓝桥杯学习笔记】3. 质数判断
【蓝桥杯学习笔记】5. 矩阵乘法
【蓝桥杯学习笔记】6.一图看懂差分数组+《小明的彩灯》
蓝桥本笔记-----从入门到放弃
本片文章使用Python语言编写----Now is better than never
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
实现方法:
找到数组中最小的两个数,将他们取出;
另取变量记录他们的和;
并将它们的和加入到原数组/队列中。
重复上述步骤,直到数组/队列中只剩下一个数。在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用
#哈夫曼树
n=int(input())
s=list(map(int,input().split()))#2, 3, 7, 2, 6
s.sort() #2, 2, 3, 6,7
total=0
for i in range(n-1): # 两两比较 可少一次
s.append(s[0]+s[1]) #[2, 2, 3, 6, 7, 5]
total+=s[0]+s[1]
s.pop(0) #[2, 3, 6, 7, 5]
s.pop(0) #[3,6,7, 5]
s.sort() #[3,5, 6, 7]
print(total)
优先级队列,比较队列中每个数据的大小,值最小的数据拥有出队列的优先权。数据一般以元组的形式插入。如果队列中的数据没有可比性,那么数据将被包装在一个类中,忽略数据值,仅仅比较优先级数字
#哈夫曼树
from queue import PriorityQueue #优先队列
n=int(input())
a=list(map(int,input().split()))
q=PriorityQueue()
for i in a:
q.put(i) #入队
total=0
while q.qsize()!=1: #队列剩1个数时退出
a=q.get() #出队
b=q.get()
total+=a+b
q.put(a+b) #入队
print(total)
找到数组中最小的两个数,将他们取出,然后将它们的和加入到原数组/队列中,并另取变量记录他们的和。重复步骤1,直到数组/队列中只剩下一个数。在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用