当前位置: 首页 > 知识库问答 >
问题:

在向量中查找对的最快方法,在迭代时将其删除

章高爽
2023-03-14

我目前正在研究一种贪婪算法,它类似于活动选择问题。我有对向量(自然数),按第二个值排序。对于每一对,我采取可能最接近的一对(最接近的意思是(p2.first - p1.second)是最小的,p1.second

下面是示例。每一列是对的索引,每行是对的范围。例如,对 [0] = [0,3]。在第一次迭代后,对 [0] 应转换为 [0,9],第二列应删除。

共有1个答案

钱凌
2023-03-14

真的很难说做任何事情的“最快方法”是什么。即使“足够快”在不知道你的约束的情况下也是有问题的。因此,我将为您提供一些技巧,以获得(可能)“更快”的程序;它是否足够快由您决定。

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

其次,您可能希望有一个帮助程序数据结构:一个自然排序的对数组,其中每个对的第一个分量是任意数字 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 上运行成本计算逻辑。这个新数组将更短,并且其元素之间不会有重叠。

 类似资料:
  • 问题内容: 有一个对象,是否有比列表理解更快,更好或更正确的方法来获取迭代器返回的对象的列表? 问题答案:

  • 现在,这段代码运行良好,该项从p对象和jlist中都被删除,但它在it.next()行抛出一个“ConcurrentModificationException”异常。 我怎么解决这个?

  • 问题内容: 如果要尝试在列表中查找某项的索引,则可以采用几种不同的方法来完成,这就是我所知道的最快的方法 另一种方式不是pythonic且速度较慢 第一种方法无疑是更快的方法,但是如果您想更快地进行操作,那该怎么办呢?对于第一个索引使用方法 速度很快,但无法处理多个索引如何加快速度? 问题答案: 假设您想要一个列表作为输出:对于我的测试,所有选项似乎都表现出相似的时间性能,列表理解最快(几乎没有)

  • 问题内容: 在Java中,以老式的方式遍历数组是否更快, 或者使用更简洁的形式, 对于ArrayList,答案是否相同? 当然,对于大量的应用程序代码,答案是没有明显的区别,因此应使用更简洁的形式以提高可读性。但是,我正在研究的上下文是重型技术计算,必须执行数十亿次操作,因此即使很小的速度差异也可能会变得非常重要。 问题答案: 如果您要遍历数组,没关系-增强的for循环无论如何都会使用数组访问。

  • 我已经在这上面耽搁了一段时间了。我正在尝试删除一个集合的元素,如果他们制定了一个集合的标准。然而,在迭代时,当我试图移除元素时,它失败了。 我得到java.util.concurrentModificationException 如有任何建议,将不胜感激。

  • 在此函数中,我在向量缓存中搜索对.first。向量为: 我用于查找函数的自定义函数是: 我将find函数调用为: 在编译时,我遇到了很多错误。前几行是: 在包含自 /usr/include/c /4.6/算法:63:0,从 my_class.hpp:5,从主.cpp:5: /usr/include/c /4.6/位/stl_algo.h 中包含的文件中:在函数“随机访问迭代器 std::_find

  • 甚至可以在Rust中连接向量吗?如果是这样,有没有一种优雅的方式可以做到这一点?我有这样的东西: 有人知道更好的方法吗?

  • 问题内容: 使用正则表达式,最简单的方法是获取网站HTML并在此标记内找到值(或与此相关的任何属性值): 问题答案: 取决于您需要构建(验证等)Http请求的复杂程度。这是我过去使用过的一种简单方法。 编译时可能会发现很多错别字。 (希望这不是功课)