从数组中删除第i个元素,因此时间复杂度不依赖于数组大小

时间:2016-05-19 17:35:07

标签: arrays algorithm time-complexity

昨天我参加了我的问题分析算法考试   描述如何在阵列上实现以下每个操作,以便花费的时间不依赖于数组大小n。

  • 删除大小为n的数组的第i个元素。

  • 删除数组保留的排序数组的第i个元素 删除后的排序顺序。

对于第一部分,我们可以将第i个值与最后一个值交换,这就是我写的内容,而为排序数组执行此操作将不起作用,因为数组将被取消排序。 现在的问题是,如何为排序数组实现这个?有没有任何缺点可以做到这一点?我们能以更好的方式为未排序的数组做到吗?

3 个答案:

答案 0 :(得分:2)

我认为这个问题的目的是让你了解数组和列表之间的区别。在前者中,您具有任意访问权限,但删除和添加将需要转移索引。但是,在列表中,一旦到达节点,就可以在恒定时间内添加/删除节点。但是,由于您没有任意访问权限,因此达到O(n)。如果这是你的问题制定者的想法,我认为他/她希望你创建一个像List这样的数据结构,但是有索引 - 比如Java的ArrayList。

但是,您也可以通过简单地保留已删除的索引列表来解决此问题。如果要删除array [i],只需保留一个新列表" deletedIndices"并添加" i"它。因此,删除将花费恒定的时间和空间。没有必要添加哨兵。

编辑:为了回答你关于我的评论的问题,不,跳过不会花费O(n)。这是一个简单的列表更新。此外,即使它不是问题所在,但值得知道的是,数组的所有未来遍历都需要遍历新列表以及知道何时跳过。如果列表始终保持排序,则可以有效地完成此操作。我们可以通过简单地遍历列表一次来确定放置新传入对象的位置。这将需要O(n)。总而言之,删除发生在恒定时间内,但遍历仍将采用O(n)+ O(n)= O(n) - 原始数组遍历的第一个大哦,列表遍历的第二个

答案 1 :(得分:0)

用特殊符号替换 i 元素,该符号不能是数组元素的值(例如,0表示正数数组)以标记 i 空位。 (此方法有时称为“延迟删除”。)

答案 2 :(得分:0)

a。。将ith元素替换为最后一个元素并减少数组 大小乘1。

b。。将ith元素替换为不能为值的特殊符号 数组元素的值(例如,对于正数数组为0)以标记 第i个位置为空。 (这种方法有时称为“惰性 删除”。)