[英]Maintaining sort while changing random elements
我遇到了这个问题,我需要有效地删除列表/数组中的最小元素。 那将是相当微不足道的解决-堆就足够了。
但是,现在的问题是,当我删除最小的元素时,它将导致数据结构中其他元素的更改,这可能导致顺序更改。 一个例子是这样的:
我有一系列元素:
[1,3,5,7,9,11,12,15,20,33]
当我从数组“ 5”和“ 12”中删除“ 1”时,分别更改为“ 4”和“ 17”。
[3,4,7,9,11,17,15,20,33]
因此,不维持订购。
但是,被删除的元素将具有指向将要更改的所有元素的指针,但是尚不知道将更改多少元素以及更改多少。
所以我的问题是:
当从数据结构中删除最小的元素并保持排序时,存储这些元素以最大化性能的最佳方法是什么? 还是我应该不做任何排序?
我当前的实现方式是将它们不排序地存储在向量中,因此时间复杂度为O(N ^ 2),O(N)(用于查找最小元素)和N个移除。
如果您拥有有序列表L中所有已更改元素的列表M,
经历M,并且针对每个元素
如果仍然与M的邻居一起订购,那就活着吧。
如果与邻居不符,则将其从M中排除。
这样的排除元素将创建一个列表N
N号
使用某种算法来合并有序列表。 http://en.wikipedia.org/wiki/Merge_algorithm
如果您确定新元素很少并且没有强烈更改,只需使用冒泡排序即可。
我仍然会去堆,并得到数组的支持
如果每次弹出后只有几个元素发生更改,请执行弹出操作后,对任何值减小的项目执行上/下堆放大。 它仍将是O(nlog k)值的顺序,其中k是数组的大小,n是已减小大小的元素的数量。
如果很多项目的大小发生变化,则可以将其视为未排序的数组,而仅从该数组创建堆的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.