我遇到过这个问题,我需要有效地删除列表/数组中的最小元素。这将是相当简单的解决 - 一堆就足够了。
但是,现在的问题是,当我删除最小的元素时,它会导致数据结构中其他元素的更改,这可能会导致更改排序。一个例子是:
我有一系列元素:
[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个删除。
答案 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是大小减小的元素数。
如果很多项目的大小发生变化,那么您可以将此视为一种情况,即您拥有一个未排序的数组,并且只需从数组中创建一个堆。