不管在R 还是python中,都有现成的函数来轻而易举地进行全排列(Permutation)、无序排列等等。今天想要尝试一下使用自己写代码来实现全排列。
首先,我采用的算法如下:
对于一个数列 i.e. 1,2,3,4 想要进行全排列:
在第一个位置可以放入1 ,2,3,4
如果第一个位置为1, 第二个位置则 只能放 2,3,4 ...
如果第一、二个位置为1,2, 第三个位置只能放3 or 4
大致思路:
第一次:[[1],[2],[3],[4]]
第二次:[[[1],[2]],[[1],[3]],[[1],[4]],...]
第三次:[[[1],[2],[3]],[[1],[2],[4]],[[1],[3],[2]],...]
第四次:[[[1],[2],[3],[4]],[[1],[2],[4],[3]],...]
在这样的思想下,写出如下代码:
1 n = 5 2 List = [[1],[2],[3],[4],[5]] #数据结构非常重要,如果是[1,2,3,4,5]则很难work! 3 Grow_List = List 4 Count = 1 5 while Count <= (n-1): 6 Output_List = [] #每一次循环完毕将Output_List归零,这个非常重要。否则会导致Output_List仍包含之前内容 7 for i in Grow_List: 8 Temp = List[:] #浅拷贝非常重要!如果不是浅拷贝,将导致List的改变 9 print "i:",i 10 if len(i) == 1: #发现在i为一个元素和多个元素的时候,需要做的事情不同, 11 Temp.remove(i) #将已有元素移除掉,便于进行排列组合 12 elif len(i) >=2: 13 for j in i: 14 Temp.remove(j) 15 for k in Temp: 16 if len(i) == 1: #i为一个元素和多个元素的时候,所需操作略有不同 17 t = [i[:]] 18 elif len(i) >=2: 19 t = i[:] 20 t.append(k) #先对元素进行添加,再添加到Output_List当中 21 print "t:",t 22 Output_List.append(t) 23 Grow_List = Output_List 24 Count += 1
总之,短短二十多行代码,写了不少时间。看来在算法方面还是需要大大地提高!