where the amazing happens

全排列和其他

昨天上午去面试的一道题,当场没想出来,回来花了点时间补完了下发回去.

原题要求用java,用python只是为了方便。用回溯法快,但是还是坚持用遍历森林来写,这也是面试时没想完的思路,呵呵,我就是自找麻烦的硬石头性格。

最先想到用无向连通图进行深度优先搜索,但是没有考虑到结束条件。对于N个待排列的数字,每个节点都有N-1个出口和入口,而用树状结构每个节点只有一个父节点,存在递归返回的条件。但是这个方法的实用性只限制在当排列数很少(N < 8)时。当N>8时算法消耗的时间明显增加(一共8*7*6*5*4*3*2*1=40320种组合),当N>1000时(当然,这种情况是不敢想像的)就会达到python的递归极限。所以真正如果要干点什么的话(当然,高中生都知道全排列拿52张扑克牌出来排一下结果集就是个天文数字),这显然不是个好算法。


#coding=utf-8

# 数字全排列
#
Chris Zheng 2007-06-05

import sys, os


#待排列的数字
NUMS = [1,2,3,4