• Pythono 实现 Permutation


    不管在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

    总之,短短二十多行代码,写了不少时间。看来在算法方面还是需要大大地提高!

  • 相关阅读:
    userdel -删除使用者帐号及相关档案
    useradd -帐号建立或更新新使用者的资讯
    uptime
    uuid
    Web 在线文件管理器学习笔记与总结(7)重命名文件
    Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
    Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
    Java实现 LeetCode 114 二叉树展开为链表
    Java实现 LeetCode 114 二叉树展开为链表
    Java实现 LeetCode 114 二叉树展开为链表
  • 原文地址:https://www.cnblogs.com/foreverycc/p/3352458.html
Copyright © 2020-2023  润新知