【问题标题】:How to repeatedly insert elements into a sorted list fast如何快速将元素重复插入排序列表
【发布时间】:2011-12-25 10:25:29
【问题描述】:

我没有接受过正式的 CS 培训,所以请耐心等待。

我需要做一个模拟,可以抽象为以下内容(省略细节):

我们有一个代表事件时间的实数列表。在 每一步,我们

  1. 删除第一个事件,然后
  2. 作为“处理”它的结果,一些其他事件可能会在严格的稍后时间插入到列表中

并重复多次。

问题

我可以使用什么数据结构/算法来尽可能高效地实现这一点?我需要显着增加列表中事件/数字的数量。首要任务是尽可能快地处理长列表。

由于我在 C++ 中执行此操作,因此 STL 或 boost 中已有哪些数据结构可以轻松实现?


更多详情:

列表中的事件数量是可变的,但保证在n2*n 之间,其中n 是一些模拟参数。在事件时间增加的同时,最新和最早事件的时间差也保证小于常数T。最后,我怀疑时间上的事件密度虽然不是恒定的,但也有一个上限和下限(即所有事件永远不会强烈地聚集在一个时间点周围)

目前的努力:

正如问题的标题所说,我正在考虑使用排序的数字列表。如果我使用链表进行恒定时间插入,那么我很难找到以快速(次线性)方式插入新事件的位置。

现在我正在使用一个近似值,将时间划分为多个桶,并跟踪每个桶中有多少事件。然后随着时间“流逝”一个接一个地处理桶,当从前面移除一个桶时,总是在最后添加一个新桶,从而保持桶的数量不变。这很快,但只是一个近似值。

【问题讨论】:

  • 选择数据结构取决于您要在其中存储什么样的数据以及您将对数据结构执行的操作。
  • 是否所有事件都有唯一的时间戳,时间格式是什么?
  • @Als 我只花了 20 分钟把所有的东西都写出来了……一切都在问题中
  • @KerrekSB 对于每个事件我需要存储时间戳(双精度或浮点数)和类型(只有几种类型,目前为 2,所以这可以是一个枚举)
  • std::priority_queue 将是我的首选。

标签: c++ performance algorithm data-structures simulation


【解决方案1】:

我会从一个基本的优先级队列开始,看看它是否足够快。 如果没有,那么您可以考虑编写一些自定义的内容。

http://en.wikipedia.org/wiki/Priority_queue

【讨论】:

    【解决方案2】:

    听起来您需要/想要一个优先队列。如果内存够用,标准库中的优先级队列适配器被编写为检索最大的项目而不是最小的项目,因此您必须指定它使用std::greater 进行比较。

    除此之外,它还提供您所要求的内容:快速访问/删除最小/最大项目的能力,以及快速插入新项目的能力。虽然它不会按顺序维护所有项目,但它确实保持了足够的顺序,它仍然可以快速找到/删除一个最小(或最大)的项目。

    【讨论】:

      【解决方案3】:

      最小堆可能适合您的需求。有一个explanation here,我认为 STL 为您提供了priority_queue

      插入时间为 O(log N),移除时间为 O(log N)

      【讨论】:

        【解决方案4】:

        二叉树总是排序的,并且比线性列表具有更快的访问时间。搜索、插入和删除时间为 O(log(n))。

        但这取决于是否必须始终对项目进行排序,或者仅在流程完成后才进行排序。在后一种情况下,哈希表可能更快。在该过程结束时,您会将项目复制到数组或列表中并对其进行排序。

        【讨论】:

          猜你喜欢
          • 2012-11-26
          • 2011-12-27
          • 2011-05-12
          • 1970-01-01
          • 2017-10-10
          • 1970-01-01
          • 1970-01-01
          • 2019-06-30
          相关资源
          最近更新 更多