網(wǎng)站首頁 編程語言 正文
遞歸和迭代的差異
簡單對比一下遞歸和迭代的差異,針對全排列問題,一個用遞歸實現(xiàn),一個用迭代(深度優(yōu)先,廣度優(yōu)先)的方式分別實現(xiàn),均在相同計算機環(huán)境下比較。
計算機 | 配置 |
---|---|
處理器 | Intel? Core? i7-8700K CPU @ 3.70GHz,3696 Mhz,6 個內(nèi)核,12 線程 |
總的物理內(nèi)存 | 16.0 GB |
題目:力扣-46.全排列
給定一個不含重復(fù)數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。
示例 1:
輸入:nums = [1,2,3]
輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
輸入:nums = [0,1]
輸出:[[0,1],[1,0]]
實驗:
依次測試[1],[1,2],[1,2,3],…,[1,…,10]算例,記錄兩個方法所用時間,結(jié)果如圖所示。算法運行時間限制60s,超過即停止。
結(jié)論: 迭代(深度優(yōu)先)和遞歸差不多,與預(yù)期相符;迭代(廣度優(yōu)先)速度差很多,代碼實現(xiàn)是一方面,廣度優(yōu)先循環(huán)次數(shù)遠(yuǎn)遠(yuǎn)多余前面兩者。總體而言:
- 遞歸現(xiàn)實最為簡潔,沒有無效搜索,缺點是難以debug,問題復(fù)雜以后需要一定經(jīng)驗;
- 迭代(深度優(yōu)先)教易理解和調(diào)試,推薦;
- 迭代(廣度優(yōu)先)慎用!!!
實驗代碼:
from time import time
import matplotlib.pyplot as plt
from tqdm import trange
def recursion(nums):
'遞歸'
res = []
def backtrack(nums, tmp):
if not nums:
res.append(tmp)
return
for i in range(len(nums)):
backtrack(nums[:i] + nums[i+1:], tmp + [nums[i]])
backtrack(nums, [])
return res
def iteration_dfs(nums):
'迭代循環(huán) —— 深度優(yōu)先'
res = []
Queue = [[i] for i in nums]
while Queue:
q = Queue.pop(-1)
if len(q) == len(nums):
res.append(q)
continue
for i in nums:
if i not in q:
q_ = q[:]
q_.append(i)
if q_ not in Queue:
Queue.append(q_)
return res
def iteration_bfs(nums):
'迭代循環(huán) —— 廣度優(yōu)先'
res = []
Queue = [[i] for i in nums]
while Queue:
q = Queue.pop(0)
if len(q) == len(nums):
res.append(q)
continue
for i in nums:
if i not in q:
q_ = q[:]
q_.append(i)
if q_ not in Queue:
Queue.append(q_)
return res
x = list(range(1,11))
y1 = []
y2 = []
for i in trange(1,11):
input = list(range(i))
s1 = time()
res1 = recursion(input)
s1time = time()-s1
y1.append(s1time)
s2 = time()
res2 = iteration_dfs(input)
s2time = time()-s2
y2.append(s2time)
s3 = time()
res3 = iteration_bfs(input)
s3time = time()-s3
y3.append(s3time)
plt.plot(x,y1,color='b',label='recursion')
plt.plot(x,y2,color='g',label='iteration_dfs')
plt.plot(x,y3,color='r',label='iteration_bfs')
plt.legend()
plt.xlabel('問題規(guī)模')
plt.ylabel('時間(s)')
# plt.savefig('results.jpg')
原文鏈接:https://blog.csdn.net/DCXY71/article/details/126979069
相關(guān)推薦
- 2022-10-01 Python?Color類與文字繪制零基礎(chǔ)掌握_python
- 2022-03-22 ASP.NET Core中如何使用Dapper
- 2022-07-26 3dmax2021 中的各種顯示相關(guān)如何設(shè)置?
- 2022-10-30 Python標(biāo)準(zhǔn)庫中的logging用法示例詳解_python
- 2023-03-28 Python中l(wèi)ist列表添加元素的3種方法總結(jié)_python
- 2022-05-10 電商后臺開發(fā)之商品規(guī)格組合算法
- 2022-04-25 ASP.NET?Core中Razor頁面與MVC區(qū)別介紹_實用技巧
- 2023-04-01 JQuery動態(tài)生成的按鈕無法觸發(fā)問題及完美解決方法_jquery
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支