網(wǎng)站首頁 編程語言 正文
遞歸和迭代的差異
簡單對比一下遞歸和迭代的差異,針對全排列問題,一個用遞歸實(shí)現(xiàn),一個用迭代(深度優(yōu)先,廣度優(yōu)先)的方式分別實(shí)現(xiàn),均在相同計算機(jī)環(huán)境下比較。
計算機(jī) | 配置 |
---|---|
處理器 | 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]]
實(shí)驗(yàn):
依次測試[1],[1,2],[1,2,3],…,[1,…,10]算例,記錄兩個方法所用時間,結(jié)果如圖所示。算法運(yùn)行時間限制60s,超過即停止。
結(jié)論: 迭代(深度優(yōu)先)和遞歸差不多,與預(yù)期相符;迭代(廣度優(yōu)先)速度差很多,代碼實(shí)現(xiàn)是一方面,廣度優(yōu)先循環(huán)次數(shù)遠(yuǎn)遠(yuǎn)多余前面兩者。總體而言:
- 遞歸現(xiàn)實(shí)最為簡潔,沒有無效搜索,缺點(diǎn)是難以debug,問題復(fù)雜以后需要一定經(jīng)驗(yàn);
- 迭代(深度優(yōu)先)教易理解和調(diào)試,推薦;
- 迭代(廣度優(yōu)先)慎用!!!
實(shí)驗(yàn)代碼:
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-07-09 C語言堆與二叉樹的順序結(jié)構(gòu)與實(shí)現(xiàn)_C 語言
- 2022-12-21 C和C++中argc和argv的含義及用法詳解_C 語言
- 2023-07-17 在Linux下禁用、添加|修改Swap分區(qū)(虛擬內(nèi)存)教程
- 2022-10-08 Python中集合創(chuàng)建與使用詳解_python
- 2022-09-03 利用python合并csv文件的方式實(shí)例_python
- 2022-09-28 基于OpenCV(python)的實(shí)現(xiàn)文本分割之垂直投影法_python
- 2022-04-12 git error: failed to push some refs to
- 2022-05-09 Docker?Overlay2磁盤空間占用過大清理的方法實(shí)現(xiàn)_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 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)雅實(shí)現(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)程分支