网易首页 > 网易号 > 正文 申请入驻

二叉堆实现:从混乱到有序的O(n)魔法

0
分享至

八年前,一个前端工程师在面试现场被问到:"给你一个乱序数组,怎么最快找出前K大的元素?"他支支吾吾说了排序,面试官摇头。后来才知道,有个叫"堆"的数据结构,能在O(n)时间内原地建堆,每次取极值只要O(log n)。今天这段JavaScript代码,就是当年那个问题的标准答案。

这段实现的核心是个叫BinaryHeap的类,它只做一件事:维护一个"父节点总比子节点优先级高"的不变式。构造函数接收两个参数——一个初始数组和一个优先级比较函数。有意思的是,它不做类型检查,注释里写着"no types here in JS, so we trust",这种信任在2024年的TypeScript时代反而显得稀缺。


堆的魔法藏在两个私有方法里。#heapifyUp负责插入时的上浮:新元素先丢到数组末尾,然后不断和父节点比较,优先级更高就交换,直到找到合适位置。时间复杂度O(log n),递归实现消耗O(log n)栈空间,改成循环能压到O(1)。#heapifyDown则处理删除时的下沉:把末尾元素提到根节点,然后和左右孩子比,谁优先级高跟谁换,一路沉到该去的地方。

最反直觉的是#buildHeapInPlace。直觉上建堆应该逐个插入,每次O(log n),总复杂度O(n log n)。但这段代码从中间往前遍历,对每个非叶子节点做一次下沉。数学上,高度为h的节点最多有⌈n/2^(h+1)⌉个,每个下沉最多h步,求和后收敛到O(n)。这种"从底向上"的策略,是堆排序能打败普通排序的关键。

公开接口很克制:pushpop都是O(log n),数组长度小于2时直接跳过堆化。代码截断在pop方法中间,但已足够看出设计意图——用私有字段封装内部状态,用函数参数解耦优先级逻辑,不硬编码大小比较。这种灵活性让同一个类既能当最小堆也能当最大堆,全看调用者怎么定义"更高优先级"。

在实际工程里,这种结构支撑着任务调度、合并K个有序流、Dijkstra算法里的优先队列。V8引擎的定时器、Node.js的事件循环、React的调度器,底层都有它的影子。当你下次写setTimeout时,可以想想:你的回调正在某个二叉堆里等着被唤醒呢。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
女总裁天天催我找对象,我说:催催催!那你嫁给我好了!

女总裁天天催我找对象,我说:催催催!那你嫁给我好了!

千秋文化
2026-05-04 18:31:52
196天逆转!巴萨困境反超皇马:从-5分到+11分 弗里克立功

196天逆转!巴萨困境反超皇马:从-5分到+11分 弗里克立功

叶青足球世界
2026-05-10 09:41:43
是大厨也是美人!在米其林三星餐厅进修的结城希下海了!

是大厨也是美人!在米其林三星餐厅进修的结城希下海了!

孤独的独角兽影视
2026-05-10 10:35:08
豪门梦碎!阿隆索直言执教皇马是巨大错误:权力斗争已让战舰失控

豪门梦碎!阿隆索直言执教皇马是巨大错误:权力斗争已让战舰失控

星耀国际足坛
2026-05-09 21:58:29
诗妮娜贵妃机场照罕曝光!穿现代装对镜挥手笑容甜,颜值也好真实

诗妮娜贵妃机场照罕曝光!穿现代装对镜挥手笑容甜,颜值也好真实

八八尚语
2026-05-09 15:30:23
航炮点穴瘫痪伊朗油轮!美军这手操作,把暴力与克制玩到了极致

航炮点穴瘫痪伊朗油轮!美军这手操作,把暴力与克制玩到了极致

民间胡扯老哥
2026-05-10 07:06:14
15.98万,真的疯了

15.98万,真的疯了

放毒
2026-05-09 18:53:10
“求是”文章不足以改变对房地产的预期

“求是”文章不足以改变对房地产的预期

科学发掘
2026-05-10 06:31:04
湖人利好:范德比尔特复出可出战G3 四天前刚遭遇手指脱臼

