我正在阅读关于散列排序比较的性能,快速排序如下面的Nutshell中的Algorithims。
https://www.safaribooksonline.com/library/view/algorithms-in-a/9780596516246/ch04s08.html
有26个桶,一旦n> 256,Hash排序开始翻两倍 性能随着问题的大小增加一倍,显示出多少桶 导致O(n ^ 2)表现。
n 26 buckets 676 buckets quick sort 256 0.000051 0.000062 0.000045 512 0.000108 0.000093 0.000098
注意,n是输入的数量,时间以秒为单位。
我的问题作者是什么意思"灰烬排序开始使其性能翻两番,因为问题规模增加了一倍"从上面的数据?,以及如何用很少的桶,它是O(n ^ 2)
答案 0 :(得分:0)
有两种不同类型的哈希表:打开和关闭。看来你指的是开放。
在一个打开哈希表中,k"桶" (或"插槽"),每个存储桶通常实现为(单个)链接列表。空槽包含空指针。当多个条目散列到同一个槽(冲突)时,它们会在检查重复后附加到链表中[通常不会再次计算重复]。对于插入,对于退化情况,时间复杂度可以是O(1)到O(n)[见下文]。
让我们考虑一个带有n个条目和k个槽的开放哈希表。有可能导致退出的情况导致O(n)进行 单 查找,例如当所有条目都散列到同一个插槽时,散列表的行为就像一个无序的链表。如果n>>,即使散列函数或多或少均匀地将数据分开。 k然后单个查找的时间复杂度 是O(n / k),但由于k是常数,因此它与O(n)相同。
我可以设想O(n ^ 2)行为的唯一方法是在 多个 查找的上下文中。我认为,这是查看哈希表时间复杂度的非标准方法。但是,如果我的观点是在n次插入后查看一批n次查找,在退化的情况下,我认为批次复杂性可以被视为O(n ^ 2)。
BTW,避免第二次退化情况的一种常见方法是,当n增长大于(初始)k时,将插槽(桶)的数量加倍并重新散列。调整散列(调整大小)散列的操作需要O(n)时间,并且需要动态散列函数,该函数可以使其输出范围加倍。此操作随着时间的推移摊销,导致O(log(n))摊销插入 - 优点是可以保留O(1)摊销查询。