SiftDown算法比较次数

时间:2016-06-03 10:48:20

标签: algorithm computer-science correctness computer-science-theory

我最近使用用于构建二进制堆的siftDown算法。在练习6.5中的“算法和数据结构:基本工具箱”一书中,声明该算法的给定实现需要2*log(n)个元素比较。现在,我试图弄清楚为什么会这样,但我不能。为什么这是正确的?

1 个答案:

答案 0 :(得分:2)

调用private static Logger logger; static { try { // you need to do something like below instaed of Logger.getLogger(....); logger = LogManager.getLogger(ResourceService.class); } catch (Throwable th) { throw new HRException("Cannot load the log property file", th); } } 时,首先执行两个元素比较:

  • 第一个是在siftDown(i)h[2i]之间。
  • 第二个介于h[2i+1]h[i]之间。

进行两次比较后,您递归调用h[m] siftDown(m)m=2i。也就是说,每次调用带有m=2i+1元素堆的siftDown()都会导致进行两个元素比较,并调用带有n元素堆的siftDown()

因此,使用n/2元素堆调用T(n)时所做的比较次数siftDown()满足:

n

这种递归关系的解决方案是

T(n) = 2 + T(n/2)

通过观察每次正好进行2次元素比较,并且次数为T(n) = 2logn (因为如果你从{开始),您可以看到上述关系解决了2logn。 {1}}并且一遍又一遍地除以2,在logn分割之后你就完成了。

因此,n所做的元素比较总数约为logn