zoukankan      html  css  js  c++  java
  • 排列与组合生成类

    // Copyright (c) 
    // All rights reserved.
    //
    //Describe : Premutation And Combination generater
    //Author   : Qing
    //Date     : 2015-01-19
    
    #ifndef __PREMUTATION_COMBINATION_H__
    #define __PREMUTATION_COMBINATION_H__
    
    #include <bitset>
    #include <vector>
    #include <algorithm>
    
    namespace Qing
    {
        template<typename T, unsigned int ElementCount>
        class PermutationCombination
        {
        public:
    
            PermutationCombination(void) {}
            ~PermutationCombination(void){}
    
            bool GetCombination(const std::vector<T> &SourceVector, int CombinationElementCount, std::vector<std::vector<T> > &ResultVector);
            bool GetPermutation(const std::vector<T> &SourceVector, int PermutationElementCount, std::vector<std::vector<T> > &ResultVector);
    
        private:
    
            bool AdjustPosition(std::bitset<ElementCount> &FlagArray, unsigned int SourceVectorElementCount);
        };
    
        template<typename T, unsigned int ElementCount>
        bool PermutationCombination<T,ElementCount>::GetCombination(const std::vector<T> &SourceVector, int CombinationElementCount, std::vector<std::vector<T> >& ResultVector)
        {
            if(SourceVector.size() <= 0 || CombinationElementCount <= 0 || CombinationElementCount > static_cast<int>(SourceVector.size()))
            {
                return false;
            }
    
            std::bitset<ElementCount> FlagArray;
            for(int Index = 0; Index < CombinationElementCount; Index++)
            {
                FlagArray.set(Index);
            }
    
            do
            {
                ResultVector.push_back(std::vector<T>(CombinationElementCount, T()));
                std::vector<T> &TempArray = ResultVector[ResultVector.size()-1];
    
                std::vector<T>::size_type TempIndex = 0;
                for(std::size_t BitSetIndex = 0; BitSetIndex < FlagArray.size(); BitSetIndex++)
                {
                    if(FlagArray[BitSetIndex])
                    {
                        TempArray[TempIndex] = SourceVector[BitSetIndex];
                        if(++TempIndex == CombinationElementCount)
                        {
                            break;
                        }
                    }
                }
            }
            while(AdjustPosition(FlagArray, SourceVector.size()));
    
            return true;
        }
    
        template<typename T, unsigned int ElementCount>
        bool PermutationCombination<T,ElementCount>::GetPermutation(const std::vector<T> &SourceVector, int PermutationElementCount, std::vector<std::vector<T> >& ResultVector)
        {
            if(SourceVector.size() <= 0 || PermutationElementCount <= 0 || PermutationElementCount > static_cast<int>(SourceVector.size()))
            {
                return false;
            }
    
            std::bitset<ElementCount> FlagArray;
            for(int Index = 0; Index < PermutationElementCount; Index++)
            {
                FlagArray.set(Index);
            }
    
            std::vector<T> TempArray(PermutationElementCount,T());
    
            do
            {
                std::vector<T>::size_type TempIndex = 0;
                for(std::size_t BitSetIndex = 0; BitSetIndex < FlagArray.size(); BitSetIndex++)
                {
                    if(FlagArray[BitSetIndex])
                    {
                        TempArray[TempIndex] = SourceVector[BitSetIndex];
                        if(++TempIndex == PermutationElementCount)
                        {
                            do
                            {
                                ResultVector.push_back(TempArray);
                            }
                            while (next_permutation(TempArray.begin(), TempArray.end()));
    
                            break;
                        }
                    }
                }
            }
            while(AdjustPosition(FlagArray, SourceVector.size()));
    
            return true;
        }
    
        //*********************** 0-1 exchange algorithm ************************
        //  example : C(5,3)
        //      1   1   1   0   0
        //      1   1   0   1   0
        //      1   0   1   1   0
        //      0   1   1   1   0
        //      1   1   0   0   1
        //      1   0   1   0   1
        //      0   1   1   0   1
        //      1   0   0   1   1
        //      0   1   0   1   1
        //      0   0   1   1   1
        //*********************** 0-1 exchange algorithm ************************
        template<typename T, unsigned int ElementCount>
        bool PermutationCombination<T,ElementCount>::AdjustPosition(std::bitset<ElementCount> &FlagArray, unsigned int SourceVectorElementCount)
        {
            SourceVectorElementCount -= 1;
            for(unsigned int i = 0; i < SourceVectorElementCount; i++)
            {
                if(FlagArray[i] && !FlagArray[i+1])
                {
                    FlagArray.reset(i);
                    FlagArray.set(i + 1);
    
                    if(!FlagArray[0] && i != 0)
                    {
                        int TrueCount = 0;
                        for(unsigned int j = 0; j < i; j++)
                        {
                            if(FlagArray[j])
                            {
                                ++TrueCount;
                            }
    
                            FlagArray.reset(j);
                        }
    
                        for(int k = 0; k < TrueCount; k++)
                        {
                            FlagArray.set(k);
                        }
                    }
    
                    return true;
                }
            }
    
            return false;
        }
    }
    
    #endif
  • 相关阅读:
    Common Lisp 参数传递的几种形式
    EF架构~基于EF数据层的实现
    标准架构~业务层到底是否应该关注数据持久化的方式
    Redis学习笔记~Redis主从服务器,读写分离
    Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
    MVVM架构~knockoutjs系列之数组的$index和$data
    【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错
    Android---App Widget(一)
    Mit 分布式系统导论,Distributed Systems ,lab1 -lab6 总结,实验一到实验六总结
    GDAL切割重采样遥感图像
  • 原文地址:https://www.cnblogs.com/zwq1011/p/4525378.html
Copyright © 2011-2022 走看看