假设您使用一个数组实现了一个堆,并且每次数组满时,您都将其复制到一个数组,该数组的大小是数组的两倍。向堆中插入元素的摊销时间复杂度(对于最坏的情况)是多少?
我认为我们有t(n)=n*n
(这是最坏情况下n个操作序列总成本的一个上界),那么根据一个公式摊销的复杂度是t(n)/n=n^n/n=n
。
但我认为这是非常错误的,因为从直觉上很清楚,我应该得到log(n)
或更低……那么我应该如何计算这个呢?
假设您将n个元素插入到一个以这种方式表示的堆中。您需要考虑两种不同的成本来源:
(1)的成本是O(n log n),因为每个堆插入需要花费O(log n)的时间。
总体而言,跨n个操作完成的总工作量为O(n log n),因此每个操作的摊余成本为O(log n)。
问题内容: 我想知道Python中列表对象的pop方法的时间复杂度是多少(特别是CPython)。list.pop(N)的N值也会影响复杂度吗? 问题答案: 因为最后一个元素应该是O(1),因为您只需要返回数组中最后一个元素所引用的元素并更新最后一个元素的索引。我希望任意元素为O(N),平均需要进行N / 2次运算,因为您需要将任何元素移到要在指针数组中向上移一个位置的元素之外。
问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。
问题内容: 我在Java类中有一个私有的LinkedList,并且经常需要检索列表中的最后一个元素。列表需要缩放,所以我试图确定在进行更改时是否需要保留对最后一个元素的引用(以实现O(1)),或者LinkedList类是否已经通过getLast()调用完成了此操作。 LinkedList.getLast()的big-O成本 是多少 , 有记载吗? (即,我是否可以依靠此答案,或者即使它是O(1),
我对在LinkedList开头插入元素的时间复杂性感到好奇。我知道LinkedList本身会将现有元素向右移动一个索引,但要做到这一点,它会进行与列表中现有元素一样多的迭代吗? 另外,最好的方式是在开头插入offerFirst吗?
我偶然看到了这篇关于动态数组时间复杂性的文章,它澄清了很多。然而,我有一个基于案例的问题。假设我有一个总共有6个元素的动态数组,假设删除了第4个元素。在这种情况下,删除复杂度将是,这将是,因为最后两个元素只需要向上移动。这是正确的吗?我有一些文章给出了最坏情况下的复杂度,说如果删除最顶部的元素,那么时间复杂度将是。我找不到任何关于从中心移除/插入项目的内容。
问题内容: Java的PriorityQueue构造函数与的复杂度是多少?我使用了构造函数: 复杂度是O(n)还是O(n * log(n))? 问题答案: 从集合(甚至是未排序的集合)初始化a的时间复杂度为O(n)。在内部,它使用一个过程来就地“堆化”数组。(这在文献中也称为下推式)。 这是违反直觉的。似乎将元素插入到堆中是O(log n),所以插入n个元素会导致O(n log n)复杂性。如果您