主頁 >  其他 > 【技識訓累】演算法中的回溯演算法【一】

【技識訓累】演算法中的回溯演算法【一】

2023-06-13 08:03:28 其他

回溯演算法是什么

回溯演算法是一種用于求解在某個搜索空間中的問題的演算法,它基本思想是從問題的某一種狀態開始不斷地嘗試各種可能的選擇,直到找到一種滿足問題要求的解或者發現這些選擇都無法滿足要求時,就回到上一個狀態,嘗試其他的選擇,

回溯演算法通常采用遞回的方法實作,它會不斷地遞回呼叫自身,同時通過引數來模擬每一種選擇的結果,并在遞回回傳時撤銷這種選擇,繼續尋找其他可能的選擇,

回溯演算法通常用于求解組合問題、排列問題、選擇問題等,例如求解 n 皇后問題、數獨問題等,在實際應用中,回溯演算法往往需要通過一些優化方法來減少搜索空間,以達到更高的效率和更快的求解速度,

回溯演算法的應用場景有哪些

回溯演算法的應用場景包括但不限于:

  1. 生成排列和組合問題,如全排列、組合問題等,

  2. 解決搜索問題,如圖的遍歷、迷宮問題等,

  3. 解決約束條件滿足問題,如數獨、八皇后、數塔問題等,

  4. 解決最優化問題,如背包問題、旅行商問題等,

  5. 解決字串匹配問題,如正則運算式匹配、通配符匹配等,

  6. 解決人工智能領域的問題,如游戲博弈、機器學習等,

  7. 解決決策問題,如規劃和調度問題等,

  8. 解決網路流問題,

總之,回溯演算法可以解決許多復雜的問題,在實際應用中具有廣泛的應用

回溯演算法的優點和缺點是什么

回溯演算法的優點:

  1. 適用范圍廣:回溯演算法可以解決很多問題,如搜索、排列組合、八皇后、數獨等,
  2. 演算法思路簡單:回溯演算法的思路簡單,易于理解和實作,
  3. 可以找到所有解:回溯演算法可以找到所有的解,不會漏掉任何一個解,

回溯演算法的缺點:

  1. 時間復雜度高:回溯演算法的時間復雜度很高,因為它需要遍歷所有的解空間,搜索時間可能會很長,
  2. 空間復雜度高:回溯演算法的空間復雜度也很高,因為它需要維護一個狀態樹,存盤所有的狀態和路徑,
  3. 可能會陷入死回圈:如果回溯演算法沒有正確地剪枝,可能會陷入死回圈,導致程式無法結束,

回溯演算法的時間復雜度和空間復雜度是多少?

回溯演算法的時間復雜度和空間復雜度都與問題規模和決策樹的分支情況有關,

時間復雜度: 在最壞情況下,回溯演算法需要遍歷整個決策樹,即每個節點都需要訪問一次,所以時間復雜度為O(b^d),其中b是分支因子,d是決策樹的深度,因此,回溯演算法的時間復雜度通常比較高,在面對大規模問題時可能需要較長時間,

空間復雜度: 在回溯演算法中,需要維護一個候選解的狀態,通常使用遞回呼叫堆疊來實作,因此,空間復雜度也與決策樹的深度相關,在最壞情況下,決策樹的深度與問題規模成正比,因此空間復雜度為O(d),其中d為決策樹的深度,如果在實作回溯演算法時沒有使用遞回,可以使用回圈和堆疊來代替遞回呼叫堆疊,這樣可以避免遞回呼叫堆疊導致的空間限制,但是實作起來相對復雜,

回溯演算法解決八皇后問題

八皇后問題是計算機科學中的經典問題,涉及將八個皇后放置在一個8x8的棋盤上,以使沒有兩個皇后相互威脅,這意味著不能將兩個皇后放在同一行、列或對角線上,

  1. 定義問題:八皇后問題涉及將八個皇后放置在一個8x8的棋盤上,以使沒有兩個皇后相互威脅,
  2. 創建棋盤:創建一個8x8的棋盤并將所有方格初始化為0,
  3. 放置皇后:從第一列開始,在第一行放置一個皇后,
  4. 檢查沖突:檢查皇后是否與棋盤上的任何其他皇后發生沖突,如果存在沖突,則將皇后移到同一列中的下一行,
  5. 重復步驟3和4:繼續在每一列中放置皇后并檢查沖突,直到所有皇后都放置在棋盤上,
  6. 回溯:如果在列中沒有有效的皇后位置,則回溯到上一列并將皇后移到該列的下一行,重復此程序,直到找到有效的解決方案,
