- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
http://en.wikipedia.org/wiki/Dynamic_array#Performance
具体是什么意思?
我认为在末尾插入将是 O(n),因为您必须分配原始数组空间的两倍,然后将所有项目移动到该位置并最终插入项目。这个 O(1) 怎么样?
最佳答案
摊销 O(1) 效率意味着 n 次插入的运行时间总和将为 O(n),即使任何单个操作可能需要更长的时间。
你是绝对正确的,附加一个元素可能需要 O(n) 的时间,因为复制所有东西需要做的工作。然而,因为数组每次扩展都会加倍,昂贵的加倍步骤发生的频率越来越低。因此,在 n 个插入中完成的总工作量为 O(n) 而不是 O(n2)。
详细说明:假设你要插入总共n个元素。调整向量大小时复制元素的总工作量最多为
1 + 2 + 4 + 8 + ... + n ≤ 2n - 1
这是因为首先你复制一个元素,然后是那个元素的两倍,然后是那个元素的两倍,等等,在绝对最坏的情况下复制所有 n 个元素。这个几何系列的总和为 2n - 1,因此最多 O(n) 个元素在所有复制步骤中移动。由于您进行了 n 次插入,并且只有 O(n) 的总工作量在所有操作中进行复制,因此每个操作的分摊效率为 O(1)。这并不是说每个操作都需要 O(1) 时间,而是说 n 个操作总共需要 O(n) 时间。
对于这背后的图形直觉,以及将数组加倍而不是仅少量增加的基本原理,您可能需要查看 these lecture slides .最后的图片可能非常相关。
希望这对您有所帮助!
关于algorithm - 当维基百科说在动态数组末尾插入一个项目的复杂性是 O(1) 摊销时,它是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307787/
我只是想在继续之前向某人确认我走在正确的轨道上。问题指出,当我想向已经满的数组添加新元素时,我必须“在 O(1)(amortized) 中扩展数组”。 这是不是说每次我将一个新元素插入到完整列表中时,
我试图从复杂性的角度更好地理解哈希表和字典在 C# 中的工作方式(但我想语言不是一个重要因素,这可能只是一个理论问题)。 我知道如果 Count 小于容量(这有点明显)。 不过,让我们看看这段代码:
我是一名优秀的程序员,十分优秀!