📣 独立日限时特惠: VIP通行证立减$68
查看: 8658| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

【LintCode, heap】为什么Heapify这题的时间复杂度是O(n)?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
题目要求和解题代码请见附件贴图。
我想请问一下大家,程序的主函数是一个for循环,调用到的siftdown函数里面是一个while循环。
为什么还可以在O(n)的时间复杂度里完成呢?
更多图片 小图 大图
组图打开中,请稍候......

上一篇:面试可以用python吗
下一篇:求lc Paint House II的O(nk)解法
推荐
ericliu03 2015-8-20 00:06:45 | 只看该作者
全局:
楼主看这里:https://en.wikipedia.org/wiki/Binary_heap#Building_a_heap

中心思想是:首先把head想做树,如果从下往上数(倒数)第h层的所有点已经是heapified的了,那么让倒数第h+1层的一个点heapify所需要的操作数最多是h步(最坏情况,最小堆里这个数是最大的,所以需要把它一层一层往下转移直到最底层)。所以对每一个h+1层的点(node)来说,复杂度O(h)。h+1层有这么多点:n/2^(k+1),所以总得复杂度就是O(h) * (n/2^(k+1)) 再对所有层数求和。最终结果就是个O(n)的。
具体公式请到wikipedia查看,注意这句:This uses the fact that the given infinite series h / 2h converges to 2.


评分

参与人数 1大米 +10 收起 理由
Sun + 10 好细致,非常清晰

查看全部评分

回复

使用道具 举报

推荐
ericliu03 2016-7-14 06:00:08 | 只看该作者
全局:
何打发123 发表于 2016-7-9 10:14
你好~ 想请问一下~ 如果按照这个道理 为什么siftup就是nlogn 呢? 我觉得道理是一样的啊。。 想不明白 T T

这个siftup其实是那个straight forward的算法
每拿出来一个数放进数组(可以想象成queue)的最后,然后和他的father比较大小。
对于每个数是log(n)的时间(worst case)总共有n个数

道理确实是一样的,intuitively,不同的地方在于:假设h代表第几层,你的方法随着h增加,每层的点数也在增加,h最大的时候,也就是switch有可能最多的时候,点数是一层是2^h个点。但是lz得方法随着h的增加(倒数),每层的点数在减小,h最大的时候只有一个点。
回复

使用道具 举报

🔗
何打发123 2016-7-9 10:14:22 | 只看该作者
全局:
你好~ 想请问一下~ 如果按照这个道理 为什么siftup就是nlogn 呢? 我觉得道理是一样的啊。。 想不明白 T T
回复

使用道具 举报

🔗
何打发123 2016-7-14 23:37:55 | 只看该作者
全局:
ericliu03 发表于 2016-7-14 06:00
这个siftup其实是那个straight forward的算法
每拿出来一个数放进数组(可以想象成queue)的最后,然后 ...

soga!  谢谢你的解释!虽然我没法严格的推导出来 但是有了个一个大概的意思了  感谢你啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表