zoukankan      html  css  js  c++  java
  • 【STL源码剖析读书笔记】【第6章】算法之next_permutation和prev_permutation算法

    1、next_permutation()会取得[first, last)所标示序列的下一个排列组合,如果没有下一个排列组合,返回false,否则返回true。

    2、next_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i < *ii,找到这样一组元素后,再从尾端开始往前找出第一个大于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了下一个组合。

    3、next_permutation()源代码

    template <class BidirectionalIterator>
    bool next_permutation(BidirectionalIterator first,
    	BidirectionalIterator last) {
    	if (first == last) return false;  //空区间
    	BidirectionalIterator i = first;
    	++i;
    	if (i == last) return false;   //只有一个元素
    	i = last;//i指向尾端
    	--i;
    	for (;;) {
    		BidirectionalIterator ii = i;
    		--i;
    		if (*i < *ii) {//前一个元素小于后一个元素
    			BidirectionalIterator j = last;//令j指向尾端
    			while (!(*i < *--j));//由尾端向前找,直到遇上比*i大的元素
    			iter_swap(i, j);//交换i,j
    			reverse(ii, last);//将ii之后的元素全部逆向重排
    			return true;
    		}
    		if (i == first) {    // 进行至最前面了
    			reverse(first, last);//全部逆向重排
    			return false;
    		}
    	}
    }
    

    4、prev_permutation()会取得[first, last)所标示序列的上一个排列组合,如果没有上一个排列组合,返回false,否则返回true。

    5、prev_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i > *ii,找到这样一组元素后,再从尾端开始往前找出第一个小于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了上一个组合。

    6、prev_permutation()源代码

    template <class BidirectionalIterator>
    bool prev_permutation(BidirectionalIterator first,
    	BidirectionalIterator last) {
    	if (first == last) return false; //空区间
    	BidirectionalIterator i = first;
    	++i;
    	if (i == last) return false; //只有一个元素
    	i = last;//i指向尾端
    	--i;
    
    	for (;;) {
    		BidirectionalIterator ii = i;
    		--i;
    		if (*ii < *i) {//后一个元素小于前一个元素
    			BidirectionalIterator j = last;//令j指向尾端
    			while (!(*--j < *i));//由尾端向前找,直到遇上比*i小的元素
    			iter_swap(i, j);//交换i,j
    			reverse(ii, last); // 将ii之后的元素全部逆向重排
    			return true;
    		}
    		if (i == first) {    // 进行至最前面了
    			reverse(first, last);//全部逆向重排
    			return false;
    		}
    	}
    }
    


  • 相关阅读:
    软工实践练习一——使用Git进行代码管理心得
    作业1.3——Android平台的开发环境的发展演变
    作业1.2——软件工程的实践项目的自我目标
    SVN冲突解决
    sea.js及三种加载方式的异同
    php中AJAX请求中使用post和get请求的区别
    Vue-起步篇:Vue与React、 Angular的区别
    页面常见布局以及实现方法--flex
    requestAnimationFrame之缓动的应用
    bootstrap中table页面做省市区级联效果(级联库见前面级联编辑)(非select下拉框)
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4558299.html
Copyright © 2011-2022 走看看