在保持要排序的数组的同时插入和删除数组中的元素

时间:2011-08-17 21:57:08

标签: c++ c sorting priority-queue

我想知道是否有人可以帮我解决这个问题。我正在使用C / C ++进行编程,我需要执行以下操作:

我得到一个包含浮点数的排序数组P(最大的第一个)。它通常具有非常大的尺寸..有时保持1000万像素图像的相关值。我需要迭代数组,直到它为空。在循环内,还有其他处理过程。

问题的要点是,在循环开始时,我需要从数组中删除具有最大值的元素,检查某些条件,如果它们成立,那么我需要将元素重新插入到数组中但是降低价值后。但是,我希望在重新插入后有效地对数组进行排序。

有人能指出我这样做的方法吗?我每次插入时都尝试过重新排序的天真方法,但这看起来真的很浪费。

6 个答案:

答案 0 :(得分:3)

更改数据结构。重复访问最大元素,然后快速插入新值,以便您仍然可以有效地重复访问最大元素,这是heap的作业,可能是fairly easily created from your array in C++

顺便说一句,请不要谈论“C / C ++”。没有这样的语言。相反,你会对你写作的东西产生模糊的含义,其中大部分都会让有经验的程序员感觉不好。

答案 1 :(得分:0)

您可以使用二进制搜索来确定从阵列中删除更改后的值的位置。请注意,在前面或中间的某处插入或移除也不是非常有效,因为它需要分别向上或向下移动具有更高索引的所有项目。

ISTM,在完成对原始数组的迭代后,您应该将已更改的项放入新数组并对其进行排序。如果内存存在问题,并且您确实需要执行某些操作,请更改适当的值并仅排序一次。

我想不出更好的方法来做到这一点。保持数组一直排序似乎效率很低。

答案 2 :(得分:0)

我会调查http://www.cplusplus.com/reference/stl/priority_queue/,因为它的目的是为了做到这一点。

答案 3 :(得分:0)

由于数组已经排序,您可以使用二进制搜索来查找插入更新值的位置。为此,C ++提供std::lower_boundstd::upper_bound,C提供bsearch。只需将所有现有值向上移动数组中的一个位置,并将新值存储在新清除的位置。

答案 4 :(得分:0)

如果您没有大幅度减少删除的值,那么这些伪代码可能会正常工作:

例如,假设您正在处理数组中具有最大值的元素,并说数组按降序排序(最大的第一个)。

  1. 删除array[0]

  2. newVal = array[0] - adjustment,其中adjustment是您减少价值的金额。

  3. 现在循环,仅调整您需要的值:

  4. 伪代码:

    i = 0
    while (newVal < array[i]) {
      array[i] = array[i+1];
      i++;
    }
    array[i] = newVal;
    swap(array[i], array[i+1]);
    

    同样,如果你没有大量减少删除的值(相对于数组中的值),这可以相当有效地工作。

    当然,通常更好的选择是使用更合适的数据结构,例如堆。

答案 5 :(得分:-1)

也许使用另一个临时数组可能会有所帮助。

这样您就可以先单独对“已更改”元素进行排序。

之后,只需将两个子数组的常规合并O(n)合并到临时数组,然后将所有内容复制回原始数组。