Kaksisuuntainen leveys- (tai syvyys)haku [1] [2] on hienostunut leveys- (tai syvyys- ) hakualgoritmi , jonka ideana on muodostaa hakuprosessi alkuperäisestä ( eteenpäinhaku ) ja viimeisestä kärjestä ( käänteinen haku ) kaaviosta .
Halutun polun löytäminen tarkoittaa polkujen määrittämistä alkupisteestä johonkin välikohtaan ja siitä loppupisteeseen. Toteutetaan tarkistamalla yksi tai molemmat prosessit, kun yhden hakupuun lehti vastaa toisen lehtiä, minkä jälkeen polut kyseiseen elementtiin poimitaan. Yhdistämällä polut saamme halutun polun. Jos kaksi hakua suoritetaan rinnakkain , tämä säästää vielä enemmän aikaa halutun polun löytämiseen verrattuna yksisuuntaiseen hakuun.
Koko algoritmin monimutkaisuus arvioidaan eteen- ja taaksepäin tehtyjen hakujen monimutkaisuuden summana, jäsenyyden tarkistus yhtä operaatiota vastaava, vakioaika (O (n)), pääsy hash-taulukkoon .
Liian riippuvainen tietystä tilanteesta, jos haku ei ole n-aarinen puu .
Kaksisuuntainen haku, kun otetaan huomioon yksi aloitus- ja loppuelementti, voi parantaa yksisuuntaista leveyshakua, tyypillisesti kertoimella 2. Vaikein tapaus kaksisuuntaiselle haulle on sellainen ongelma, jossa vain implisiittinen kuvaus jostain (mahdollisesti hyvin suuresta) kohdetilojen joukosta annetaan tavoitteen tarkistamiseksi, esimerkiksi kaikki tilat, jotka vastaavat tavoitteen "Shakki" mattia. " shakissa . Käänteisessä haussa olisi tarpeen luoda kompaktit kuvaukset kaikista tiloista, jotka sallivat matin liikkeillä jne.; ja nämä kuvaukset olisi tarkistettava suoraan haun luomiin tiloihin. Ei ole olemassa yleistä tapaa ratkaista tällainen ongelma tehokkaasti.
Algoritmi koostuu:
Toteutuksen monimutkaisuus piilee käänteisessä hakualgoritmissa.
Kaavion hakualgoritmit | ||
---|---|---|
Tietämättömät menetelmät | ||
Tietoon perustuvat menetelmät | ||
Pikanäppäimet | ||
Vähintään ulottuva puu | ||
Muut |