动态数组中的删除
Deletion in dynamic array
谁能解释一下(删除以动态数组结尾)的时间复杂度?
我认为答案是O(1)
但书中提到 O(n).
由于我们谈论的是动态数组,即能够 add/remove 元素 to/from 的数组,因此有两种可能的解决方案来实现动态数组:
您分配足够 的内存来容纳所有当前和未来的元素。此外,您需要知道最后一个可能的索引。使用此设置,删除最后一个元素的复杂度为 O(1),因为您只需递减最后一个索引。但是,删除非最后一个元素具有线性复杂性,因为在递减最后一个索引之前,您需要将所有后面的元素复制到前面的元素。此外,您可能难以在分配时确定最大可能大小,这可能会导致溢出问题或内存浪费。
您可以使用列表来实现它。这样你就不知道最后一个元素的地址是什么,所以你需要迭代你的列表直到倒数第二个项目然后释放最后一个项目的内存并将倒数第二个项目的下一个设置为指向零。由于书中提到删除最后一个元素的复杂度为 O(n),我们可以放心地假设动态数组是指第二个选项。
谁能解释一下(删除以动态数组结尾)的时间复杂度?
我认为答案是O(1)
但书中提到 O(n).
由于我们谈论的是动态数组,即能够 add/remove 元素 to/from 的数组,因此有两种可能的解决方案来实现动态数组:
您分配足够 的内存来容纳所有当前和未来的元素。此外,您需要知道最后一个可能的索引。使用此设置,删除最后一个元素的复杂度为 O(1),因为您只需递减最后一个索引。但是,删除非最后一个元素具有线性复杂性,因为在递减最后一个索引之前,您需要将所有后面的元素复制到前面的元素。此外,您可能难以在分配时确定最大可能大小,这可能会导致溢出问题或内存浪费。
您可以使用列表来实现它。这样你就不知道最后一个元素的地址是什么,所以你需要迭代你的列表直到倒数第二个项目然后释放最后一个项目的内存并将倒数第二个项目的下一个设置为指向零。由于书中提到删除最后一个元素的复杂度为 O(n),我们可以放心地假设动态数组是指第二个选项。