[英]Next_permutation and efficiency
從一個范圍內的對象的可能隨機排序開始是否更有效,使用 next_permutation 逐步遍歷所有更大的排列,然后降級,再次從原始排序開始,使用 prev_permutation 到達最后一個。
或者,在排列之前對范圍進行排序,然后只使用 next_permutation 來遍歷所有這些?
next_permutation
將逐步遍歷所有排列,而不僅僅是通過更大的排列。 無需還原和使用prev_permutation
,當然也無需排序。
您只需要注意這樣一個事實,即next_permutation
一旦“翻轉”到字典順序最低的排列中就會返回false
,因此您需要跟蹤當前排列的數量以知道何時停止。
也就是說,以下將遍歷范圍的所有可能排列,無論起始范圍如何。
size_t const num_permutations = multinomial_coefficient(range);
for (size_t i = 0; i < num_permutations; ++i) {
next_permutation(range.begin(), range.end());
// use permutation.
}
其中multinomial_coefficient
是范圍內不同元素數量的多項式系數。 ,.在所有元素都不同的簡單情況下,這等價於 。 元素數量的階乘。
要獲得所有排列,請從排序范圍開始,然后
do
{
// something
} while(next_permutation(range.begin(), range.end());
當范圍再次排序時,它會停止。 這個過程是 O(n.)。
當你從隨機范圍開始時,你會錯過一些排列。
完全沒有區別,該算法不會重復使用以前的結果,因此無需事先排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.