Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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
C++ 在向量中查找对的最快方法是在迭代时删除它_C++_Algorithm_Search - Fatal编程技术网

C++ 在向量中查找对的最快方法是在迭代时删除它

C++ 在向量中查找对的最快方法是在迭代时删除它,c++,algorithm,search,C++,Algorithm,Search,我目前正在研究一种贪婪算法,类似于活动选择问题。我得到了成对向量(自然数),按第二个值排序。对于每一对,我取可能最接近的一对(最接近我的意思是(p2.first-p1.second)最小,p1.second

我目前正在研究一种贪婪算法,类似于活动选择问题。我得到了成对向量(自然数),按第二个值排序。对于每一对,我取可能最接近的一对(最接近我的意思是(p2.first-p1.second)最小,p1.second 下面是一个例子。每列是对的索引,每行是对的范围。例如,对[0]=[0,3]。第一次迭代后,应将对[0]转换为[0,9],并删除第二列


很难说什么是做任何事情的“最快方式”。即使“足够快”也有问题,因为不知道您的约束条件。因此,我将给你一些建议,以获得一个(可能是)“更快”的程序;是否足够快由你决定

首先,您可能需要更改排序标准。您需要先对第一个组件进行排序,然后再对第二个组件进行排序,而不是对第二个组件进行排序(我假设是在间隔结束时)。这样,在数组中,开始越早的间隔越早,并且在具有相同开始的间隔中,最短的间隔将是第一个

其次,您可能希望有一个助手数据结构:一个自然排序的对数组,其中每对的第一个组件是任意数字X,第二个是从X开始的(排序的)原始数组中第一对的索引。例如,您问题中图像的这个数组将是{{0,0},{4,1},{9,2}。不难看出如何在O(n)中构造这个数组,以及如何使用它将搜索速度从原始数组加速到摊销O(1)

第三,要迭代一个
std::vector
,并毫无问题地删除它的元素,可以使用索引而不是迭代器。但是,这并不是特别有效,因为每个
擦除
必须向后移动相当多的元素,甚至可能重新分配向量并复制/移动其所有元素。取而代之的是,做你现在正在做的事情,并用不同的数字标记那些你想要删除的元素,在你的算法完成后,只需再次检查数组并将它们全部删除。以下是一个伪代码:

displacement = 0
for all elements in the array, do:
    if current element should be removed, then:
        increment "displacement"
    else:
        move current element back "displacement" places

delete last "displacement" elements
编辑:阅读您的评论后,您不需要这些东西。只需按照我上面写的方式对数组或对进行排序(即按字典顺序),然后从中构建另一个对数组,如下所示:

let original vector be A, and the new vector of pairs be B,
t0 = -1
t1 = -1
for all elements in A, do:
    if start time of current element is greater than "t1", then:
         append the pair (t0, t1) to B
         t0 = start time of current element
         t1 = end time of current element
    else:
         t1 = max(t1, end time of current element)
append the pair (t0, t1) to B
remove first element of B (because it is (-1, -1))
(我的方式并不十分优雅,但它完成了任务。)


然后在此新阵列上运行成本计算逻辑,B。此新阵列将更短,并且其元素之间不会有重叠。

是否要计算最大重叠?如果不是,那么你想计算什么?换句话说,这看起来像是.std::vector::erase(迭代器)将返回下一个有效迭代器。因此,不能使用基于范围的循环。或者作为迭代器的开始/结束循环不能在erase时递增,而是设置为erase()方法的返回值。我通常使用while循环,在决定擦除的if()条件下,将迭代器设置为erase()方法的返回值,并在else分支中简单地递增迭代器。