我想知道是否有人可以帮我解决这个问题。我正在使用C / C ++进行编程,我需要执行以下操作:
我得到一个包含浮点数的排序数组P(最大的第一个)。它通常具有非常大的尺寸..有时保持1000万像素图像的相关值。我需要迭代数组,直到它为空。在循环内,还有其他处理过程。
问题的要点是,在循环开始时,我需要从数组中删除具有最大值的元素,检查某些条件,如果它们成立,那么我需要将元素重新插入到数组中但是降低价值后。但是,我希望在重新插入后有效地对数组进行排序。
有人能指出我这样做的方法吗?我每次插入时都尝试过重新排序的天真方法,但这看起来真的很浪费。
答案 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_bound
或std::upper_bound
,C提供bsearch
。只需将所有现有值向上移动数组中的一个位置,并将新值存储在新清除的位置。
答案 4 :(得分:0)
如果您没有大幅度减少删除的值,那么这些伪代码可能会正常工作:
例如,假设您正在处理数组中具有最大值的元素,并说数组按降序排序(最大的第一个)。
删除array[0]
。
设newVal = array[0] - adjustment
,其中adjustment
是您减少价值的金额。
现在循环,仅调整您需要的值:
伪代码:
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)合并到临时数组,然后将所有内容复制回原始数组。