function solveEightQueens(board, col): 
  if col >= 8: 
    return true 
 
  for row in range(0, 8): 
    if isSafe(board, row, col): 
      board[row][col] = 1 
      if solveEightQueens(board, col+1): 
        return true 
      board[row][col] = 0 
 
  return false 
 
function isSafe(board, row, col): 
  for i in range(0, col): 
    if board[row][i] == 1: 
      return false 
 
  for i, j in zip(range(row, -1, -1), range(col, -1, -1)): 
    if board[i][j] == 1: 
      return false 
 
  for i, j in zip(range(row, 8, 1), range(col, -1, -1)): 
    if board[i][j] == 1: 
      return false 
 
  return true 
 
// initialize board to all 0's 
board = [[0 for x in range(8)] for y in range(8)] 
 
// solve the problem 
solveEightQueens(board, 0)

回溯演算法解決數獨問題

數獨是一個9x9的網格,被分成9個小的3x3的網格,目標是填充網格,使每行、每列和每個3x3網格都包含1到9的數字,且沒有重復,

  1. 從一個空的數獨網格開始,
  2. 在網格中找到一個空的單元格,
  3. 嘗試在該單元格中放置1到9的所有數字,
  4. 如果數字有效(即不違反任何數獨規則),則移動到下一個空的單元格并重復步驟3,
  5. 如果數字無效,則嘗試下一個數字,
  6. 如果所有數字都已嘗試且沒有一個有效,則回溯到上一個單元格并嘗試下一個數字,
  7. 重復步驟3到6,直到整個網格都被填滿,
