Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 更改随机元素时保持排序_Performance_Algorithm_Sorting_Sortedcollection - Fatal编程技术网

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

Performance 更改随机元素时保持排序,performance,algorithm,sorting,sortedcollection,Performance,Algorithm,Sorting,Sortedcollection,我遇到了这个问题,我需要有效地删除列表/数组中最小的元素。这将是相当容易解决的问题——一个堆就足够了 然而,现在的问题是,当我删除最小的元素时,它将导致数据结构中其他元素的更改,这可能导致顺序的更改。例如: 我有一个元素数组: [1,3,5,7,9,11,12,15,20,33] 当我从数组中删除“1”时,“5”和“12”分别被更改为“4”和“17” [3,4,7,9,11,17,15,20,33] 因此,不会维持顺序 但是,被删除的元素将具有指向所有将被更改的元素的指针,但是不知道将更改多

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

然而,现在的问题是,当我删除最小的元素时,它将导致数据结构中其他元素的更改,这可能导致顺序的更改。例如:

我有一个元素数组:

[1,3,5,7,9,11,12,15,20,33]
当我从数组中删除“1”时,“5”和“12”分别被更改为“4”和“17”

[3,4,7,9,11,17,15,20,33]
因此,不会维持顺序

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

所以我的问题是:

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

我当前的实现只是将它们未排序地存储在一个向量中,因此时间复杂度为O(N^2)、O(N)用于查找最小元素,以及N次删除。 如果您拥有有序列表L中所有已更改元素的列表M

  • 通过M,对于每个元素

  • 如果它的邻居仍然以M为单位订购,那么就让它活下去

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

  • 这些被排除的元素将创建一个列表N

  • 订单

  • 使用一些算法来合并有序列表

B
如果您确信新元素很少且没有强烈更改,那么只需使用冒泡排序。

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

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


如果很多项目的大小发生变化,那么你可以把它看作是一个没有排序的数组,你只需要从数组中创建一个堆。但是第一个元素将具有指向那些将被更改的元素的指针。Will将其放入问题中似乎您需要的是具有“更改优先级”操作的堆您可能正在寻找一个新的堆。@Quorrin:我不理解您对Vaughn关于堆的建议的反对意见--您显然已经在第一个元素中存储了指向依赖节点的指针,所以您不也有同样的问题吗?(也就是说,不管您使用的是什么数据结构,这不是一个问题吗?)指向堆位置的指针肯定会过时,但指向数组位置的指针也会过时。