dynamic-arrays - 动态数组中的移动次数

标签 dynamic-arrays

动态数组是一个大小加倍的数组,当一个元素被添加到一个已经满的数组时,将现有元素复制到一个新的位置 more details here .很明显会有ceil(log(n))批量复制操作。

我在教科书中看到过 Action 次数M以这种方式计算:
M=sum for {i=1} to {ceil(log(n))} of i*n/{2^i}与“一半元素移动一次,四分之一元素移动两次”的论点......

但我认为对于每个批量复制操作,复制/移动元素的数量实际上是 n/2^i ,因为每个批量操作都是通过达到和超过 2^i th 来触发的。元素,所以运动的次数是
M=sum for {i=1} to {ceil(log(n))} of n/{2^i} (对于 n=8,这似乎是正确的公式)。

在另一个论点中谁是对的,什么是错的?

最佳答案

两个版本都是 O(n) ,所以没有太大区别。

教科书版本将每个元素的初始写入计数为移动操作,但不考虑第一个元素,它将移动 ceil(log(n))次。除此之外,它们是等效的,即

(sum for {i=1} to {ceil(log(n))} of i*n/{2^i}) - (n - 1) + ceil(log(n))
  == sum for {i=1} to {ceil(log(n))} of n/{2^i}

n是 2 的幂。当 n 时两者相差不同的数量不是 2 的幂。

关于dynamic-arrays - 动态数组中的移动次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17465984/

相关文章:

objective-c - 为 Objective-C 静态数组动态分配长度

c++ - MPI 中的发送和接收数组

c - Structs的动态数组,删除元素

c++ - 指向结构的动态指针数组在成员变量赋值时抛出 SIGSEGV

generics - Ada:具有可变大小数组属性的对象

c++ - 如何编写适用于两个动态数组的 strcat 函数

c++ - 在 C++ 中删除二维动态数组时出现问题(最终存储在 vector 中)

Javascript 根据另一个下拉列表的另一个值从数组中填充下拉列表 :

c - 正确分配多维数组

vba - 如何将动态数组传递到 VBA 对象中。编译错误: Invalid use of property