排列窮舉算法

今天看到一篇博文 玩?zhèn)€算法題:1-5的排列組合問題 覺得挺有意思。鑒于博主寫的是死代碼,于是決定自己實(shí)現(xiàn)一個(gè)動(dòng)態(tài)排列窮舉算法,問題抽象為從不重復(fù)元素集合 n 中抽取 r 個(gè)元素進(jìn)行排列,總共有多少種不同的排列?

代碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-

from copy import copy

# 排列窮舉練習(xí)

# 從 集合 n 中選取 r 個(gè)元素進(jìn)行排列,窮舉所有排列
# n,待排列元素組成的集合,可以是 list 或者 set 或者 tuple
# r,從 n 中選取 r 個(gè)元素,進(jìn)行排列
# return, list
def permute(n, r):
    if len(set(n)) < len(n): # 有重復(fù)元素
        raise error("元素重復(fù)")

    n = tuple(n)

    item_count = len(n)

    if item_count < r: # r 不能大于 n 元素的個(gè)數(shù)
        raise error("r 不能大于 n 中元素的數(shù)目")

    flag = [0 for x in xrange(0,r)]

    # 根據(jù) flag 從 n 中取元素
    def permute_with_flag(flag):
        source = list(n)    
        target = []

        for x in flag:
            target.append(source[x])
            source.remove(source[x])

        return target # 輸出

    # flag 自增算法
    # 自增到最大值時(shí) return False
    def increse_flag(flag):
        flag[0] += 1

        for x in xrange(0,len(flag)):
            if flag[x] == item_count - x:
                flag[x] = 0
                if x+1 < len(flag):
                    flag[x+1] += 1

        if flag.count(0) == len(flag):
            return False

        return True

    permutation = [permute_with_flag(flag)]
    while increse_flag(flag):
        permutation.append(permute_with_flag(flag))
    
    return permutation
        

def main():
    n = set((1, 2, 3, 4, 5))
    m = permute(n, 5)
    for x in m:
        print x


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,169評論 25 708
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 馬上要比賽了,可是看書依然是比較痛苦和煎熬。玩手機(jī)卻不會(huì),很開心的過去了兩個(gè)小時(shí),人生中第一次無比體驗(yàn)到了相對論的...
    大圓圓圈閱讀 380評論 0 0
  • Jsoup官方給出的文檔,鏈接:http://www.open-open.com/jsoup/ 描述問題: 學(xué)校教...
    猿猴星閱讀 2,482評論 0 1
  • 水中看樹 水中看天 水中看云 倒立世界 水在晃動(dòng) 樹在變樣 畫面不亂 反而更美 半邊是樹 半邊是天 一半一半 各顯...
    故夢j閱讀 518評論 4 5

友情鏈接更多精彩內(nèi)容