A tight bound on the worst-case number of comparisons for Floyd's heap construction algorithm
Ioannis Paparrizos
备注:
This (full) paper was accepted for publication in the 37th International Conference on Current Trends in Theory and Practice of Computer Science (SOFSEM2011), 22-28 January 2011, Novy Smokovec, Slovakia (9 pages)
In this paper a tight bound on the worst-case number of comparisons for Floyd's well known heap construction algorithm, is derived. It is shown that at most 2n-2μ(n)-σ(n) comparisons are executed in the worst case, where μ(n) is the number of ones and σ(n) is the number of zeros after the last one in the binary representation of the number of keys n.
在论文“Fast Fibonacci heaps with worst case extensions”中,我们描述了具有Meld-DecreaseKey和DecreaseKey接口的堆,允许保证最坏情况渐近最优时间的操作。这篇文章旨在集中讨论DecreaseKey接口,但是如果不仔细阅读,很难将所描述的两种数据结构分开。本文的目标不是发明一种新的数据结构,而是以一种希望可读的形式描述一个相当简单的DecreaseKey版本。本文件不要求参考其他文件。
我们专注于减少堆的开销,基于与最佳最坏情况行为的比较。本文的灵感来自严格斐波那契堆[1],其中G. S. Brodal,G. Lagogiannis,和R. E. Tarjan用DecreaseKey和Meld接口在渐近最优的最坏情况下实现了堆(基于键比较)。在文献[2]中,详细阐述了这些思想,并表明可以用从先前比较中丢失更少信息的策略来实现相同的渐近时间。在这些堆中,违规列表的重复会产生很大的开销。我们提出了简单的替代减少这种开销。它允许我们实现快速摊销的斐波那契堆,用户可以在变体中调用一些方法,以避免最坏情况的时间。如果他这样做,堆不会被转换为Fibonacci,直到调用方法的摊销版本。当然,我们可以一直调用最坏情况下的版本,但是由于保证会产生开销,如果我们不关注单独操作的复杂性,那么调用摊销版本是首选。我们已经展示了,我们可以实现完整的DecreaseKey-Meld接口,但是Meld接口对于这些堆来说并不自然,所以如果不需要Meld,那么简单的实现就足够了。由于我不知道需要融合的应用程序,我们将集中在noMeld变体上,但我们将展示这些更改也可以应用于融合,包括变体。文献[1]、[2]表明堆可以在指针机模型上实现。对于快速的实际实现,我们宁愿使用数组。我们的目标是减少指针操作的数量。通过指向秩列表的指针来维护秩将是不必要的开销。
排序问题的两个最突出的解决方案是Quicksort和Mergesort。虽然快速排序平均速度非常快,但合并排序还提供了最坏情况的保证,但需要额外的空间来存储线性数量的元素。然而,最坏情况下的有效就地排序仍然是一个挑战:标准解决方案Heapsort存在缓存行为不佳的问题,并且对于缓存内实例来说也不是太快。在这项工作中,我们提出了中位数的中位数QuickMergesort(MoMQuickMergesort),QuickMergesort的一个新的变种,它结合了Quicksort与Mergesort允许后者实施到位。我们的新变体应用中位数的中位数算法选择枢轴,以规避二次最坏的情况。事实上,我们表明,它最多使用$n \log n + 1.6n$比较$n$足够大。我们通过实验证实了理论估计,并表明新算法的性能优于堆排序,并且仅比Introsort(stdlibc++的std::sort实现)慢10%左右,这对最坏情况的保证相当差。我们还模拟了最坏的情况,它只比平均情况慢10%左右。特别是,新算法是一个自然的候选人,以取代堆排序作为一个最坏情况下的塞子在Introsort。