Edit:您可以假设hashtable使用基本链接,其中元素位于相应链表的末尾。我的真正问题是关于概率算法的摊销分析。
编辑2:我在quicksort上发现了这篇文章,“摊销运行时间和预期运行时间之间有一个微妙但重要的差异。使用随机枢轴的quicksort的预期运行时间为O(n log n),但其最坏的运行时间为θ(n^2)。这意味着quicksort的成本很小,但随着n的增加,这种可能性接近于零。”我想这大概回答了我的问题。
理论上,每次插入都可能发生冲突,但这意味着哈希函数的性能很差,无法在键的“桶”之间空出值。一个理论上完美的哈希函数总是将一个新值放入一个新的bucket,这样每个键都将引用它自己的bucket。(我假设是一个链式哈希表,并将链字段称为“bucket”,这正是我所学到的)。理论上最坏的情况是,函数会将所有的键插入同一个桶中,从而在该桶中形成长度为n的链。
摊销背后的思想是,给定一个相当好的散列函数,您最终应该得到一个线性的插入时间,因为插入>O(1)的次数与插入简单和O(1)的次数相比会大大相形见绌。这并不是说插入不需要任何计算(散列函数仍然需要计算,在某些特殊情况下,散列函数的计算量可能比仅仅查看列表更大)。
最后,这给我们带来了big-O中的一个重要概念,即在计算时间复杂度时,需要查看最频繁执行的操作。在本例中,即插入与另一个哈希不冲突的值。
问题内容: 是否真的计算了PHP数组的所有元素,还是将此值缓存在某个地方并被获取? 问题答案: 好吧,我们可以看看源代码: call ,这反过来又需要非递归数组,该数组是通过以下方式实现的: 所以你可以看到,它的。
根据下面引号中的规范,实现了一个队列(该语言使用Ruby,但希望每个人都能读懂)。 使用堆栈实现队列。也就是说,只使用push和pop操作来写入队列和出队列。 就性能而言,enqueue应该是O(1),但dequeue在最坏的情况下可能是O(n)。从时间上看,出队时间应为O(1)。证明您的解决方案实现了这一点。 我在想,你怎么证明排队的摊销时间?谢了!
问题内容: 与渐进分析有何不同?您何时使用它,为什么? 我读过一些写得不错的文章,例如: http://www.ugrad.cs.ubc.ca/~cs320/2010W2/handouts/aa-nutshell.pdf http://www.cs.princeton.edu/~fiebrink/423/AmortizedAnalysisExplained_Fiebrink.pdf 但我仍然没有完
问题内容: 当我们使用a 来存储数据时,据说搜索需要o(1)时间。我很困惑,有人可以解释吗? 问题答案: 好吧,这 只是 个谎言-可能需要更长的时间,但通常不会。 基本上,哈希表是一个包含所有要搜索的键的数组。每个键在数组中的位置由 哈希函数 确定, 哈希函数 可以是始终将同一输入映射到同一输出的任何函数。我们将假设哈希函数为O(1)。 因此,当我们在哈希表中插入内容时,我们使用哈希函数(将其称为
问题内容: 为什么ArrayList的add()和add(int index,E)复杂度要按固定时间摊销? 为什么不对单个add()操作使用O(1),对单个add(int索引,E)操作使用O(n),而对于使用任一(任何)添加方法添加n个元素(n个添加操作)的O(n)呢?假设我们很少使用add(int index,E)添加到数组末尾? 数组(和ArrayList)的操作复杂度已经不是n个元素了: a
Wikipedia页面上关于二进制堆的声明是,在最坏的情况下插入是O(log n),但平均为O(1): 链接的页面试图如下说明: 但是,平均来说,新插入的元素在树中并不会移动很远。特别是,假设密钥分布均匀,它有一半的机会大于其父项;它有二分之一的机会比它的祖父母更大,因为它比它的父母更大;它有一半的机会比它的曾祖父母大,因为它比它的父母大,依此类推[...]因此在一般情况下插入需要恒定的时间 不过