【蓝桥杯学习笔记】7. 哈曼夫树

系列文章目录

【蓝桥杯学习笔记】1. 入门基本语法及练习题

【蓝桥杯学习笔记】2. 常用模型----最大公约数和最小公倍数

【蓝桥杯学习笔记】3. 质数判断

【蓝桥杯学习笔记】5. 矩阵乘法

【蓝桥杯学习笔记】6.一图看懂差分数组+《小明的彩灯》


文章目录

  • 系列文章目录
  • 前言
  • 一、曼哈夫树简介
  • 二、代码实现
    • list实现
    • queue库实现
  • 总结


前言

    蓝桥本笔记-----从入门到放弃

   本片文章使用Python语言编写----Now is better than never


一、曼哈树

        给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

      实现方法: 

        找到数组中最小的两个数,将他们取出;

        另取变量记录他们的和;

        并将它们的和加入到原数组/队列中。

        重复上述步骤,直到数组/队列中只剩下一个数。在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用          

二、使用步骤

1.list实现

#哈夫曼树
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)

2.queue实现

2.1 PriorityQueue(maxsize=0)

        优先级队列,比较队列中每个数据的大小,值最小的数据拥有出队列的优先权。数据一般以元组的形式插入。如果队列中的数据没有可比性,那么数据将被包装在一个类中,忽略数据值,仅仅比较优先级数字

#哈夫曼树
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树的总费用

你可能感兴趣的:(蓝桥杯,python,蓝桥杯)