不管在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
總之,短短二十多行代碼,寫了不少時間。看來在算法方面還是需要大大地提高!