求助万能的 V 友一个排序问题

2015-05-27 20:33:26 +08:00
 nevin47

最近做一个算法脑袋短路卡了半天了,其实不能严格说是一个排序问题

大致问题如下:
有一串数组:0 0 0 0 0... 0 0 0(n个0)
现在插入1~n个1进去
如:插入一个1
1 0 0... 0 0 0
0 1 0... 0 0 0
...
0 0 0... 0 0 1
插入两个1
1 1 0... 0 0 0
1 0 1... 0 0 0
...
0 0 0... 0 1 1
求所有情况

万能的V友能给个解决思路么

2010 次点击
所在节点    问与答
19 条回复
Gonster
2015-05-27 20:44:23 +08:00
这是数学问题C n+1, 2
batman2010
2015-05-27 20:47:29 +08:00
把数组视为一个二进制数,之后做二进制减法。不过,这样的话顺序就和你给的有点不一样了。
nevin47
2015-05-27 20:49:17 +08:00
@batman2010 好像是个思路!我试试python二进制减法怎么做
顺序其实无所谓的,只要把所有情况求出来就行了
Gonster
2015-05-27 21:18:56 +08:00
刚刚说错了....

如果如果只是求没每种插入的组合数 那么n个零插入k个1号最后会有n+k位
从n+k个位置中选出k个放1
组合数为C(n+k,k)
theFool
2015-05-27 21:26:26 +08:00
@Gonster
不对吧。0110 比如这样的你算两遍了。
个数应该为(n+1)^k吧。
Gonster
2015-05-27 21:32:20 +08:00
@theFool 你说的0110号 n=2 k=2
C(2+2,2)=4*3/2=6
1100 1010 1001 0110 0101 0011
theFool
2015-05-27 21:35:43 +08:00
@Gonster 不要理我。。组合数弄错了。。sorry sorry.
linhua
2015-05-27 21:35:56 +08:00
分析一下:输入两个参数,循环嵌套数目(乘号数目)取决于k,估计要用到递归。
如有不正,请指出。
Gonster
2015-05-27 21:36:31 +08:00
win8.1自带的输入法怎么这么诡异 .... 输入数字以后按空格一定会补一个号字....
comicfans44
2015-05-27 21:59:30 +08:00
如果不要求顺序的话
这不就是把 000到 111 所有二进制数字列一遍吗...

000
001
010
100
101
110
111

所有情况就是 2^n次方
linxy
2015-05-27 22:02:18 +08:00
设F(i)为插入第i个时的情况总数
有F(i)=F(i-1)×(C (1,n+i+1) / i ! )
以上
如果是要输出所有的情况…我再想想

有误之处请指正
comicfans44
2015-05-27 22:03:13 +08:00
...少写了一个011
linxy
2015-05-27 22:03:42 +08:00
对了,上面i不等1.因为没有定义0个1插入并没有实际意义
linxy
2015-05-27 22:05:26 +08:00
不对,递推式要有个初值才行,实际上还要给出F(0)=1
liuhaotian
2015-05-27 22:14:05 +08:00
恩 @Gonster 的这个是对的... 半年不做数学题了,差点连这道题也解不来
black
2015-05-27 22:20:24 +08:00
是插入吧?n 个 0, 插入 m 个 1 的话,可能的组合是 C(n + m, m),m是上标
black
2015-05-27 22:27:52 +08:00
另外我觉得既然限定条件 1~n 个1,那么这题可能不是 “插入”,而是将 n 个 0 的某 m 位 “置为” 1,如果是这种情况,那么可能的组合数是 C(n, m),m是上标
nevin47
2015-05-28 00:14:00 +08:00
居然好多V友帮忙回复
此问题已经解决,因为无所谓具体顺序,就是按照@batman2010 给的思路做了一个递减转二进制然后转List搞定

再次感谢大家~要是有好的想法还可以再继续交流哈哈
nevin47
2015-05-28 00:14:34 +08:00
@black 对的,不是插入。是生成

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/194215

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX