在开发的过程中很难免会到排列组合,刚开始通过for循环来搞定。但是对于工作了近五年的我而已,不能像
新人那样做了。如果所要组合的集合大于40,你不可能写40个for循环吧!
这里使用了数学的算法,到底是啥算法,高人也没说!不过我把它的思想提升了一下。代码如下:
#ifndef COMBINATION__H__
#define COMBINATION__H__
#include <vector>
#include <assert.h>
using namespace std;
template <class T>
class CCombination
{
typedef vector<T> Node;
typedef vector<Node> VctNode;
typedef vector<uint32_t> NodeLen;
public:
CCombination():m_nTotal(1),m_nNodeNum(0)
{
}
~CCombination()
{
}
int AddNode(const Node &node)
{
int nSize = node.size();
m_nTotal *= nSize;
m_nNodeNum++;
m_VctNode.push_back(node);
m_VctLen.push_back(nSize);
}
void GetResult(Node &node)
{
for(uint32_t nItem = 0; nItem < m_nTotal; nItem++)
{
uint32_t nCurItem = nItem;
for(uint32_t nNum = 0; nNum < m_nNodeNum; nNum++)
{
uint32_t nTemp = nCurItem%m_VctLen[nNum];
T data = m_VctNode[nNum][nTemp];
node.push_back(data);
nCurItem = nCurItem/m_VctLen[nNum];
}
}
}
void GetResult(int nIndex, Node &node)
{
if(nIndex > 0 || nIndex >= m_nTotal)
{
return ;
}
for(uint32_t nNum = 0; nNum < m_nNodeNum; nNum++)
{
uint32_t nTemp = nIndex%m_VctLen[nNum];
T data = m_VctNode[nNum][nTemp];
node.push_back(data);
nIndex = nIndex/m_VctLen[nNum];
}
}
protected:
uint32_t m_nTotal;
uint32_t m_nNodeNum;
VctNode m_VctNode;
NodeLen m_VctLen;
};
#endif
我希望以此抛砖引玉,希望能找到更好的算法。
本文介绍了一种使用模板类实现的高效排列组合算法,适用于处理大量元素的组合问题,避免了传统for循环的繁琐和效率低下。通过实例演示,展示了算法的实现方式和应用效果,旨在为开发者提供一种更简便、高效的解决方案。
414