湖人利好:范德比尔特复出可出战G3 四天前刚遭遇手指脱臼

醉卧浮生
2026-05-10 07:04:34
果不其然,特朗普访华又生变?中国提的要求,美国竟然拒绝了

果不其然,特朗普访华又生变?中国提的要求,美国竟然拒绝了

松林侃世界
2026-05-09 23:10:09
两口子因为给不给9岁的儿子割包皮 争八百回!网友:听爸爸的没错

两口子因为给不给9岁的儿子割包皮 争八百回!网友:听爸爸的没错

市井大实话
2026-04-24 10:20:09
陈翔六点半“吴妈”去世,球球证实,死因曝光,生命最后瘦到脱相

陈翔六点半“吴妈”去世,球球证实,死因曝光,生命最后瘦到脱相

叨唠
2026-05-09 19:41:34
历史老师跌入“无人区”:某高中20人教研组,近一半无学生可教

历史老师跌入“无人区”:某高中20人教研组,近一半无学生可教

听心堂
2026-03-31 15:52:04
罕见啊!毁车+恐吓+醉驾+亲子鉴定!这连环计太可怕了!!

罕见啊!毁车+恐吓+醉驾+亲子鉴定!这连环计太可怕了!!

柚子说球
2026-05-09 20:45:00
黄维被特赦后偶遇廖运周,当场就要动手:你真把老子害苦了!

黄维被特赦后偶遇廖运周,当场就要动手:你真把老子害苦了!

近史谈
2026-05-10 02:54:15
李亚鹏回应嫣然儿童医院新址:开下去没问题,但选址需要解决医保资质、跨区等很多问题,所以还得再等等

李亚鹏回应嫣然儿童医院新址:开下去没问题,但选址需要解决医保资质、跨区等很多问题,所以还得再等等

上观新闻
2026-05-10 06:43:16
张本智和又喊夺冠,日媒称马龙樊振东隐退后国乒不行了,真相如何

张本智和又喊夺冠,日媒称马龙樊振东隐退后国乒不行了,真相如何

李絙在北漂
2026-05-10 13:13:32
太突然!国际奥委会连招呼都没打,直接官宣上海办“奥运”?

太突然!国际奥委会连招呼都没打,直接官宣上海办“奥运”?

可乐爱微笑
2026-05-09 19:30:34
“森林北”否认与汪峰分手:“我们俩其实挺好的”,如果未来真有什么变化,想说的话会亲自告诉大家,此前其清空与汪峰相关社交动态引热议

“森林北”否认与汪峰分手:“我们俩其实挺好的”,如果未来真有什么变化,想说的话会亲自告诉大家,此前其清空与汪峰相关社交动态引热议

鲁中晨报
2026-05-10 09:54:07
大唐订单破10万!比亚迪快把自己笑死了

大唐订单破10万!比亚迪快把自己笑死了

ZAKER新闻
2026-05-08 20:47:05
2026-05-10 14:15:00
爬虫饲养员
爬虫饲养员
业余养了只叫“龙虾”的AI爬虫,主业是给互联网打工。
2399文章数 28关注度
往期回顾 全部

科技要闻

DeepSeek融资,改写所有人的估值

头条要闻

美贸易代表:中国在很大程度上限制大量美商品对华出口

头条要闻

美贸易代表:中国在很大程度上限制大量美商品对华出口

体育要闻

詹姆斯生涯第6次0-3困境:今年会被横扫吗

娱乐要闻

大S女儿玥儿开通账号,用烟花缅怀母亲

财经要闻

白酒大逃杀

汽车要闻

轴距加长/智驾拉满 阿维塔07L定位大五座SUV

态度原创

旅游
时尚
本地
健康
教育

旅游要闻

京西又开了一座新博物馆,展现永定河畔的农耕文化

今年最好看的衬衫竟然是它?太减龄了!

本地新闻

用苏绣的方式,打开江西婺源

干细胞能让人“返老还童”吗

教育要闻

高校争开新增本科新专业,内幕来啦

无障碍浏览 进入关怀版