У меня есть std::list
, который я в настоящее время рандомизировал, используя Shuffle Fisher-Yates (см. http://en.wikipedia.org/wiki/Fisher-Yates_shuffle). Подводя итог, мой код выполняет следующие шаги в этом списке:Улучшение производительности при рандомизации std :: list
- Прокрутите каждый элемент
list
. - Поменяйте элемент со случайно выбранным элементом с текущей позиции вперед, включая его.
Поскольку списки не предоставляют случайный доступ, это означает, что я выполняю повторение по всему списку на шаге 1, и для каждого элемента, который я повторяю снова, в среднем более половины оставшихся элементов с этой точки дальше , Это серьезное узкое место в производительности моей программы, поэтому я хочу улучшить ее. По другим причинам мне нужно продолжать использовать list
в качестве моего контейнера, но я рассматриваю возможность преобразования в vector
в начале моей функции рандомизации, а затем обратно в list
. Мои списки обычно содержат 300 - 400 элементов, поэтому я бы предположил, что стоимость конверсии между контейнерами будет стоить того, чтобы избежать чередования элементов последовательно.
Мой вопрос: это похоже на лучший способ оптимизации кода? Есть ли способ лучше?
Отображение самого кода более полезно, чем описание кода. – Marlon
swapping std :: list элементов дорого стоит по сравнению с std :: векторами. попробуйте скопировать список на вектор (простой), прежде чем делать своп, и посмотреть, улучшает ли он его. – Max
Возможно, что-то было бы выбором? он поддерживает список и векторную семантику, поэтому вы можете использовать random_shuffle из STL – PeskyGnat