【发布时间】:2017-04-30 12:39:34
【问题描述】:
“因此,插入 N 个元素总共需要 O(N) 的工作量。每个插入平均为 O(1),尽管在最坏的情况下某些插入需要 O(N) 时间。”这句话可以在破解编码采访中找到。我有点理解这个说法,尽管它的一些小事让我很恼火。在好的日子里,摊销的插入是 O(1)。这仅仅意味着当可调整大小的数组不需要调整大小时,插入一些东西只是 O(1)。这很清楚。但是,在糟糕的一天,当我们用完空间时,我们需要 O(N) 来插入那个额外的元素。但是,我不同意上面的说法,因为它说在最坏的情况下某些插入需要 O(N)。不应该说,在最坏的情况下,一次插入需要 O(N)。
为了更清楚地说明这一点,这是我所说的一个例子。
假设我们有一个可调整大小的数组,但我们的数组大小为 4。现在假设插入 5 个元素,我们将有 O(1)、O(1)、O(1)、O(1),但是然后一旦我们到达最后一个元素,我们将不得不将所有这些人复制到一个新数组中,这个过程会给我们 O(N) 的成本。
谁能帮我澄清一下。我不明白为什么这本书说当我们在旧数组中运行空间时只需要将所有元素复制到一个新数组中时,某些情况会花费 O(N)。
【问题讨论】:
-
每次你需要调整数组的大小都是 O(N)。
-
在Constant Amortized Time看到这个答案
-
我不明白引用和你的理解有什么区别......这本书不是说完全相同的事情:在最坏的情况下插入可能是 O(N)
-
这本书说在 average 的情况下插入 N 个元素是 O(N)。或者换句话说,每个元素是 O(1)平均。要插入 5 个元素,您需要 O(1)、O(1)、O(1)、O(1)、O(6),但这与每个元素都是 O(2) 相同。实际上,无论你插入多少,它的平均值总是小于 O(3),这与 O(1) 相同。 (Big-O-notation 不是这样工作的,但它可能有助于直觉)。