Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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++_Performance_Algorithm_Data Structures_Simulation - Fatal编程技术网

C++ 如何快速地将元素重复插入到排序列表中

C++ 如何快速地将元素重复插入到排序列表中,c++,performance,algorithm,data-structures,simulation,C++,Performance,Algorithm,Data Structures,Simulation,我没有接受过正式的CS培训,所以请容忍我 我需要做一个模拟,可以抽象为以下内容(省略细节): 我们有一个代表事件时间的实数列表。在里面 每一步,我们 删除第一个事件,然后 作为“处理”它的结果,一些其他事件可能会在稍后的时间被插入到列表中 并重复多次 问题 我可以使用什么数据结构/算法来尽可能高效地实现这一点?我需要显著增加列表中事件/数字的数量。首要任务是尽可能快地完成一个长长的列表 因为我在C++中这样做,在STL或Boost中已经有什么数据结构可以实现它? 更多详细信息: 列表中的事件数

我没有接受过正式的CS培训,所以请容忍我

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

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

  • 删除第一个事件,然后
  • 作为“处理”它的结果,一些其他事件可能会在稍后的时间被插入到列表中
  • 并重复多次

    问题

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

    因为我在C++中这样做,在STL或Boost中已经有什么数据结构可以实现它?


    更多详细信息:

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

    迄今为止的努力:

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


    现在我使用的是一个近似值,我将时间划分为多个桶,并跟踪每个桶中有多少个事件。然后,随着时间的推移,一个接一个地处理铲斗,从前面移除铲斗时,始终在末端添加一个新铲斗,从而保持铲斗数量不变。这很快,但只是一个近似值。

    我将从一个基本优先级队列开始,看看这是否足够快。 如果没有,那么你可以考虑写一些定制的东西


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


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

    一个最小的堆可能适合您的需要。我认为STL为您提供了
    优先级队列


    插入时间是O(logn),删除时间是O(logn)

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


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

    选择数据结构取决于要在其中存储的数据类型以及将对数据结构执行的操作。所有事件是否都有唯一的时间戳,时间是什么格式的?@Als我只花了20分钟写了这么多。。。一切都在计划之中question@KerrekSB对于每个事件,我需要存储timestap(double或float)和类型(只有少数类型,目前为2,因此这可以是一个枚举)
    std::priority_queue
    将是我的首选。