那一场风花雪月的事,曾经的问题再翻起(笛卡尔积).第三弹续

黄袍披身 2012-03-25 11:45:11
加精
老大说这是求笛卡尔积,对于算法白痴的我只好依葫芦画瓢了。
话说11年的6月份,我提出这个问题,后来得到个js解法,匆忙结帖,快一年过去了,没有php解法,心里总有疙瘩,疙疙瘩瘩疙疙瘩瘩。今日旧事重提,我们一起来鞭尸。

好像骄傲的青蛙后来跃跃欲试,可惜没联系上

=========================
问题陈述

有如下数据

31,42...更多
32
43
35
36
...
更多

根据上面的数据得到

31,32,35,36
31,32.35,43
31,32,36,43
31,35,36,43
...

上面这个结果位数是能够根据需求变化的,例如 4位的所有不重复组合 3位的所有不重复组合...

再来个例子:
以下数据
01 02
03 04
05 06
07 08

===========
得到组合结果(4位组合,要求可以根据条件得到不同位数的组合 例如3 2 )

01 03 05 07
01 03 06 07
01 03 05 08
01 03 06 08

01 04 05 07
01 04 05 08
01 04 06 07
01 04 06 08

02 03 05 07
02 03 05 08
02 03 06 07
02 03 06 08

02 04 05 07
02 04 05 08
02 04 06 07
02 04 06 08

也可能是这个样子的问题
01 02
03 04
05 06
07 08 09 10
11
12 13

没有固定行或者列的位数

===============================
参考资料:

1.类似问题第二弹,老徐有答案,不过第三弹跟第二弹比有了变化
http://topic.csdn.net/u/20110531/17/dd79391a-ed60-4050-b741-409cf1cbe6d2.html

2.本问题的Js 解法
作者:JParser


function combo(m,n){
var arr=[],sumArr=[],str,isBreak=false;
for(var i=0;i <m;i++){
arr.push(0);
}
for(var i=0;i <n;i++){
arr[i]=1;
}
str=arr.join('');
while(1){
var itemArr=[],
reg=/(.*?)(10)/;
for(var j=0,len=str.length;j <len;j++){
str.charAt(j)!="0"&&itemArr.push(j);
}
sumArr.push(itemArr);
if(reg.test(str)){
str=str.replace(reg,function(l,s1,s2){
var num=s1.replace(/0/g,"").length,
prefixstr="";
for(var i=0,len=s1.length;i <len;i++){
prefixstr+=(i <num?'1':'0');
}
return prefixstr+"01";
});
}else{
break;
}
}
return sumArr;
}

function doubleCombo(arr,n){
var arrLen=arr.length,finalArr=[];
if(arrLen <n) {
alert("invalid input!");
return;
}
var comboCol=combo(arrLen,n);//行序号组合数
for(var i=0,cl=comboCol.length;i <cl;i++){//得到组合的每一项
var colItem=comboCol[i],items=[[]];
for(var j=0,il=colItem.length;j <il;j++){
var data=arr[colItem[j]];
if(typeof data=="number"){
for(var k=0,itemsLen=items.length;k <itemsLen;k++){
items[k].push(data);
}
}
else{
var mitems=[];
for(var m=0;m <items.length;m++){
for(var n=0;n <data.length;n++){
var mitem=items[m].concat([]);
mitem.push(data[n]);
mitems.push(mitem);
//console.log(mitem);
//console.log(mitems);
}
}
items=mitems;

}
}
finalArr=finalArr.concat(items);
}
return finalArr;
}


//下面是调用和结果显示

var t=doubleCombo([32,[24,34,43,44,46,47],35,36,42],3)
for(var k=0,l=t.length;k <l;k++){
var a=t[k];
for(var j=0,l2=a.length;j <l2;j++)
document.write(a[j]+' ');
document.write(' <br/>');
}



...全文
4068 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
microlmj 2012-04-13
  • 打赏
  • 举报
回复
好多牛人啊,仰慕中……
marquetry 2012-04-01
  • 打赏
  • 举报
