回溯算法-01遍历所有排列方式问题
生活随笔
收集整理的這篇文章主要介紹了
回溯算法-01遍历所有排列方式问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
遍歷所有排列方式
- 前言
- 回溯采用試錯的方法解決問題,一旦發現當前步驟失敗,回溯算法就返回上一個步驟,繼續另一種方案繼續試錯。
- 回溯算法的優點是速度快,沒有嘗試所有路徑就可能找到答案。當然,如果運氣不好,回溯算法就是一個暴力遍歷(當答案就是最后一條搜索路徑)。
- 回溯算法又稱為試探法,它的主要思想如上。回溯算法針對大多數問題有如下特點:問題的答案有多個元素、答案需要滿足一些約束(如數獨)、尋找答案的方式每個步驟相同。回溯算法逐漸構建答案,并在確定候選元素不滿足約束后立即放棄候選元素,知道找到答案的所有元素。
- 簡介
- 全排列一般答案為n!種方案,但是當想知道所有的排列方式的時候,DP等算法就不是那么合適了。此時回溯將是不錯的選擇。
- 問題描述
- 有四本書A,B,C,D,一次只能從圖書館借一本,試問有多少種借書方式?
- 問題分析
- 這個問題很簡單,不妨認為有4個空位,第一個位置選擇了A,那么第二個位置剩下三種選擇,假設第二個位置選擇了B,第三個位置剩下兩種選擇,以此類推。顯然,單純寫這個代碼是個四層循環,這樣寫不僅編碼困難,對其他問題還要重新編碼并且必須要知道輸入數組的長度,這不是想要的解法。
- 其實再看看這個循環,它們都很類似。
- 選擇第一本書有4中選擇,答案就是這四種選擇各結尾增加剩下的三本書的排列情況,那么只需要知道剩余三本書的排列集合就行了。
- 排列剩下的三本書的時候,對第一本有三種選擇,只需要知道剩下兩種排列情況即可。
- 最后,排兩本書的時候,只需要知道最后一本是什么就行了。
- 其實就是一個大問題套著小問題,問題都是一個問題,參數有所不同罷了,問題是一樣的:輸出排序集合。
- 帶修改參數遞歸很適合實現這樣的問題。
- 代碼
- # -*-coding:utf-8-*-result = []def solve(array, solution):global resultif len(array) == 0:# 表示所有書都分配完畢,輸出答案result.append(solution)returnfor i in range(len(array)):new_solution = solution + [array[i]]new_array = array[:i] + array[i+1:]solve(new_array, new_solution)if __name__ == '__main__':input = ['A', 'B', 'C', 'D']solve(input, [])for item in result:print(item)print("共{}種排列".format(len(result)))
- 運行結果
- 補充說明
- 具體代碼可以查看我的Github,歡迎Star或者Fork
- 參考書《你也能看得懂的Python算法書》
- 書中錯誤已經修改
總結
以上是生活随笔為你收集整理的回溯算法-01遍历所有排列方式问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广度优先遍历算法-03树的右侧问题
- 下一篇: 回溯算法-02遍历所有组合方式问题