Untuk aplikasi DFS dalam kaitannya dengan domain tertentu, seperti mencari solusi dalam
kecerdasan buatan atau penelusuri web (Struktur web), grafik yang akan dilalui seringkali terlalu
besar untuk dikunjungi secara keseluruhan atau tidak terbatas (DFS mungkin mengalami non-
terminasi). Dalam kasus seperti itu, pencarian hanya dilakukan pada kedalaman terbatas; karena
sumber daya yang terbatas, seperti memori atau ruang disk, seseorang biasanya tidak menggunakan
struktur data untuk melacak himpunan semua simpul yang dikunjungi sebelumnya. Ketika pencarian
dilakukan pada kedalaman yang terbatas, waktu masih linier dalam hal jumlah simpul dan tepi yang
diperluas (walaupun jumlah ini tidak sama dengan ukuran keseluruhan graf karena beberapa simpul
dapat dicari lebih dari satu kali dan lainnya tidak sama sekali) tetapi kompleksitas ruang dari varian
DFS ini hanya sebanding dengan batas kedalaman, dan akibatnya, jauh lebih kecil daripada ruang
yang dibutuhkan untuk pencarian dengan kedalaman yang sama menggunakan pencarian luas-
pertama. Untuk aplikasi seperti itu, DFS juga lebih cocok untuk metode DSS Heuristik untuk memilih
cabang yang tampak mungkin. Ketika batas kedalaman yang sesuai tidak diketahui secara apriori,
(pencarian kedalaman-pertama pendalaman/ Depth-first search berulang) menerapkan DFS
berulang kali dengan urutan batas yang meningkat. Dalam mode analisis kecerdasan buatan, dengan
faktor percabangan lebih besar dari satu, pendalaman berulang meningkatkan waktu berjalan hanya
dengan faktor konstan selama kasus di mana batas kedalaman yang benar diketahui karena
pertumbuhan geometris jumlah node per level .
DFS juga dapat digunakan untuk mengumpulkan sampel node grafik. Namun, DFS tidak lengkap,
mirip dengan BFS tidak lengkap , bisa terhadap node derajat tinggi
Akan membahas ide di balik pencarian mendalam-pertama dalam kaitannya dengan Gambar 4.5. Angka-angka
pada gambar ini menunjukkan urutan simpul yang dikunjungi.
Untuk melakukan pencarian mendalam-pertama, memilih titik awal—dalam hal ini, simpul A. Kemudian
melakukan tiga hal :
1. kunjungi simpul ini, dorong ke tumpukan, jadi dapat mengingatnya, dan menandainya sehingga tidak
akan mengunjunginya lagi.
2. Selanjutnya pergi ke setiap simpul yang berdekatan dengan A yang belum dikunjungi. Baik asumsikan
simpul dipilih dalam urutan abjad, sehingga memunculkan B. Mengunjungi B, menandainya, dan
mendorongnya ke tumpukan. Sekarang berada di B, dan lakukan hal yang sama seperti sebelumnya :
3. Kunjungi simpul tetangga yang belum dikunjungi. yaitu ke F.
Ikuti Aturan/role berikut :
Aturan 1:
Jika memungkinkan, kunjungi simpul berdekatan yang belum dikunjungi, tandai, dan dorong pada
tumpukan. Menerapkan Aturan 1 lagi bawa ke H. Namun, pada titik ini, perlu melakukan sesuatu yang
lain, karena tidak ada simpul yang belum dikunjungi yang berdekatan dengan H.
Aturan 2:
Jika tidak dapat mengikuti Aturan 1, maka, jika memungkinkan, keluarkan sebuah simpul
dari tumpukan. pada aturan 2 ini, mengeluarkan H dari tumpukan, yang membawa
kembali ke F. F tidak memiliki simpul berdekatan yang belum dikunjungi, jadi
memunculkan F. Terus to B.
Sekarang hanya A yang tersisa pada tumpukan. A, bagaimanapun, memiliki simpul
berdekatan yang belum dikunjungi, jadi mengunjungi yang berikutnya, C. Tapi C adalah
akhir dari baris, jadi kembali ke A.
Kemudian kunjungi D, G, dan I, lalu keluarkan semuanya saat mencapai jalan buntu di I.
Sekarang kembali ke A. kunjungi E, dan sekali lagi kembali ke A. Namun kali ini, A tidak
memiliki tetangga yang belum dikunjungi, jadi keluarkan A dari tumpukan.
Sekarang tidak ada yang tersisa untuk muncul, yang dimunculkan
Aturan 4 :
Ingat Aturan 3: Jika Anda tidak dapat mengikuti Aturan 1 atau Aturan 2, Anda selesai.
Tabel 4.3 menunjukkan bagaimana tumpukan terlihat dalam berbagai tahap proses ini, seperti:
diterapkan diatas pada Gambar 4.5
Isi tumpukan adalah rute yang diambil dari titik awal ke mendapatkan di mana partama berada. Saat
menjauh dari titik awal, Push simpul saat pergi. Saat Anda bergerak kembali ke titik awal, Anda pop
mereka. Urutan kunjungan ke simpul adalah ABFHCDGIE.
Algoritma pencarian kedalaman-pertama, pergi sejauh-jauhnya dari titik awal secepat mungkin, dan
kembali hanya jika mencapai jalan buntu. Jika menggunakan istilah kedalaman berarti jarak dari titik awal,
dapat melihat dari mana nama depth-first search berasal.
Algoritma pencarian leksikografis pertama didasarkan pada gagasan perbaikan partisi dan pertama
kali dikembangkan oleh Donald J. Rose, Robert E. Tarjan , dan George S. Lueker ( 1976 ). Sebuah
survei yang lebih rinci tentang topik ini disajikan oleh Corneil (2004) . Telah digunakan sebagai
subroutine dalam algoritma grafik lainnya termasuk pengakuan grafik korda , dan optimal pewarna
dari grafik jarak-turun-temurun .
The pencarian luas-pertama algoritma umumnya didefinisikan oleh proses berikut:
Inisialisasi antrian simpul graf, dengan simpul awal graf sebagai satu-satunya elemen antrian.
Saat antrian tidak kosong, hapus (dequeue) sebuah simpul v dari antrian, dan tambahkan ke antrian
(enqueue) semua simpul lain yang dapat dicapai oleh sisi dari v yang belum ditambahkan pada langkah
sebelumnya.
Namun, daripada mendefinisikan simpul yang akan dipilih pada setiap langkah dengan cara imperatif
seperti yang dihasilkan oleh operasi dequeue dari antrian, seseorang dapat mendefinisikan urutan
simpul yang sama secara deklaratif dengan sifat-sifat simpul ini. Artinya, pencarian standar luas-
pertama hanyalah hasil dari berulang kali menerapkan aturan ini:
Keluarkan berulang kali simpul v , pilih pada setiap langkah simpul v yang belum dipilih dan yang
memiliki pendahulu (simpul yang memiliki tepi ke v ) sedini mungkin dalam keluaran.
Dalam beberapa kasus, pengurutan simpul ini berdasarkan posisi keluaran pendahulunya mungkin
memiliki ikatan dua simpul berbeda memiliki pendahulu paling awal yang sama. Dalam hal ini, urutan
pemilihan kedua simpul tersebut dapat bersifat arbitrer. Keluaran dari pencarian luas-pertama
leksikografis berbeda dari pencarian pertama-keluasan standar dalam memiliki aturan yang konsisten
untuk memutuskan ikatan tersebut. Dalam pencarian luas-pertama leksikografis, urutan keluaran
adalah urutan yang akan dihasilkan oleh aturan:
Keluarkan berulang kali simpul v , pilih pada setiap langkah simpul v yang belum dipilih dan yang
seluruh himpunan pendahulunya yang sudah keluaran sekecil mungkin dalam urutan leksikografis .
Jadi, ketika dua simpul v dan w memiliki pendahulu paling awal yang sama, lebih awal dari simpul
lain yang tidak dipilih, algoritma pencarian standar luas-pertama akan mengurutkannya secara
sewenang-wenang. Sebagai gantinya, dalam kasus ini, algoritma LexBFS akan memilih antara v dan w
dengan urutan keluaran dari pendahulunya yang kedua paling awal. Jika hanya salah satu dari mereka
yang memiliki pendahulu kedua paling awal yang telah keluar, yang dipilih. Jika v dan w memiliki
pendahulu kedua paling awal yang sama, maka ikatan putus dengan mempertimbangkan pendahulu
ketiga paling awal, dan seterusnya.
Menerapkan aturan ini secara langsung dengan membandingkan simpul menurut aturan ini akan
menghasilkan algoritma yang tidak efisien. Sebaliknya, pencarian luas-pertama leksikografis
menggunakan struktur data partisi yang ditetapkan untuk menghasilkan pemesanan yang sama secara
lebih efisien, sama seperti pencarian standar-pertama menggunakan struktur data antrian untuk
menghasilkan pemesanannya secara efisien.
Gambar tree : Empat jenis tepi yang didefinisikan oleh pohon merentang
Tepi Lef- right dari Depth-first search
Pencarian depth-first dimulai pada node A, dengan asumsi bahwa tepi/paling kiri pada grafik yang
ditampilkan dipilih sebelum tepi/paling kanan, dan dengan asumsi pencarian mengingat node yang
dikunjungi sebelumnya dan tidak akan mengulanginya (karena ini adalah grafik kecil), akan
mengunjungi node dalam urutan berikut: A, B, D, F, E, C, G. Tepi yang dilalui dalam pencarian ini
membentuk pohon Trémaux, struktur dengan aplikasi penting dalam teori graf. Melakukan pencarian
yang sama tanpa mengingat node yang dikunjungi sebelumnya, menghasilkan, mengunjungi node
dalam urutan A, B, D, F, E, A, B, D, F, E, dll. Selamanya terperangkap di A, B, D, F, E siklus dan tidak
pernah mencapai C atau G.
Reverse postordering menghasilkan penyortiran topologi dari setiap grafik asiklik terarah . Urutan ini
juga berguna dalam analisis aliran kontrol karena sering mewakili linearisasi alami dari aliran kontrol.
Grafik di atas mungkin mewakili aliran kontrol dalam fragmen kode di bawah ini, dan wajar untuk
mempertimbangkan kode ini dalam urutan ABCD atau ACBD tetapi tidak wajar untuk menggunakan
urutan ABDC atau ACD B.
jika ( A ) maka {
B
} lain {
C
}
D
Input : Graf G dan simpul v dari G
Output : Semua simpul dapat dijangkau dari v berlabel ditemukan
Implementasi DFS secara rekursif :
Urutan di mana simpul ditemukan oleh algoritma ini disebut urutan leksikografis .
Kedua variasi DFS ini mengunjungi tetangga dari setiap simpul dalam urutan yang berlawanan satu
sama lain: tetangga pertama dari v yang dikunjungi oleh variasi rekursif adalah yang pertama dalam
daftar tepi yang berdekatan, sedangkan dalam variasi iteratif tetangga yang pertama dikunjungi
adalah yang terakhir dalam daftar tepi yang berdekatan. Implementasi rekursif akan mengunjungi
node dari contoh grafik dengan urutan sebagai berikut : A, B, D, F, E, C, G. Implementasi non-rekursif
akan mengunjungi node sebagai: A, E, F, B, D , C, G
Implementasi non-rekursif mirip dengan Breadth-first search tetapi berbeda darinya dalam dua cara:
1. Menggunakan tumpukan alih-alih antrian, dan
2. Menunda pemeriksaan apakah sebuah simpul telah ditemukan sampai simpul tersebut
dikeluarkan dari tumpukan daripada melakukan pemeriksaan ini sebelum menambahkan
simpul.
Jika G adalah sebuah pohon , mengganti antrian dari algoritma pencarian luas-pertama dengan
tumpukan akan menghasilkan algoritma pencarian kedalaman-pertama. Untuk grafik umum,
mengganti tumpukan implementasi pencarian kedalaman-pertama iteratif dengan antrian juga akan
menghasilkan algoritma pencarian luas-pertama, meskipun agak tidak standar.
Implementasi lain yang mungkin dari pencarian kedalaman-pertama berulang menggunakan
tumpukan iterator dari daftar tetangga sebuah node, bukan tumpukan node. Ini menghasilkan
traversal yang sama dengan DFS rekursif.
Kompleksitas
Urutan pencarian mendalam-pertama (tidak harus yang leksikografis), dapat dihitung dengan
algoritma paralel acak di kelas kompleksitas. Pada tahun 1997, masih belum diketahui apakah
traversal kedalaman-pertama dapat dibangun oleh algoritma paralel deterministik, di kelas
kompleksitas
Algoritma
Algoritma pencarian luas-pertama leksikografis menggantikan antrian simpul dari pencarian pertama-
lebar standar dengan urutan kumpulan simpul yang berurutan. Himpunan dalam urutan membentuk
partisi dari simpul yang tersisa. Pada setiap langkah, sebuah simpul v dari himpunan pertama dalam
barisan dihilangkan dari himpunan itu, dan jika penghilangan itu menyebabkan himpunan menjadi
kosong maka himpunan tersebut dihapus dari barisan. Kemudian, setiap himpunan dalam barisan
tersebut digantikan oleh dua himpunan bagian: tetangga dari v dan bukan tetangga dari v . Subset
tetangga ditempatkan lebih awal dalam urutan daripada subset non-tetangga. Dalam pseudocode ,
algoritma dapat dinyatakan sebagai berikut:
Inisialisasi barisan dari himpunan, untuk memuat satu himpunan yang berisi semua simpul.
Inisialisasi urutan keluaran simpul menjadi kosong.
Sementara tidak kosong:
o Temukan dan hapus simpul v dari himpunan pertama di
o Jika set pertama di sekarang kosong, hapus dari
o Tambahkan v ke akhir urutan output.
o Untuk setiap sisi vw sedemikian rupa sehingga w masih termasuk dalam himpunan S dalam :
Jika himpunan S yang berisi w belum diganti saat memproses v , buat himpunan
pengganti kosong baru T dan tempatkan sebelum S dalam barisan; jika tidak, misalkan
T adalah himpunan sebelum S .
Pindahkan w dari S ke T , dan jika ini menyebabkan S menjadi kosong, hapus S dari Σ.
Setiap simpul diproses sekali, setiap tepi diperiksa hanya ketika dua titik ujungnya diproses, dan
(dengan representasi yang sesuai untuk himpunan dalam yang memungkinkan item dipindahkan dari
satu himpunan ke himpunan lain dalam waktu yang konstan) setiap iterasi loop dalam hanya
membutuhkan waktu yang konstan. Oleh karena itu, seperti algoritma pencarian grafik yang lebih
sederhana seperti pencarian luas-pertama dan pencarian mendalam pertama , algoritma ini
membutuhkan waktu linier.
Algoritme ini disebut pencarian luas-pertama leksikografis karena urutan yang dihasilkannya
merupakan urutan yang juga dapat dihasilkan oleh pencarian pertama-lebar, dan karena jika urutan
digunakan untuk mengindeks baris dan kolom dari matriks ketetanggaan suatu graf kemudian
algoritma mengurutkan baris dan kolom ke dalam urutan leksikografis
https://informatika.stei.itb.ac.id/~rinaldi.munir/Matdis/2015-2016/Makalah-Matdis-2015/Makalah-IF2120-
2015-017.pdf