《数据结构与算法之美》24——堆的应用

上一节我们学习了堆和堆排序的一些理论知识(点击查看),今天我们就来讲一讲,堆这种数据结构的几个非常重要的应用。

应用一:优先级队列

优先队队列,是一个按优先级进出的特殊队列,一般的队列是先进先出,而优先级队列是优先级高的先出。

优先级队列与堆非常相似,一个堆可以看作一个优先级队列。往优先队队列插入一个元素,相当于往堆中插入一个元素;从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。

例子1:合并有序小文件

合并多个有序的小文件到大文件。假设有100个文件,要合并到1个文件里,要求有序。

定义一个大小为100的小顶堆,从100个文件里取出第一行,初始化小顶堆。然后取出堆顶放进大文件里,并从此数据所在的文件里再取出一行放到堆里(重新堆化),重复这个动作,直到所有文件的内容都为空。

例子2:高性能定时器

定时器维护多个定时任务,每个任务都设置了触发执行的时间点。

高性能定时器

计算每个任务的时间差,弄成小顶堆。取堆顶元素的时间差,让程序睡眠,睡眠时间为此时间差,程序唤醒后,取出堆顶任务(删除堆顶元素)并执行。如果任务是重复的,再重新计算任务的时间差,并插入堆里。

应用二:利用堆求Top K

抽象成两类问题:静态数据集合和动态数据集合

实现方式:定义一个大小为K的小顶堆,顺序遍历数组,逐一与堆顶进行比较,假设比它大,则删除堆顶再插入后堆化。假设小于等于它,则忽略。

对于动态数组,可维护一个实时的堆,当有数据插入数组,与堆顶判断,比它大则插入堆,否则忽略。并且插入到数组中。

时间复杂度:O(nlogk)。遍历数组O(n),每次替换(堆化)O(logk)。

应用三:利用堆求中位数

中位数指在有序数据中处于中间位置的那个数据。如果数据个数为奇数,则中位数是n/2+1位置的数,如果是偶数,则是n/2和n/2+1,可取其中的任意一个。

中位数

分两种情况:静态数据集合、动态数据集合

对于静态数据,先排序,再取n/2+1。

对于动态数据,如果每次都排序,性能不好。可利用堆来实现。

定义两个堆,一个大顶堆,一个小顶堆。大顶堆存储前半数据,小顶堆存储后半数据,并且小顶堆的数据都大于大顶堆的数据。

奇数、偶数

初始化时,对现有数组进行排序,把前n/2(n/2+1)个数存储到大顶堆里,把后n/2个数存储到小顶堆中,中位数就是大顶堆的堆顶。

对于动态插入时,把数据跟大顶堆的堆顶进行比较,如果小于等于堆顶,则插入到大堆顶。如果大于等于小堆顶的堆顶,则插入小堆顶。最后再对大顶堆和小堆顶进行平衡,保证大顶堆是n/2(n/2+1)个数据,小顶堆是n/2个数据。

插入

除了求中位数,还能求其他百分位的数据,例如“99%响应时间”。实际上中位数是求50%的数据,大堆顶和小堆顶各占50%,对于“99%响应时间”这个问题,就是把大顶堆划分为99%,小堆顶划分为1%,其他实现跟中位数一样。

中位数、99%

时间复杂度:插入数据O(logn)、返回堆顶O(1)

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