zoukankan      html  css  js  c++  java
  • Algs4-2.4.7大堆中第k大元素所在的位置(满树时,非满树未解决)

    2.4.7在堆中,最大的元素一定在位置1上,第二大的元素一定在位置2或者3上。对于一个大小为31的堆,给出第k大的元素可能出现的位置和不可能出现的位置,其中k=2、3、4(设元素值不重复)。
    解:
    堆是满树时:
    堆有f层,f=log(n+1)。以任意结点为根的子树都是满树,以第k大结点为根的子树的最高满子树有fc层,fc=下取整(log(n-k+1+1)),那么第k大结点在堆中的最高层为ftop,ftop=堆层f-最高满子树层fc+1=f-fc+1。
    图片

    第k大结点在堆中沿简单路径放置时,最低可以放在第k层,由于堆只有f层,所以第k大结点所在的最低层fbot=min(k,f)。
    图片

    那么第k大元素所在的层fk的范围是:ftop<=fk<=fbot。

    第k大元素可以在其所在层的任意位置上放置,这个可以通过交换其兄弟子树的位置 和 其层层父结点的子树和其层层父结点兄弟的子树的方式得到。
    图片

    那么最终得到在堆是满树时,第k大元素可以放在fk层的所有位置,位置pk的范围为:2^ftop<=pk<2^fbot
    图片

    excel表计算结果如下:
    图片
    公式说明:
    最顶层=CEILING(LOG(2*($B$1+1)/($B$1-A3+2),2),1)
    最底层=MIN(A3,LOG($B$1+1,2))
    开始位置=POWER(2,B3-1)
    结束位置=POWER(2,C3)-1

    堆不是满树时:
    分析不出。




  • 相关阅读:
    Finder 的分栏显示模式宽度调整
    IBAction作用相当于void,NSLog(@"被调用的方法名是%s",__func__);
    Trapping Rain Water
    Binary Tree Preorder Traversal
    Valid Parentheses
    Reverse Words in a String | LeetCode OJ | C++
    Gas Station|leetcode 贪心
    两个字符串“相等”
    Binary Tree Zigzag Level Order Traversal
    Add Binary
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9868616.html
Copyright © 2011-2022 走看看