【问题标题】:hash sort comparision with quick sort哈希排序与快速排序的比较
【发布时间】:2015-07-06 00:29:00
【问题描述】:

我正在阅读有关哈希排序与快速排序的性能比较,如下面的 Algorithims in Nutshell。

https://www.safaribooksonline.com/library/view/algorithms-in-a/9780596516246/ch04s08.html

对于 26 个桶,一旦 n >256,哈希排序开始将它的四倍 问题大小翻倍时的性能,显示桶太少 导致 O(n^2) 性能。

n 26桶676桶快速排序 256 0.000051 0.000062 0.000045 512 0.000108 0.000093 0.000098

注意,n是输入的数量,时间以秒为单位。

我的问题是作者所说的“随着问题大小翻倍,灰排序开始使其性能翻两番”是什么意思?

【问题讨论】:

  • 它获得了 4 倍更好的性能和 2 倍的数据排序......!?有了更多的上下文,我们也许可以澄清更多......
  • @deceze 我在上面添加了一个链接,你能用数据解释一下如何用 2x 数据提高性能。
  • 链接后的段落是直接引自那本书。请相应地格式化。我已经尝试过两次自己进行编辑,但您同时进行了与我发生冲突的其他编辑。
  • 嗯,加上上下文,听起来“四倍性能”意味着它变慢了 4 倍。我想说的措辞有点尴尬/不正确。
  • 这个:empirical orders of growth。但您的数据显示约 n^1.1(对于 26 个桶和 qsort),而不是 n^2?

标签: algorithm sorting quicksort


【解决方案1】:

有两种不同类型的哈希表:开放式和封闭式。看来您指的是打开。

在具有 k 个“桶”(或“槽”)的开放式哈希表中,每个桶通常实现为(单个)链表。空槽包含一个空指针。当多个条目散列到同一个槽(冲突)时,它们会在检查重复项后附加到链表中[通常不会再次计算重复项]。对于插入,对于退化情况,时间复杂度可以是 O(1) 到 O(n) [见下文]。

让我们考虑一个有 n 个条目和 k 个槽的开放哈希表。可能有退化的情况导致 single 查找的 O(n),例如,当所有条目散列到同一个槽时,散列表的行为像一个无序列表。即使散列函数或多或少均匀地隔开数据,如果 n >> k 则时间复杂度 对于单个查找 是 O(n/k),但由于 k是一个常数,这与 O(n) 相同。

我可以设想 O(n^2) 行为的唯一方法是在 multiple 查找的上下文中。我相信,这是一种查看哈希表时间复杂度的非标准方式。但是,如果一个人的观点是在 n 次插入之后查看一批 n 次查找,在退化的情况下,我认为批量复杂度可以被视为 O(n^2)。

顺便说一句,避免第二种退化情况的常用方法是将槽(桶)的数量加倍,并在 n 增长大于(初始)k 时重新散列。这种调整(增大)散列大小的操作需要 O(n) 时间,并且需要一个动态散列函数,可以使其输出范围加倍。此操作会随着时间的推移而摊销,从而导致 O(log(n)) 摊销插入 - 优点是可以保留 O(1) 摊销查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多