day13优先级队列&哈夫曼树&Trie

优先级队列(Priority Queue)

优先级队列也是个队列,因此也是有这和队列差不多的设计方法,唯一不同的就是多了一个优先级,普通的队列是遵循FIFO原则,也就是先进先出,优先级队列则是按照优先级高低进行出队,比如将优先级最高的元素作为队头优先出列

优先级队列的应用场景举例

医院的夜间门诊

队列元素是病人

优先级是病情的严重情况,挂号时间

操作系统的多任务调度

队列元素是任务

优先级是任务类型

接口设计

int size();//元素的数量

boolean isEmpty();//是否为空

void enQueue(E element);//入队

E deQueue();//出队

E front;//获取队列的头元素

void clear();//清空

优先队列的底层实现

PriorityQueue


测试图

底层是直接利用二叉堆左右优先队列实现的,通过Person自定义CompareTo方法,比较数字大小,从而定义优先级高低


哈夫曼编码(Huffman Coding)

哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础;

假设现在要把字符串[ABBBCCCCCCCCDDDDDDEE]转成二进制编码进行传输,可以转成ASCII编码(65~69,1000001~1000101),但是会发现结果有点冗长,于是我们可能想到用更短的约定的编码格式来定义,例如:

A:000;B:001;C:010;D:011;E:100,这样我们就可以简单方面的将上面的字符串转换成:

000 001001001 010010010010010010010010010 011011011011011011 100 一共20个字母,转成了60个二进制位,使用哈夫曼编码,可以压缩成更少的二进制位;

哈法曼树

先计算出每个字母出现的频率(权值,这里直接用出现的次数)

权值

利用这些权值,构建一棵哈弗曼树(又称为霍夫曼树,最优二叉树)

1.以权值作为根节点构建n棵二叉树,组成森林

2.在森林中选出2个根节点最小的树合并,并作为一棵新树的左右子树,且新树的根节点为其左右子树根节点之和

3.从森林中删除刚才选取的2棵树,并将新树加入森林

4.重复2,3步骤,知道森林只剩一棵树为止,该树即为哈弗曼树

上面的步骤转化为如下图所示:

构建哈弗曼树

构建哈夫曼编码

哈夫曼树

left为0,right为1,可以得出A,B,C,D,E5个字母对应的哈弗曼编码

构建哈夫曼编码

[ABBBCCCCCCCCDDDDDDEE]的哈夫曼编码是:1110110110110000000001010101010101111

哈夫曼编码总结

n个权值构建出来的哈夫曼树拥有n个叶子节点,每个哈夫曼编码都不是另一个哈夫曼编码的前缀,哈夫曼树是带权路径长度最短的树,权值较大的节点离根节点较近;(带权路径长度:树中所有的子节点的权值乘上其到根节点的路径长度,与最终的哈夫曼编码总长度成正比关系)


Trie

Trie 也叫做字典树,前缀树(Prefix Tree),单词查找树;Trie搜索字符串的效率主要跟字符串的长度有关


Trie 接口设计

Trie接口设计

Trie 展示图

Trie 存放图

上面的展示Trie村粗cat,dog,doggy,does,cast,add6个单词

红色代表单词结束。

Trie实现代码图

构建节点代码

节点构造

parent:删除时候由后往前删除需要用到

HashMap<Character,Node<V>> children;存储对象,Character代表字母作为key,也就是d o g,Node<V>作为value,存储相关子节点数据

Character character:存储的key,删除时候使用

V value:红色节点存储的值,红色节点也代表一个单词介绍

boolean word;是否为单词的结尾,代表单词是否结束


获取node代码

node

会发现之后很多方法都会用到这个node方法,所以这里就不进一步作单词的判断,直接返回node节点按照外面的逻辑进行处理

获取节点方法get和包含方法判断

get&contains

通过word是否为true来判断要寻找的单词是否存在

前缀方法

startsWith

添加方法

add

添加单词方法重点就是如果没有子节点就创建子节点,如果有子节点的话,就判断单词是否存在,存在就替换,不存在就新增

删除方法

remove

删除方法相对于增加方法来说,会稍微麻烦一点,需要判断是否还有子节点,针对子节点是否存在的情况进行相关处理

Trie总结

Trie的优点:搜索前缀的效率主要跟前缀的长度有关

Trie的缺点:需要消耗大量的内存,因此还有待改进(一个字符对应一个节点,二叉树一个单词对应一个节点,所以相对来说内存消耗大)

demo相关地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • 2019.5.25 周六 天气晴 坚持分享第78天 525我❤️我,还能记得大学心协搞得一些活动。爱自己,才能爱家...
    岚清H阅读 258评论 0 0
  • 【同读一本书】 2016-03-09-036 《影响力》 【原文】: 隐藏在这一技巧背后的理论是:那些刚刚表明了自...
    杨平的阅读 376评论 0 0
  • 相信坚持总有进步吧
    佳木不朽阅读 384评论 2 2
  • 棉花糖似的云朵, 聚散 飘逸。 天空里, 你用一片纯洁, 静静地衬托着那份蓝。 清风吹来, 你把天空当作舞台, 拂...
    另类_074d阅读 360评论 4 2