组合算法

顺德达人 2012-08-27 11:36:47
加精
现在我有26个元素a...z
我想自由生成相关的组合
从一位起
a
a+b
a+b+c
a+b+c+d
......
生成所有组合对顺序没有要求,即a+b 和 b+a可以当同一条,不用重复出现
...全文
6073 103 打赏 收藏 转发到动态 举报
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
LQH1029 2012-09-15
  • 打赏
  • 举报
回复
这样也可以想到26位二进制,厉害!
SebastianHe 2012-09-09
  • 打赏
  • 举报
回复
SebastianHe 2012-09-09
  • 打赏
  • 举报
回复
思路:
二进制-->逆序-->找出值为1的位对应的字母
1-->1-->A 10-->01-->B 11-->11-->AB
100-->001-->C 101-->101-->AC 110-->011-->BC
111-->111-->ABC

JAVA实现:
public class Thr{
public static void main(String[] args) {
System.out.println("总计" + ((1 << 26)-1)+"种组合");
char[] ch = {'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z'};
int n = (1<<ch.length)-1;
int i = 0;
StringBuffer sb = new StringBuffer();
while(i++ < n){
String revBinStr = sb.append(Integer.toBinaryString(i))
.reverse().toString();//逆序二进制字符串
create(ch,revBinStr);
sb.delete(0,revBinStr.length());
System.out.println();//换行
}
}


//找出值为1的位的下标,输出ch中对应该下标的
public static void create(char[] ch,String revBinStr ){
int currentIndex = 0;
for(int x = 0; x < ch.length; ){
currentIndex = revBinStr.indexOf("1",x);
if(currentIndex != -1 ){
System.out.print(ch[currentIndex]);
x = currentIndex + 1;
}else{
break;
}
}
}
}
jkm8488 2012-09-09
  • 打赏
  • 举报
回复
楼主想表达什么意思
LAONINGA098 2012-09-09
  • 打赏
  • 举报
回复
有点深
dzq138 2012-09-08
  • 打赏
  • 举报
回复

if (n & temp)
buf[datalen++] = ch;
...
//代码在这里用得比较巧妙...

天涯倦客 2012-09-06
  • 打赏
  • 举报
回复
每个选取结果是可以排序
根据排序结果可以 直接算出 需要生成的序列。。
WuHuoDeYangGuangNa 2012-09-05
  • 打赏
  • 举报
回复
新手看的晕乎乎的...
超级大笨狼 2012-09-05
  • 打赏
  • 举报
回复
这个问题简单,你可以理解成二进制,每位选还是不选就是0和1.
有多少个字母就有多少位。
正在录入中 2012-09-05
  • 打赏
  • 举报
回复
怪怪、都是大牛啊、算法牛B啊、小弟一点不懂算法、唉…………
goat_13 2012-09-05
  • 打赏
  • 举报
回复
如果不是排列只算组合的话~
使用位图算法应该是最省空间的~
只不过展示的时候需要解析~
数据量这么大~
最费时间的应该是解析吧~
sayume 2012-09-05
  • 打赏
  • 举报
回复
居然用起了回溯,不知道直接用数学解决吗,算法不是用来让问题变复杂的。
规模为1时,有两种组合:null, a
规模为2时,在原有组合基础上增加b: b, a+b
再加上原有组合,所有排列为(null,a,b,a+b)
规模为3时,在原有组合上增加c: c, a+c, b+c, a+b+c
再加上原有组合,所有排列为 (null,a,b,a+b,c,a+c,b+c,a+b+c)
...
这个问题实际上是一个等比数列,设f(1)=2, f(n)=2*f(n-1),如果不计算空,最后结果减1即可,通项为2^n-1。
按照上述步骤一次性遍历所有结果,无任何多余操作,我就不信还有人能找出比这个更快的算法。
tianer124 2012-09-05
  • 打赏
  • 举报
回复
无顺序不重复的组合 abc、acb、bac、bca...都算一种组合
tianer124 2012-09-05
  • 打赏
  • 举报
回复
不重复的组合,abc、acb、bac、bca、cab、cba都是一样的,算一种
haorengoodman 2012-09-04
  • 打赏
  • 举报
回复
(C26 1 + C26 2 +........+C26 13)*2
  • 打赏
  • 举报
回复
求java版本的代码
名刀秋水 2012-09-04
  • 打赏
  • 举报
回复
程序可能存在bug,欢迎各位好友切磋
运行时间:30秒 (写入硬盘文件) 文件大小:895 MB (939,524,095 bytes)含“,”分隔符
运行时间:4秒 (不写硬盘只写入输出缓存)


void PrintStr(DWORD n, HANDLE hFile);

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = INVALID_HANDLE_VALUE;
char timebuf[20] = {0};

DWORD TimeStart;
DWORD TimeEnd;
DWORD TimeUsed;

system("pause");
TimeStart = GetTickCount();

