电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python 回溯法模板詳解

瀏覽:18日期:2022-08-06 08:59:45

什么是回溯法

回溯法(探索與回溯法)是一種選優(yōu)搜索法,又稱為試探法,按選優(yōu)條件向前搜索,以達到目標(biāo)。但當(dāng)探索到某一步時,發(fā)現(xiàn)原先選擇并不優(yōu)或達不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個狀態(tài)的點稱為“回溯點”。

無重復(fù)元素全排列問題

給定一個所有元素都不同的list,要求返回list元素的全排列。

設(shè)n = len(list),那么這個問題可以考慮為n叉樹,對這個樹進行dfs,這個問題里的回溯點就是深度(也就是templist的長度)為n時,回溯的條件就是當(dāng)前元素已經(jīng)出現(xiàn)在templist中了。

回溯法與遞歸:

回溯法是一種思想,遞歸是一種形式

class Solution(object): #rtlist用來存儲所有的返回所有排列,templist用來生成每個排列 def backtrack(self,rtlist,templist,nums): if(len(templist) == len(nums)): rtlist.append(templist[:]) else: for i in nums:if(i in templist): #如果在當(dāng)前排列中已經(jīng)有i了,就continue,相當(dāng)于分支限界,即不對當(dāng)前節(jié)點子樹搜尋了 continuetemplist.append(i)self.backtrack(rtlist,templist,nums)templist.pop() #把結(jié)尾的元素用nums中的下一個值替換掉,遍歷下一顆子樹 def permute(self,nums): rtlist = [] templist = [] self.backtrack(rtlist,templist,nums) return rtlist

nums=[1,2,3]時的樹結(jié)構(gòu):

python 回溯法模板詳解

關(guān)鍵的就是確定好分支限界以及回溯點。

這里面有一個問題就是每次遞歸時把新加入的元素從nums刪除在遞歸可不可以,實際上這樣的時間復(fù)雜度并不會減少太多,因為對list進行操作還需要一定的時間,而原解法中因為有分支限界所以時間復(fù)雜度也不會太差。

有重復(fù)元素全排列

這個問題和上面的區(qū)別主要在于分支限界的差別,不能在使用出現(xiàn)重復(fù)元素作為回溯條件了,否則所有的都不滿足。

這里我們應(yīng)該使用計數(shù)器記錄nums中每個元素出現(xiàn)的次數(shù),如果當(dāng)前元素超過次數(shù)則返回,但是這里還有一個問題就是可能會出現(xiàn)同樣的排列多次,這里的解決辦法就是同一層不許出現(xiàn)重復(fù)元素,這里有兩種解決辦法,一種是直接傳入distinct的數(shù)組,還有一種是使用一個集合記錄當(dāng)前層已使用的元素。

第一種方法:

from collections import Counterclass Solution(object): def backtrack(self, rtlist, tmplist, counter, nums, length): if len(tmplist) == length:#回溯點 rtlist.append(tmplist[:]) else: for i in nums:#橫向遍歷if counter[i] == 0:#分支限界 continuecounter[i] -= 1tmplist.append(i)self.backtrack(rtlist, tmplist, counter, nums, length)#縱向遍歷counter[i] += 1tmplist.pop() def permuteUnique(self, nums): rtlist, tmplist, counter = [], [], Counter(nums) length = len(nums) self.backtrack(rtlist, tmplist, counter, list(set(nums)), length) return rtlist

第二種

from collections import Counterclass Solution(object): def backtrack(self, rtlist, tmplist, level, counter, nums): if len(tmplist) == len(nums): rtlist.append(tmplist[:]) else: for i in nums:if i in level or counter[i] == 0: continuecounter[i] -= 1tmplist.append(i)level.add(i)self.backtrack(rtlist, tmplist, set(), counter, nums)counter[i] += 1tmplist.pop() def permuteUnique(self, nums): if not nums: return [] rtlist, tmplist, level, counter = [], [], set(), Counter(nums) self.backtrack(rtlist, tmplist, level, counter, nums) return rtlist

在遞歸時不能用“=”修改父函數(shù)的變量,因為“=”只能改變變量的指向,要修改父函數(shù)的變量要直接在內(nèi)存中修改,例如放入容器中可以直接找到變量內(nèi)存地址。通常使用container.method()。

例如在上面的程序中如果我們想要在回溯點把counter復(fù)原不能使用counter = Counter(nums),而是應(yīng)該逐個修改counter[key]

總結(jié)

回溯法其實就是把原問題考慮成一棵樹,我們遍歷這棵樹在不可能的地方返回,不在遍歷這個節(jié)點的子樹,在滿足要求時返回。

所以在回溯法中,關(guān)鍵的就是找出合理的分支限界(重要),和返回條件。

更多請參考

多叉樹的遍歷方法:

def travel(root):  遍歷root  for subtree_root in 當(dāng)前層所有節(jié)點: travel(subtree_root)

在for中對一層的所有節(jié)點都執(zhí)行了travel,又因為對所有節(jié)點的所有子樹都執(zhí)行了travel,所以可以完成遍歷。

以上這篇python 回溯法模板詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 七维官网-水性工业漆_轨道交通涂料_钢结构漆 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 云杂志网-学术期刊-首页| 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 楼承板-开口楼承板-闭口楼承板-无锡海逵 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 |