上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

建堆时间复杂度为什么是NlogN

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-23 20:18:13 | 显示全部楼层 | 阅读模式
    建堆时间复杂度为什么是NlogN
    首先有一个数组,长度为N,全部插入到堆中
    复杂度是NlogN,今天朋友问的时候突然产生怀疑了
    插入第一个是log1,第二个是log2,最后一个是logN
    那么最后的结果应该是log(N!),根据经验可知log(N!)=NlogN
    但是为什么?
    于是决定抽空认真研究一下
    首先可知复杂度为
    log1 + log2 + log3 + log4 + ... + log n
    因为
    log(a*b) = log(a) + log(b)
    所以
    log1 + log2 + log3 + log4 + ... + log n = log(1 * 2 * 3 *.... n)  = log(n!)
    首先确定n的上界
    log1 + log2 + log3 + log4 + ... + log n <= log n + log n + log n + log n + ... + log n
                                                                       =n*log n
    接下来将n分为两个n/2,同时不计入前部分n/2,只计算后半部分的n/2得出
    log(n!) >= log (n/2) + log (n/2 +1) + log (n/2 +2) + log (n/2 +3) + .... + log (n)
    将所有的项都替换为最小项也就是n/2,得出
    log(n!) >=  log (n/2) +  log (n/2) +  log (n/2) +  log (n/2) + .... + log (n/2)
                   = n/2 *  log (n/2)
    根据公式  log (M/N) = log M - log N
    n/2 *  log (n/2) = n/2 * (log n  - log 2)
    而log 2 = 1,可得
    n/2 * (log n  - log 2) = n/2 * (log n  - 1) = n/2 * log n - n/2
    得出 log(n!)  >= n/2 * log n - n/2
    我们想要证明它大于n log n的倍数,由于n/2 * log n - n/2 小于 n/2 * log n
    我们需要选择一个小于1/2的倍数,例如1/4,为了证明
    n/2 * log n - n/2 >=  n/4 * log n
    我们假设n>=4,则可得出
    log n >=2
    1/4 * log n >= 1/2
    n/4 * log n >= n/2
    n/4 * log n -  n/2 = 0
    左右各加n/4 * log n可得
    n/2 * log n - n/2>= n/4 * log n
    由于 log(n!)  >= n/2 * log n - n/2 则
    log(n!)  >= n/4 * log n  则可得出
    n/4 * log n <= log(n!) <= n log n
    时间复杂度可以约去系数,由此可得时间复杂度上log(N!)=N log N
    可得堆插入时间复杂度为NlogN


    参考资料
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 363 天

    [LV.8]以坛为家I

    7

    主题

    30

    回帖

    246

    积分

    高级工程师

    积分
    246

    挑战者 lv2

    发表于 2023-11-23 22:09:57 | 显示全部楼层
    哥哥牛逼
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-23 22:13:01 | 显示全部楼层

    谢谢哥哥,花了一下午证明就为了这句话!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-24 11:58
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    8

    回帖

    11

    积分

    助理工程师

    积分
    11

    油中3周年新人报道油中2周年挑战者 lv1喜迎中秋

    发表于 2023-11-24 13:12:11 | 显示全部楼层
    哥哥好卷 哥哥好牛逼
    回复

    使用道具 举报

    发表回复

    本版积分规则

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