插入多组的运行时间
Posted
技术标签:
【中文标题】插入多组的运行时间【英文标题】:Runtime of inserting into multi set 【发布时间】:2014-01-26 01:53:29 【问题描述】:插入多集合的总体运行时间是多少,假设我要遍历十亿个元素并插入多集合,多集合保持排序。我的最坏情况运行时是多少?
【问题讨论】:
您的意思是复杂性?你的意思是 STL 多组?请更具体一点。单行问题通常很糟糕。 en.cppreference.com/w/cpp/container/multiset/insert#Complexity 如果您的意思是实际运行时间以秒为单位,那么这取决于复制/移动该类型对象需要多长时间,并且无法真正回答问题。运行它看看。如果您的意思是复杂性,那么“十亿”这个数字是完全无关紧要的(尽管它确实排除了在 32 位机器上做它的可能性)。 【参考方案1】:根据http://www.sgi.com/tech/stl/MultipleAssociativeContainer.html,插入单个元素的复杂度为O(log n);对于插入长度为 N 的序列,它是 O(N log n)。
如果您真的想要时间,而不是渐近复杂度,您可以为不同的值(例如 1000、10,000)计时,然后从那里计算比例常数。实际方程为 t = A n log n + C。
当然,下次您在不同的硬件上运行时,A 和 C 的值会发生变化。
【讨论】:
+ C
部分应该可以忽略不计(假设我们是物理学家:D)
"实际方程为t = A n log n + C
"——不一定。例如,它可能是A n log n + B n + C
,并且仍然是O(n log n)
。我猜想,与n
成比例的术语很可能是因为n
是在多重集中创建的元素的数量,并且创建元素(忽略有关查找放置位置的部分)可能大致保持不变成本。正如 Paranaix 所说,C
可能很小:这是将零元素插入多重集所花费的时间:-)
在N的高值的限制下变得可以忽略不计。但是为了计算A的值,你可以使用小得多的N值,然后不忽略拟合会更好C.
是的,可能会有一个与n
成比例的术语以上是关于插入多组的运行时间的主要内容,如果未能解决你的问题,请参考以下文章