首页 > 后端开发 > C++ > 正文

std::next_permutation 算法如何找到序列的下一个字典顺序更大的排列?

Barbara Streisand
发布: 2024-11-07 15:23:03
原创
183 人浏览过

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 到达序列的开头(开始)。在每次迭代中:

  1. 如果 i 不是上行元素,则递减 i 和 j。
  2. 如果 i 是上行元素,则查找 i 右侧的最小元素(k ),与 i 交换,并将 i 右侧的所有内容反转。

示例

考虑序列 {1, 2, 4, 3} .

  • 迭代 1: i 最初位于 3。j 位于 2。因为 3
  • 4 (i 迭代 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}.

以上是std::next_permutation 算法如何找到序列的下一个字典顺序更大的排列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!