function solveSudoku(grid):
  for i in range(9):
    for j in range(9):
      if grid[i][j] == 0:
        for k in range(1, 10):
          if isValid(grid, i, j, k):
            grid[i][j] = k
            if solveSudoku(grid):
              return True
            grid[i][j] = 0
        return False
  return True
 function isValid(grid, row, col, num):
  for i in range(9):
    if grid[row][i] == num:
      return False
    if grid[i][col] == num:
      return False
    if grid[3 * (row // 3) + i // 3][3 * (col // 3) + i % 3] == num:
      return False
  return True

solveSudoku函式接受一個9x9的網格作為輸入,并在數獨可解時回傳True,否則回傳False,它使用嵌套回圈來迭代網格中的所有單元格,如果一個單元格為空(即其值為0),它使用另一個回圈嘗試在該單元格中放置1到9的所有數字,如果數字有效(即不違反任何數獨規則),則移動到下一個空的單元格并重復該程序,如果數字無效,則嘗試下一個數字,如果所有數字都已嘗試且沒有一個有效,則回溯到上一個單元格并嘗試下一個數字,isValid函式通過檢查數字是否違反任何數獨規則(即是否已經存在于同一行、列或3x3網格中)來檢查數字是否有效,

回溯演算法解決全排列問題

給定一個數字序列,要求輸出所有可能的排列組合,

  1. 定義一個遞回函式,用于生成所有可能的排列組合,
  2. 在遞回函式中,先判斷當前生成的排列是否已經包含了所有數字,如果是,則輸出當前排列并回傳,
  3. 如果當前排列還沒有包含所有數字,就從剩余的數字中選擇一個,加入當前排列中,并繼續遞回生成下一個數字的排列,
  4. 在遞回完成后,需要將加入的數字從當前排列中移除,以便繼續生成其他排列組合,
function backtrack(nums, path, res):
    if len(path) == len(nums):
        res.append(path)
        return
    for num in nums:
        if num not in path:
            path.append(num)
            backtrack(nums, path[:], res)
            path.pop()

backtrack函式接受三個引數:nums表示給定的數字序列,path表示當前生成的排列,res表示所有可能的排列組合,在函式中,首先判斷當前生成的排列是否已經包含了所有數字,如果是,則將當前排列加入結果集中并回傳,如果當前排列還沒有包含所有數字,就從剩余的數字中選擇一個,加入當前排列中,并繼續遞回生成下一個數字的排列,在遞回完成后,需要將加入的數字從當前排列中移除,以便繼續生成其他排列組合,

回溯演算法解決組合問題

給定一個陣列和一個目標值,從陣列中選取元素使得它們的和等于目標值,

  1. 定義一個遞回函式,用于生成所有可能的組合,
  2. 在遞回函式中,先判斷當前組合的元素和是否等于目標值,如果是,則輸出當前組合并回傳,
  3. 如果當前組合的元素和小于目標值,就從剩余的元素中選擇一個,加入當前組合中,并繼續遞回生成下一個元素的組合,
  4. 在遞回完成后,需要將加入的元素從當前組合中移除,以便繼續生成其他組合,
function backtrack(nums, target, start, path, res):
    if sum(path) == target:
        res.append(path)
        return
    for i in range(start, len(nums)):
        if sum(path) + nums[i] > target:
            continue
        path.append(nums[i])
        backtrack(nums, target, i, path[:], res)
        path.pop()

backtrack函式接受五個引數:nums表示給定的陣列,target表示目標值,start表示當前開始選擇的位置,path表示當前生成的組合,res表示所有可能的組合,在函式中,首先判斷當前組合的元素和是否等于目標值,如果是,則將當前組合加入結果集中并回傳,如果當前組合的元素和小于目標值,就從剩余的元素中選擇一個,加入當前組合中,并繼續遞回生成下一個元素的組合,在遞回完成后,需要將加入的元素從當前組合中移除,以便繼續生成其他組合,

回溯演算法解決單詞搜索問題

在一個二維字符陣列中查找給定單詞是否存在,

  1. 定義一個遞回函式,用于生成所有可能的路徑,
  2. 在遞回函式中,先判斷當前位置是否為單詞的最后一個字符,如果是,則回傳True,
  3. 如果當前位置不是單詞的最后一個字符,則從當前位置向四周擴展,如果擴展的位置是合法的并且沒有走過,則將該位置加入當前路徑中,并繼續遞回生成下一個位置的路徑,
  4. 在遞回完成后,需要將加入的位置從當前路徑中移除,以便繼續生成其他路徑,
  5. 如果所有路徑都生成完畢,仍未找到單詞,則回傳False,

function backtrack(board, word, row, col, path):
    if len(path) == len(word):
        return True
    if row < 0 or row >= len(board) or col < 0 or col >= len(board[0]) or board[row][col] != word[len(path)]:
        return False
    temp = board[row][col]
    board[row][col] = "#"
    res = backtrack(board, word, row + 1, col, path + [(row, col)]) or backtrack(board, word, row - 1, col, path + [(row, col)]) or backtrack(board, word, row, col + 1, path + [(row, col)]) or backtrack(board, word, row, col - 1, path + [(row, col)])
    board[row][col] = temp
    return res
 def exist(board, word):
    for i in range(len(board)):
        for j in range(len(board[0])):
            if backtrack(board, word, i, j, []):
                return True
    return False

backtrack函式接受四個引數:

  1. board表示給定的二維字符陣列
  2. word表示要查找的單詞
  3. row和col表示當前位置的行列坐標
  4. path表示當前生成的路徑,

在函式中,首先判斷當前位置是否為單詞的最后一個字符,如果是,則回傳True,

如果當前位置不是單詞的最后一個字符,則從當前位置向四周擴展,如果擴展的位置是合法的并且沒有走過,則將該位置加入當前路徑中,并繼續遞回生成下一個位置的路徑,

在遞回完成后,需要將加入的位置從當前路徑中移除,以便繼續生成其他路徑,如果所有路徑都生成完畢,仍未找到單詞,則回傳False,

 

exist函式接受兩個引數:

  1. board表示給定的二維字符陣列
  2. word表示要查找的單詞,

在函式中,遍歷二維字符陣列中的每一個位置,如果從該位置開始可以找到單詞,則回傳True,

如果遍歷完整個二維字符陣列,仍未找到單詞,則回傳False,

在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/554992.html

標籤:其他

上一篇:決議汽車APP面臨的18種攻擊風險

下一篇:返回列表

標籤雲
其他(160860) Python(38222) JavaScript(25492) Java(18225) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7247) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5874) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4589) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1962) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 【技識訓累】演算法中的回溯演算法【一】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-06-13 08:03:28 more
  • 決議汽車APP面臨的18種攻擊風險

    近日,頂象發布《車企App安全研究白皮書》。該白皮書總結了目前汽車公司App所面臨的主要技術威脅和合規風險,詳細分析了這些風險產生的原因,并提供了相應的安全解決方案。 現在,自有App已成為各汽車品牌的標配。這些汽車廠商的App不僅可以幫助用戶實作遠程開啟空調、門鎖、啟動車輛等常用功能,還提供購車、 ......

    uj5u.com 2023-06-13 08:03:21 more
  • 源生創新 云享未來|GOTC全球開源技術峰會華為云云原生精彩時刻

    摘要:GOTC 全球開源技術峰會在上海張江科學會堂成功舉辦。 本文分享自華為云社區《源生創新 云享未來|GOTC全球開源技術峰會華為云云原生精彩時刻》,作者:華為云云原生團隊。 GOTC 全球開源技術峰會在上海張江科學會堂成功舉辦。作為面向全球開發者的開源技術盛宴,大會以“Open Source, ......

    uj5u.com 2023-06-13 08:02:47 more
  • Excelize 榮獲 2022 年中國開源創新大賽一等獎

    近日,“2022 年中國開源創新大賽”正式發布了獲獎名單,Excelize 電子表格檔案開源基礎庫榮獲一等獎。 2022年中國開源創新大賽在烏鎮世界互聯網大會上正式啟動,大賽由中央網信辦資訊化發展局指導,中國互聯網發展基金會、中國網路空間研究院、中國互聯網投資基金聯合主辦,北京長風資訊技術產業聯盟承 ......

    uj5u.com 2023-06-13 08:02:09 more
  • 揭秘Spring依賴注入和SpEL運算式

    摘要:在本文中,我們深入探討了Spring框架中的屬性注入技術,包括setter注入、構造器注入、注解式屬性注入,以及使用SpEL運算式進行屬性注入。 本文分享自華為云社區《Spring高手之路3——揭秘Spring依賴注入和SpEL運算式》,作者:磚業洋__ 。 在本文中,我們深入探討了Sprin ......

    uj5u.com 2023-06-13 08:01:48 more
  • 體驗了一把 MiniGPT-4,一言難盡

    最近看到一個好玩的開源專案:MiniGPT-4。 看名字像 GPT-4 的小老弟,其實沒啥關系。 簡單說,它可以識別影像,基于影像你可以和它對話,它能生成圖片描述、網站、詩歌。 先看看官方給出的例子截圖。 給圖寫一段廣告詞 還能教做飯 根據圖配上一段故事 臥槽,AI 長眼睛了! 除此之外,它還能找到 ......

    uj5u.com 2023-06-13 08:01:02 more
  • 解密Prompt系列8. 無需訓練讓LLM支持超長輸入:知識庫 & unlimifo

    這一章我們聊聊有哪些方案可以不用微調直接讓大模型支持超長文本輸入,分別介紹顯式搜索,unlimiformer隱式搜索,并行輸入的PCW,和并行解碼的NBCE方案 ......

    uj5u.com 2023-06-13 08:00:11 more
  • 醫學生的人工智能實戰課

    # 醫學生的人工智能實戰課-初階 (R version) # Practical AI course for medical students # 教學大綱 Syllabus ## I 準備作業 1. R 和 Rstudio安裝 2. Quarto 和 R Markdown 3. Python 和 ......

    uj5u.com 2023-06-13 07:59:38 more
  • 使用 ChatGPT 創建 APP 的最佳實踐

    ?關注文章下方公眾號,可免費獲取AIGC最新學習資料 導讀:如果你想用用ChatGPT創建應用程式來賺錢,這是你需要知道的。 本文字數:2900,閱讀時長大約:18分鐘 如果你想用ChatGPT創建應用程式來賺錢,這是你需要知道的。 我最好先說出壞訊息。如果你認為可以兩手一攤,就讓ChatGPT為你 ......

    uj5u.com 2023-06-13 07:59:28 more
  • 對DenseTensor進行Transpose

    `ML.NET` 是微軟推出的為. NET 平臺設計的深度學習庫,通過這個東西(`ModelBuilder`)可以自己構建模型,并用于后來的推理與資料處理。雖然設計是很好的,但是由于現在的 AI 發展基本上都以 `python` 實作作為基礎,未來這個東西的發展不好說,特別是模型構建部分。我個人認為 ......

    uj5u.com 2023-06-13 07:59:22 more