回复
这个标题。。。。
秋山澪 2012-04-01
  • 打赏
  • 举报
回复
路过,题目没看懂的+1.。。拿分保存地址留待强大了再看!
wy811214 2012-03-31
  • 打赏
  • 举报
回复
挺高深的,收藏慢慢消化
xw0125 2012-03-30
  • 打赏
  • 举报
回复
大师人才,路过一下!!!
linggan5230 2012-03-30
  • 打赏
  • 举报
回复
大神讨论算法 路过一下 ····
dlpzgr 2012-03-28
  • 打赏
  • 举报
回复
数字游戏,枯燥也有趣
黄袍披身 2012-03-27
  • 打赏
  • 举报
回复
稍微测试了一下,过段时间再来仔细消化代码 思想...

列位幸苦了.
jackfans 2012-03-27
  • 打赏
  • 举报
回复
好猛!!
猴头 2012-03-27
  • 打赏
  • 举报
回复
我太笨了,我太懒了,我现在都不喜欢算法的东西了

[Quote=引用 23 楼 helloyou0 的回复:]
嗯....同问....


引用 19 楼 yangball 的回复:

弱弱的问一下,不就是每行拿一个出来组合,使用循环递归不就行了?
不知是不是我理解错了
[/Quote]
whdrs 2012-03-27
  • 打赏
  • 举报
回复
额,有点不问题。。。
break_happy 2012-03-27
  • 打赏
  • 举报
回复
好神奇的说,拿分的说,拿分的说!!!!
十一文 2012-03-27
  • 打赏
  • 举报
回复
悲剧貌似没看懂题目
床上等您 2012-03-26
  • 打赏
  • 举报
回复
弱弱的问一下,不就是每行拿一个出来组合,使用循环递归不就行了?
不知是不是我理解错了
helloyou0 2012-03-26
  • 打赏
  • 举报
回复
嗯....同问....

[Quote=引用 19 楼 yangball 的回复:]

弱弱的问一下,不就是每行拿一个出来组合,使用循环递归不就行了?
不知是不是我理解错了
[/Quote]
wineer200 2012-03-26
  • 打赏
  • 举报
回复
script我喜欢,哪位大牛贴个纯java的,再来个纯c++的
挨踢直男 2012-03-26
  • 打赏
  • 举报
回复
用关系数据库去解决最方便
「已注销」 2012-03-26
  • 打赏
  • 举报
回复
可怜我连题目都没看懂啊! 目前还停留在使用手册方法的阶段
黄袍披身 2012-03-25
  • 打赏
  • 举报
回复
老大 位数 的意思是:
看例子好了,我说不清楚 哈哈

参与组合数据

01 02
03 04
05 06
07 08

交叉组合结果如下

4位组合
01 03 05 07
01 03 05 08
01 03 06 07
01 03 06 08
01 04 05 07
01 04 05 08
01 04 06 07
01 04 06 08
...
02 03 06 07
02 03 06 08
02 04 05 07
02 04 05 08
02 04 06 07
02 04 06 08
共16种组合

3位组合
01 03 05
01 03 06
01 04 05
01 04 06
02 03 05
02 03 06
...
01 04 07
01 04 08
...
01 05 07
01 05 08
...
02 05 07
....
共32种组合

2位组合
01 03
01 04
02 03
02 04
01 05
01 06
02 05
02 06
03 05
...
01 07
01 08
02 07
...
06 08
一共24组
===========

要注意的是包含但不局限于如下形式

01 02
03 04
05 06
07 08

可能是

01
02 03 04
05 06
07 08

----------------

01 02
03
04 05 06
07 08 09
10 11
12
------------------

等...
xuzuning 2012-03-25
  • 打赏
  • 举报
回复
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。
即集合中的每一个元素都要与右边集合的每一个元素构成新的集合

对于你的问题,应先求组合,再求笛卡尔积(如果不包含集合,就不用求了)

不太理解
得到组合结果(4位组合,要求可以根据条件得到不同位数的组合 例如3 2 )
这句话的意思
加载更多回复(8)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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