【发布时间】:2012-04-28 20:45:03
【问题描述】:
我有一个 std::list,我目前正在使用 Fisher-Yates shuffle 随机化它(请参阅 http://en.wikipedia.org/wiki/Fisher-Yates_shuffle)。总而言之,我的代码在列表中执行了以下步骤:
- 循环遍历
list的每个元素。 - 从当前位置开始用随机选择的元素交换元素,包括它自己。
因为列表不提供随机访问,这意味着我在第 1 步中迭代整个列表,并且对于每个元素我再次迭代,从那时起平均超过一半的剩余元素。这是我的程序性能的一个主要瓶颈,所以我正在寻求改进它。由于其他原因,我需要继续使用list 作为我的容器,但我正在考虑在我的随机函数开始时转换为vector,然后在最后转换回list。我的列表通常包含 300 到 400 个项目,所以我猜想容器之间的转换成本是值得的,以避免按顺序遍历这些项目。
我的问题是:这似乎是优化代码的最佳方式吗?有没有更好的办法?
【问题讨论】:
-
显示代码本身比描述代码的作用更有帮助。
-
与 std::vectors 相比,交换 std::list 元素的成本很高。在进行交换之前尝试将列表复制到向量(简单),看看它是否会有所改善。
-
也许双端队列是一种选择?它支持列表和向量语义,因此您可以使用 STL 中的 random_shuffle
标签: c++ performance list random std