簡體   English   中英

Next_permutation 和效率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM