Python论坛  - 讨论区

标题:[python-chinese] 组合生成算法!

2004年08月13日 星期五 11:17

Xie Yanbo idkey at 163.com
Fri Aug 13 11:17:56 HKT 2004

On 2004-08-13 10:57:1092365862 +0800, 王君 wrote:
> HD,您好!
> 	最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下:
> 
> 	给定 N 个基本字母(当然为了输入方便0<27)	,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。
> 
> 我原来的算法是:
> 
> 	通过递归的方法,每次确定组合数的一个字母的方法。
> 
> 发现的问题:
> 	但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法!

原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友
展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你
会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。
好运。



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年08月13日 星期五 11:20

guochen guochen at 1218.com.cn
Fri Aug 13 11:20:10 HKT 2004

Xie Yanbo,您好!

	N字母中M个全排的情况要复杂的多
首先是N中选M
然后是M全排
即使时间和结果数正比
但是结果数随M和N的变化可大了去了

======= 2004-08-13 11:17:00 您在来信中写道:=======

>On 2004-08-13 10:57:1092365862 +0800, 王君 wrote:
>> HD,您好!
>> 	最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下:
>> 
>> 	给定 N 个基本字母(当然为了输入方便0<27)	,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。
>> 
>> 我原来的算法是:
>> 
>> 	通过递归的方法,每次确定组合数的一个字母的方法。
>> 
>> 发现的问题:
>> 	但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法!
>
>原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友
>展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你
>会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。
>好运。
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese

= = = = = = = = = = = = = = = = = = = =
			

        致
礼!
 
				 
        guochen
        guochen at 1218.com.cn
          2004-08-13





