【问题标题】:Maintaining sort while changing random elements在更改随机元素时保持排序
【发布时间】:2014-03-02 06:38:08
【问题描述】:

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

但是,现在的问题是,当我删除最小的元素时,会导致数据结构中其他元素的变化,这可能会导致顺序发生变化。一个例子是这样的:

我有一个元素数组:

[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 次删除。

【问题讨论】:

  • 有什么方法可以知道哪些元素会被改变或改变多少或改变多少?
  • 不知道有多少元素或它们将被更改多少,但第一个元素将具有指向那些将被更改的元素的指针。会把它放在问题中
  • 看来你需要的是带有“更改优先级”操作的堆
  • 您可能正在寻找Self-balancing binary search tree
  • @Quorrin:我不明白你对 Vaughn 堆的建议的反对意见——你显然已经在第一个元素中存储了指向依赖节点的指针,所以你不是已经有同样的问题了吗? (也就是说,无论您使用什么数据结构,这都不是问题吗?)指向堆位置的指针肯定会过时,但指向数组位置的指针也可能会过时。

标签: performance algorithm sorting sortedcollection


【解决方案1】:

答。

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

  • 遍历 M,并为每个元素

  • 如果它仍然与它的邻居在 M 中订购,那就活下去吧。

  • 如果不符合邻居的顺序,则将其从M中排除。

  • 这样被排除的元素会创建一个列表N

  • 订单号

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

B.

如果您确定新元素很少且变化不大,只需使用冒泡排序即可。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2013-02-09
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多