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