[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年08月13日 星期五 11:21

limodou chatme at 263.net
Fri Aug 13 11:21:03 HKT 2004

Zoom.Quiet,您好!

	我看就是将4个数的所有组合计数出来,找到值为24的那个组合就是答案。不过,看了才知道是这么回事,以前从来没想出来过应该如何做。

======= 2004-08-13 08:43:57 您在来信中写道:=======

>Hollo hoxide:
>
>  不懂!
>http://wiki.woodpecker.org.cn/moin.cgi/PyPorgramGames
>
>启动了游戏收集!
>
>hoxide 解说一下子??
>
>
>/******** [2004-08-13]08:43:33 ; hoxide wrote:
>
>hoxide> 今天在网上同学求教1 5 6 7 用+-*/ 算出21. 
>hoxide> 自己曾经写过一个,但代码找不到了,偶知道24点的程序很多的说,
>hoxide> 于是到网上搜了一下.
>hoxide> 是有不少,
>hoxide> 但是一个用c++的(其实根本就不能叫用c++,全是c的语法),
>hoxide> 试了n多次,borlandc3.1和gcc都不能编译.
>hoxide> 还找到了vb,和web版的,看来都没用. 
>hoxide> 在偶找东西搞得焦头烂额的时候,偶同学自己算出来了.(到底怎么算用这个程序试试吧)
>
>hoxide> 为了以后不被这种问题困扰,花一个小时用python自己写了一个,还是python好~~~~~~~
>
>hoxide> funs = [ lambda x, item: (x+item[0],
>hoxide>                                str(x)+'+('+item[1]+')'
>hoxide>                               ),
>hoxide>       lambda x, item: (x-item[0],
>hoxide>                                str(x)+'-('+item[1]+')'
>hoxide>                               ),
>hoxide>       lambda x, item: (item[0]-x,
>hoxide>                                '('+item[1]+')-'+str(x)
>hoxide>                               ),
>hoxide>       lambda x, item: (x*item[0],
>hoxide>                                str(x)+'*('+item[1]+')'
>hoxide>                               ),
>hoxide>       lambda x, item:   (item[0]==0 and (0,'ZZZ')) or \
>hoxide>                         (x/item[0],
>hoxide>                                str(x)+'/('+item[1]+')'
>hoxide>                               ),
>hoxide>       lambda x, item:   (x==0 and (0,'ZZZ')) or \
>hoxide>                         (item[0]/x,
>hoxide>                                '('+item[1]+')/'+str(x)
>hoxide>                               )
>hoxide> ]
>
>hoxide> def con(num):
>hoxide>     l = len(num)
>hoxide>     p = list()
>hoxide>     if l==1: return {num[0]:str(num[0])}
>hoxide>     for i in range(l):
>hoxide>         for f in funs:
>hoxide>             p += map(lambda item: f(num[i],item),
>hoxide>                        con(num[:i]+num[i+1:]).items()
>hoxide>                     )
>hoxide>     return dict(p)
>
>hoxide> print con(map(float,[1,5,6,7])).get(21.0,0)
>
>
>hoxide> 代码我就不解释了,有问题就问吧.
>
>hoxide> 另外由于浮点计算的误差问题,".get(21.0,0"这句还不太完善,不过解决这个问题足够了,具体怎么完善大家都知道拉.
>
>hoxide>         hoxide
>hoxide>         hoxide_dirac at yahoo.com.cn
>hoxide>           2004-08-12
>
>
>********************************************/
>
>-- 
>Free as in Freedom
>
> Zoom.Quiet                           
>
>#=========================================#
>]Time is unimportant, only life important![
>#=========================================#
>
>sender is the Bat!2.12.00
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese
>

= = = = = = = = = = = = = = = = = = = =
			

        致
礼!
 
				 
        limodou
        chatme at 263.net
          2004-08-13


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年08月13日 星期五 11:27

王君 bearhand at tom.com
Fri Aug 13 11:27:06 HKT 2004

Xie Yanbo,您好!

	你说的N字母N组合的程序,我觉得你是不是弄错了,N字母N组合只有一种组合,你说的每次交换2个字母的位置,这个方法似乎是用来做排列的吧・!我这里说的是列举所有的组合情况。
 
======= 2004-08-13 11:17:00 您在来信中写道:=======

>On 2004-08-13 10:57:1092365862 +0800, 王君 wrote:
>> HD,您好!
>> 	最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下:
>> 
>> 	给定 N 个基本字母(当然为了输入方便0<27)	,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。
>> 
>> 我原来的算法是:
>> 
>> 	通过递归的方法,每次确定组合数的一个字母的方法。
>> 
>> 发现的问题:
>> 	但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法!
>
>原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友
>展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你
>会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。
>好运。
        致
礼!
 
				 
        王君
        bearhand at tom.com
          2004-08-13






[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2004年08月13日 星期五 11:30

guochen guochen at 1218.com.cn
Fri Aug 13 11:30:15 HKT 2004

王君,您好!

N字母M组合简单吧
首先就默认顺序是字典序列
这样就不用考虑是不是重复了
每个字母开头时只往后找

======= 2004-08-13 11:27:00 您在来信中写道:=======

>Xie Yanbo,您好!
>
>	你说的N字母N组合的程序,我觉得你是不是弄错了,N字母N组合只有一种组合,你说的每次交换2个字母的位置,这个方法似乎是用来做排列的吧・!我这里说的是列举所有的组合情况。
> 
>======= 2004-08-13 11:17:00 您在来信中写道:=======
>
>>On 2004-08-13 10:57:1092365862 +0800, 王君 wrote:
>>> HD,您好!
>>> 	最近,看了下组合数学的一些书,心血来潮,决定把组合数的生成算法,编个程序。可是,自己动手一试,发现原来自己想的算法原来速度非常慢,想了很久,终没有什么好的方法,我现在把问题描述如下:
>>> 
>>> 	给定 N 个基本字母(当然为了输入方便0<27)	,把N个字母的任意 M 组合情况列举出来(可以输出在文件中)。
>>> 
>>> 我原来的算法是:
>>> 
>>> 	通过递归的方法,每次确定组合数的一个字母的方法。
>>> 
>>> 发现的问题:
>>> 	但是后来发现,这个算法只能应付 N 比较小的情况,一旦 N 大起来,整个算法就需要执行非常久,不知道大家有没有好的方法!
>>
>>原来写过一个N字母N组合的程序,是在学习 unittest 时写的,也是为了向朋友
>>展示一下 python 的效率。如果你象我一样,每次只 swap 两个字母的位置,你
>>会发现程序可以在四五行里搞定,而且运行时间只和结果的数量成线性正比。
>>好运。
>        致
>礼!
> 
>				 
>        王君
>        bearhand at tom.com
>          2004-08-13
>
>
>
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese

= = = = = = = = = = = = = = = = = = = =
			

        致
礼!
 
				 
        guochen
        guochen at 1218.com.cn
          2004-08-13





[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号