「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > std::next_permutation アルゴリズムはどのように機能して、シーケンスの辞書編集上でさらに大きな順列を見つけるのですか?

std::next_permutation アルゴリズムはどのように機能して、シーケンスの辞書編集上でさらに大きな順列を見つけるのですか?

2024 年 11 月 11 日に公開
ブラウズ:252

How does the std::next_permutation algorithm work to find the next lexicographically larger permutation of a sequence?

std::next_permutation 実装の説明

std::next_permutation アルゴリズムは、指定されたシーケンスの辞書順に次に大きい順列を計算します。その実装を理解することは、その動作を理解するために非常に重要です。

アルゴリズムの概要

アルゴリズムはシーケンスを右から左に反復して、一番左の「アセンダー」(つまり、 、後続要素よりも小さい要素)。アセンダーが見つからない場合は、シーケンスが降順であることを意味します。この場合、シーケンスを逆にして最小の順列を取得します。

それ以外の場合、アルゴリズムはシーケンスの右側にある最小の要素を見つけて続行します。アセンダー (「k」と呼ばれます) の。この要素はアセンダーと交換されます。最後に、アセンダーの右側の要素が逆になり、降順が維持されます。

変数の役割

  • i: のポイント調べられている現在の要素。
  • j: 直前の要素を指します。 i.
  • k: i がアセンダの場合、i の右側にあるシーケンス内の最小要素を指します。

ループ フロー

ループは、i がシーケンスの先頭 (begin) に到達するまで繰り返されます。各反復内で:

  1. i がアセンダでない場合は、i と j がデクリメントされます。
  2. i がアセンダの場合は、i の右側にある最小の要素が検索されます (k )、それを i と交換し、右側のすべてを反転します。 i.

シーケンス {1, 2, 4, 3} を考えます。

  • 反復1: i は最初は 3 です。j は 2 です。3
  • 反復 2: k は 2 であることがわかります。3 は 2 と交換されます。{1, 3, 4, 2}。 3 の右側の要素 (4 と 2) が反転されます。 {1, 3, 2, 4}.
  • 反復 3: i がデクリメントされ、j がデクリメントされます。 i は現在 2 です。j は 1 です。2
  • 反復 4: k は 1 であることがわかります。2 は 1 と交換されます。{ 1、2、4、3}。 2 の右側の要素 (4 と 3) が反転されます。 {1, 2, 3, 4}.
  • 反復 5: i がデクリメントされ、j がデクリメントされます。 i は現在 1 です。j はシーケンスの先頭にあります。アセンダーがもうないので、順序が逆になります。 {4、3、2、1}.
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3