hFile = CreateFileA( "./output.txt",
GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (INVALID_HANDLE_VALUE == hFile)
return FALSE;

for (DWORD i=1; i<67108864; i++)
PrintStr(i, hFile);

CloseHandle(hFile);

TimeEnd = GetTickCount();
TimeUsed = TimeEnd - TimeStart;
printf("67108863 records, time costs: %ld(ms)\n", TimeUsed);
system("pause");

return 0;
}



void PrintStr(DWORD n, HANDLE hFile)
{
/*

26 bits for a ~ z:

| 8bits | 8bits | 8bits | 8bits |
|------00|00000000|00000000|00000000|
| zy|xwvutsrq|ponmlkji|hgfedcba|

a ~ z: 97 ~ 122

*/

static char buf[28*1024*1024] = {0}; //28mb
static int datalen = 0;

DWORD temp = 1;
char ch = 'a';

for (int i=0; i<26; i++)
{
if (n & temp)
buf[datalen++] = ch;

ch++;
temp = temp << 1;
}

buf[datalen++] = ',';

if ((datalen > (28*1024*1024 - 28)) || 67108863 == n)
{
DWORD wtlen = 0;
WriteFile(hFile, buf, datalen, &wtlen, 0);
memset(buf, 0, sizeof(buf));
datalen = 0;
}
}
名刀秋水 2012-09-04
  • 打赏
  • 举报
回复
程序可能存在bug,欢迎各位好友切磋
运行时间:30秒 (写入硬盘文件) 文件大小:895 MB (939,524,095 bytes)含“,”分隔符
运行时间:4秒 (不写硬盘只写入输出缓存)


void PrintStr(DWORD n, HANDLE hFile);

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = INVALID_HANDLE_VALUE;
char timebuf[20] = {0};

DWORD TimeStart;
DWORD TimeEnd;
DWORD TimeUsed;

system("pause");
TimeStart = GetTickCount();

hFile = CreateFileA( "./output.txt",
GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (INVALID_HANDLE_VALUE == hFile)
return FALSE;

for (DWORD i=1; i<67108864; i++)
PrintStr(i, hFile);

CloseHandle(hFile);

TimeEnd = GetTickCount();
TimeUsed = TimeEnd - TimeStart;
printf("67108863 records, time costs: %ld(ms)\n", TimeUsed);
system("pause");

return 0;
}



void PrintStr(DWORD n, HANDLE hFile)
{
/*

26 bits for a ~ z:

| 8bits | 8bits | 8bits | 8bits |
|------00|00000000|00000000|00000000|
| zy|xwvutsrq|ponmlkji|hgfedcba|

a ~ z: 97 ~ 122

*/

static char buf[28*1024*1024] = {0}; //28mb
static int datalen = 0;

DWORD temp = 1;
char ch = 'a';

for (int i=0; i<26; i++)
{
if (n & temp)
buf[datalen++] = ch;

ch++;
temp = temp << 1;
}

buf[datalen++] = ',';

if ((datalen > (28*1024*1024 - 28)) || 67108863 == n)
{
DWORD wtlen = 0;
WriteFile(hFile, buf, datalen, &wtlen, 0);
memset(buf, 0, sizeof(buf));
datalen = 0;
}
}
名刀秋水 2012-09-04
  • 打赏
  • 举报
回复
程序可能有BUG或错误的地方,欢迎各路好友切磋!!
写硬盘程序运行时间:30秒 (普通机械硬盘)
不写硬盘运行时间:4秒 (仅写入输出缓存)
输出文件大小:895 MB (939,524,095 bytes)(含“,”分隔符)


int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = INVALID_HANDLE_VALUE;
char timebuf[20] = {0};

DWORD TimeStart;
DWORD TimeEnd;
DWORD TimeUsed;

system("pause");
TimeStart = GetTickCount();

hFile = CreateFileA( "./output.txt",
GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (INVALID_HANDLE_VALUE == hFile)
return FALSE;

for (DWORD i=1; i<67108864; i++)
PrintStr(i, hFile);

CloseHandle(hFile);

TimeEnd = GetTickCount();
TimeUsed = TimeEnd - TimeStart;
printf("67108863 records, time costs: %ld(ms)\n", TimeUsed);
system("pause");

return 0;
}



void PrintStr(DWORD n, HANDLE hFile)
{
/*

26 bits for a ~ z:

| 8bits | 8bits | 8bits | 8bits |
|------00|00000000|00000000|00000000|
| zy|xwvutsrq|ponmlkji|hgfedcba|

a ~ z: 97 ~ 122

*/

static char buf[28*1024*1024] = {0}; //28mb
static int datalen = 0;

DWORD temp = 1;
char ch = 'a';

for (int i=0; i<26; i++)
{
if (n & temp)
buf[datalen++] = ch;

ch++;
temp = temp << 1;
}

buf[datalen++] = ',';

if ((datalen > (28*1024*1024 - 28)) || 67108863 == n)
{
DWORD wtlen = 0;
WriteFile(hFile, buf, datalen, &wtlen, 0);
memset(buf, 0, sizeof(buf));
datalen = 0;
}
}
诚朴勇毅 2012-09-04
  • 打赏
  • 举报
