在更改随机元素时保持排序

时间:2014-03-02 06:38:09

标签: performance algorithm sorting sortedcollection

我遇到过这个问题,我需要有效地删除列表/数组中的最小元素。这将是相当简单的解决 - 一堆就足够了。

但是,现在的问题是,当我删除最小的元素时,它会导致数据结构中其他元素的更改,这可能会导致更改排序。一个例子是:

我有一系列元素:

[1,3,5,7,9,11,12,15,20,33]

当我从数组“5”中删除“1”时,“12”分别变为“4”和“17”。

[3,4,7,9,11,17,15,20,33]

因此不保持排序。

但是,删除的元素将指向将要更改的所有元素,但不知道将更改多少元素以及更改多少元素。

所以我的问题是:

在保持排序的同时从数据结构中删除最小元素时,存储这些元素以最大化性能的最佳方法是什么?或者我应该保持未分类?

我目前的实现只是将它们存储在向量中,因此时间复杂度为O(N ^ 2),O(N)用于查找最小元素和N个删除。

2 个答案:

答案 0 :(得分:0)

如果您拥有有序列表L的所有已更改元素的列表M,

  • 通过M,并为每个元素

  • 如果仍在M中订购其邻居,请将其存在。

  • 如果与邻居不一致,请将其从M中排除。

  • 此类排除元素将创建一个列表N

  • 命令N

  • 使用某种算法合并有序列表。 http://en.wikipedia.org/wiki/Merge_algorithm

如果您确定新元素很少而且没有强烈改变,只需使用冒泡排序。

答案 1 :(得分:0)

我仍然会使用数组支持的堆

如果每次弹出后只有少数元素发生变化,执行弹出操作后,对任何值减少的项目执行heapify up / down。它仍将是O(nlog k)值的顺序,其中k是数组的大小,n是大小减小的元素数。

如果很多项目的大小发生变化,那么您可以将此视为一种情况,即您拥有一个未排序的数组,并且只需从数组中创建一个堆。