日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯算法-01遍历所有排列方式问题

發布時間:2024/4/11 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯算法-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遍历所有排列方式问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。