回复
回溯,子集树
加载更多回复(64)
推荐算法系统实战全系列精品课 :一、课程优势本课程有陈敬雷老师的清华大学出版社配套新书教材《分布式机器学习实战》人工智能科学与技术丛书,新书配合此实战课程结合学习,一静一动,互补高效学习!本课程由互联网一线知名大牛陈敬雷老师全程亲自授课,技术前沿热门,这个《推荐算法系统实战全系列精品课》来自陈敬雷在一线大型互联网公司的多年实战经验总结,比较完备的包含了各个算法系统模块,实实在在的重量级干货分享!听完此系列课,可以实现一个完整的推荐系统!二、课程简介       首先推荐系统不等于推荐算法,更不等于协同过滤。推荐系统是一个完整的系统工程,从工程上来讲是由多个子系统有机的组合,比如基于Hadoop数据仓库的推荐集市、ETL数据处理子系统、离线算法、准实时算法、多策略融合算法、缓存处理、搜索引擎部分、二次重排序算法、在线web引擎服务、AB测试效果评估、推荐位管理平台等,每个子系统都扮演着非常重要的角色,当然大家肯定会说算法部分是核心,这个说的没错,的确。推荐系统是偏算法的策略系统,但要达到一个非常好的推荐效果,只有算法是不够的。比如做算法依赖于训练数据,数据质量不好,或者数据处理没做好,再好的算法也发挥不出价值。算法上线了,如果不知道效果怎么样,后面的优化工作就无法进行。所以AB测试是评价推荐效果的关键,它指导着系统该何去何从。为了能够快速切换和优化策略,推荐位管理平台起着举足轻重的作用。推荐效果最终要应用到线上平台去,在App或网站上毫秒级别的快速展示推荐结果,这就需要推荐的在线Web引擎服务来保证高性能的并发访问。这么来说,虽然算法是核心,但离不开每个子系统的配合,另外就是不同算法可以嵌入到各个子系统中,算法可以贯穿到每个子系统。       从开发人员角色上来讲,推荐系统不仅仅只有算法工程师角色的人就能完成整个系统,需要各个角色的工程师相配合才行。比如大数据平台工程师负责Hadoop集群和数据仓库,ETL工程师负责对数据仓库的数据进行处理和清洗,算法工程师负责核心算法,Web开发工程师负责推荐Web接口对接各个部门,比如网站前端、APP客户端的接口调用等,后台开发工程师负责推荐位管理、报表开发、推荐效果分析等,架构师负责整体系统的架构设计等。所以推荐系统是一个多角色协同配合才能完成的系统。       下面我们就从推荐系统的整体架构以及各个子系统的实现给大家深度解密来自一线大型互联网公司重量级的实战产品项目!!!推荐算法系统实战课程大纲如下:1、推荐系统架构设计2、推荐数据仓库集市3、推荐系统ETL数据处理4、CF协同过滤用户行为挖掘5、推荐算法ALS交替最小二乘法6、推荐系统ContentBase文本挖掘算法7、用户画像兴趣标签提取算法8、基于用户心理学模型推荐9、推荐系统多策略融合算法10、准实时在线学习推荐引擎11、Redis分布式缓存处理12、分布式搜索引擎13、推荐Rerank二次重排序算法(基于逻辑回归、GBDT、随机森林、神经网络的算法思想做二次排序)【可试听】14、推荐Rerank二次重排序算法(基于Learning TO rank排序学习思想做二次排序)15、推荐Rerank二次重排序算法(基于加权公式思想做二次排序)16、在线Web实时推荐引擎服务原理及核心处理算法17、在线Web实时推荐引擎服务核心源代码解析18、在线AB测试推荐效果评估19、离线AB测试推荐效果评估20、推荐位管理平台 21、大数据用户画像系统架构图深度解密与详细介绍22、大数据用户画像系统中各个子系统详细讲解三、老师介绍陈敬雷  充电了么创始人,CEO兼CTO陈敬雷,北京充电了么科技有限公司创始人,CEO兼CTO,十几年互联网从业经验,曾就职于用友、中软、凡客、乐蜂网(唯品会)、猎聘网、人民日报(灵思云途)、北京万朝科技,曾任架构师、首席技术官、首席科学家等职务,对业务领域B端、C端、电商、职场社交招聘、内容文娱、营销行业都有着丰富的经验,在技术领域,尤其在大数据和人工智能方向有丰富的算法工程落地实战经验,其中在猎聘网任职期间主导的推荐算法系统项目获得公司优秀项目奖,推荐效果得到5倍的提升。陈敬雷著有清华大学出版社两本人工智能书籍,分别是《分布式机器学习实战(人工智能科学与技术丛书)》已出版、《自然语言处理原理与实战(人工智能科学与技术丛书)》。目前专注于大数据和人工智能驱动的上班族在线教育行业,研发了充电了么app和网站,用深度学习算法、nlp、推荐引擎等技术来高效提升在线学习效率。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