Algorithm 向该结构插入元素的摊销时间复杂度是多少?

Algorithm 向该结构插入元素的摊销时间复杂度是多少?,algorithm,data-structures,heap,time-complexity,amortized-analysis,Algorithm,Data Structures,Heap,Time Complexity,Amortized Analysis,假设使用数组实现堆,并且每次数组已满时,都将其复制到一个大小为其两倍的数组中。将元素插入堆的摊销时间复杂度(最坏情况下)是多少 我认为我们有T(n)=n*n(这是最坏情况下n个操作序列的总成本的上界),然后根据一个公式的摊销复杂性是T(n)/n=n^n/n=n 但我认为这是非常错误的,因为直觉很清楚,我应该得到log(n)或更低。。。那么我应该如何计算呢?想象一下,您将n个元素插入到以这种方式表示的堆中。您需要考虑两种不同的成本来源: 堆操作的成本,忽略底层数组的大小调整 阵列的成本会调整大小,

假设使用数组实现堆,并且每次数组已满时,都将其复制到一个大小为其两倍的数组中。将元素插入堆的摊销时间复杂度(最坏情况下)是多少

我认为我们有
T(n)=n*n
(这是最坏情况下n个操作序列的总成本的上界),然后根据一个公式的摊销复杂性是
T(n)/n=n^n/n=n


但我认为这是非常错误的,因为直觉很清楚,我应该得到
log(n)
或更低。。。那么我应该如何计算呢?

想象一下,您将n个元素插入到以这种方式表示的堆中。您需要考虑两种不同的成本来源:

  • 堆操作的成本,忽略底层数组的大小调整
  • 阵列的成本会调整大小,而忽略总体堆操作
  • (1)在n个总操作中的成本是O(n logn),因为每次堆插入都需要时间O(logn)

    对于(2)的成本,请注意,将数组大小加倍所做的功与加倍时数组的大小成正比。这意味着您将执行1个工作单位将数组从大小1翻倍,执行2个工作单位将数组从大小2翻倍,执行4个工作单位将数组从大小4翻倍,等等。这意味着完成的总工作是

    1+2+4+8+16+…+21+对数n≤ 4n-1=O(n)

    这个数学计算使用了这样一个事实,即在数组达到大小n之前,最多只需将数组加倍1+logn次,而1+2+4+8+…+2k=2k+1-1。这意味着,在所有n个插入中,您所做的O(n)工作使阵列加倍


    总的来说,在n个操作中完成的总工时为O(n logn),因此每个操作的摊销成本为O(logn)。

    Offtopic。这不是一个编程问题。为什么?这里有一个数据结构标签和许多类似的问题。我想你弄错了唯一我不同意(或不理解)的部分是
    ,我知道调整大小的成本是O(n)。我的问题是,计算摊销时间复杂度的公式是什么?最坏情况下的摊销时间复杂度意味着什么?@user3386109因为所有结果都是O(n),所以我只是给出了一个很好且宽松的上限。@UFCInsider本身没有“公式”。您只需将所有操作完成的总工时相加,然后除以操作数即可。“摊余最坏情况”成本将是可完成的最大工作量除以作业数量。