Java回溯法怎么實(shí)現(xiàn)

本篇內(nèi)容介紹了“Java回溯法怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

北安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!

概述

回溯法思路的簡(jiǎn)單描述是:把問(wèn)題的解空間轉(zhuǎn)化成了圖或者樹(shù)的結(jié)構(gòu)表示,然后使用深度優(yōu)先搜索策略進(jìn)行遍歷,遍歷的過(guò)程中記錄和尋找所有可行解或者最優(yōu)解。

基本思想類同于:

圖的深度優(yōu)先搜索

二叉樹(shù)的后序遍歷

       詳細(xì)的描述則為:

       回溯法按深度優(yōu)先策略搜索問(wèn)題的解空間樹(shù)。首先從根節(jié)點(diǎn)出發(fā)搜索解空間樹(shù),當(dāng)算法搜索至解空間樹(shù)的某一節(jié)點(diǎn)時(shí),先利用剪枝函數(shù)判斷該節(jié)點(diǎn)是否可行(即能得到問(wèn)題的解)。如果不可行,則跳過(guò)對(duì)該節(jié)點(diǎn)為根的子樹(shù)的搜索,逐層向其祖先節(jié)點(diǎn)回溯;否則,進(jìn)入該子樹(shù),繼續(xù)按深度優(yōu)先策略搜索。

       回溯法的基本行為是搜索,搜索過(guò)程使用剪枝函數(shù)來(lái)為了避免無(wú)效的搜索。剪枝函數(shù)包括兩類:1. 使用約束函數(shù),剪去不滿足約束條件的路徑;2.使用限界函數(shù),剪去不能得到最優(yōu)解的路徑。

       問(wèn)題的關(guān)鍵在于如何定義問(wèn)題的解空間,轉(zhuǎn)化成樹(shù)(即解空間樹(shù))。解空間樹(shù)分為兩種:子集樹(shù)和排列樹(shù)。兩種在算法結(jié)構(gòu)和思路上大體相同。

實(shí)現(xiàn)方式

       回溯法的實(shí)現(xiàn)方法有兩種:遞歸和遞推(也稱迭代)。一般來(lái)說(shuō),一個(gè)問(wèn)題兩種方法都可以實(shí)現(xiàn),只是在算法效率和設(shè)計(jì)復(fù)雜度上有區(qū)別。
     【類比于圖深度遍歷的遞歸實(shí)現(xiàn)和非遞歸(遞推)實(shí)現(xiàn)】

遞歸

       思路簡(jiǎn)單,設(shè)計(jì)容易,但效率低,其設(shè)計(jì)范式如下:

void backtrack (int t)  
{  
    if (t>n) output(x); //葉子節(jié)點(diǎn),輸出結(jié)果,x是可行解      else         for i = 1 to k//當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)          {  
            x[t]=value(i); //每個(gè)子節(jié)點(diǎn)的值賦值給x              //滿足約束條件和限界條件            if (constraint(t)&&bound(t))   
                backtrack(t+1);  //遞歸下一層          }  
}

遞推

void iterativeBacktrack ()  
{  
    int t=1;  
    while (t>0) {  
        if(ExistSubNode(t)) //當(dāng)前節(jié)點(diǎn)的存在子節(jié)點(diǎn)          {  
            for i = 1 to k  //遍歷當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)              {  
                x[t]=value(i);//每個(gè)子節(jié)點(diǎn)的值賦值給x                  if (constraint(t)&&bound(t))//滿足約束條件和限界條件                   {  
                    //solution表示在節(jié)點(diǎn)t處得到了一個(gè)解                      if (solution(t)) output(x);//得到問(wèn)題的一個(gè)可行解,輸出                      else t++;//沒(méi)有得到解,繼續(xù)向下搜索                  }  
            }  
        }  
        else //不存在子節(jié)點(diǎn),返回上一層          {  
            t--;  
        }  
    }  
}

“Java回溯法怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)頁(yè)名稱:Java回溯法怎么實(shí)現(xiàn)
鏈接分享:http://bm7419.com/article2/pcgeoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、App開(kāi)發(fā)、網(wǎng)站收錄搜索引擎優(yōu)化、網(wǎng)站營(yíng)銷、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化