Rumah hujung hadapan web tutorial js Struktur Data JavaScript dan Algoritma Graf dan Graf Algoritma_Pengetahuan Asas

Struktur Data JavaScript dan Algoritma Graf dan Graf Algoritma_Pengetahuan Asas

May 16, 2016 pm 04:14 PM
javascript algoritma graf struktur data algoritma

Takrifan graf

Graf terdiri daripada set bucu tak kosong terhingga dan set tepi antara bucu Ia biasanya dinyatakan sebagai: G(V,E), dengan G mewakili graf dan V ialah bucu graf G. . Set, E ialah set tepi dalam graf G.

Graf terarah

Tepi berarah: Jika tepi dari bucu Vi ke Vj mempunyai arah, maka tepi ini dipanggil tepi terarah, juga dipanggil lengkok (Lengkok), diwakili oleh pasangan tertib , Vi dipanggil ialah ekor arka, dan Vj dipanggil kepala arka.

Graf tidak tertib

Tepi tidak berarah: Jika tepi antara bucu Vi dan Vj tidak mempunyai arah, tepi ini dipanggil tepi tidak berarah (Tepi) dan diwakili oleh pasangan tidak tertib (Vi, Vj).

Gambar ringkas

Graf mudah: Dalam struktur graf, jika tiada tepi dari bucu ke dirinya sendiri, dan tepi yang sama tidak muncul berulang kali, maka graf sedemikian dipanggil graf ringkas.

Grafik

mewakili bucu

Langkah pertama dalam mencipta kelas graf ialah mencipta kelas Vertex untuk menyimpan bucu dan tepi. Fungsi kelas ini adalah sama dengan kelas Node senarai terpaut dan pepohon carian binari. Kelas Vertex mempunyai dua ahli data: satu yang mengenal pasti bucu, dan nilai Boolean yang menunjukkan sama ada ia telah dilawati. Mereka dinamakan label dan wasVisited masing-masing.

Salin kod Kod adalah seperti berikut:

fungsi Vertex(label){
This.label = label;
}

Kami menyimpan semua bucu dalam tatasusunan, dan dalam kelas graf, mereka boleh dirujuk oleh kedudukan mereka dalam tatasusunan

mewakili kelebihan

Maklumat sebenar graf disimpan pada "tepi" kerana ia menerangkan struktur graf. Nod induk pokok binari hanya boleh mempunyai dua nod anak, tetapi struktur graf adalah lebih fleksibel.

Kami memanggil kaedah mewakili tepi graf sebagai senarai bersebelahan atau tatasusunan senarai bersebelahan. Ia akan menyimpan tatasusunan yang terdiri daripada senarai bucu bersebelahan sesuatu bucu

Rajah pembinaan

Tentukan kelas Graf seperti berikut:

Salin kod Kod adalah seperti berikut:

fungsi Graf(v){
This.vertices = v;//vertices titik tertinggi
This.edges = 0;
This.adj = [];
for(var i =0;I This.adj[i] = [];
This.adj[i].push('');
}
This.addEdge = addEdge;
This.toString = toString;
}

Kelas ini merekodkan bilangan tepi yang diwakili oleh graf dan merekodkan bilangan bucu menggunakan panjang dan bilangan bucu dalam graf.
Salin kod Kod adalah seperti berikut:

fungsi addEdge(){
This.adj[v].push(w);
This.adj[w].push(v);
This.edges ;
}

Di sini kita menggunakan gelung for untuk menambah sub-tatasusunan pada setiap elemen dalam tatasusunan untuk menyimpan semua bucu bersebelahan dan memulakan semua elemen kepada rentetan kosong.

Perjalanan graf

Perjalanan mendalam-pertama

DepthFirstSearch, juga dikenali sebagai carian depth-first, dirujuk sebagai DFS.

Contohnya, jika anda mencari kunci di dalam bilik, anda boleh mulakan dari mana-mana bilik Cari sudut, meja sisi katil, katil, bawah katil, almari pakaian, kabinet TV dan lain-lain di dalam bilik satu persatu. , supaya tidak terlepas mana-mana Dead ends, selepas mencari semua laci dan kabinet penyimpanan, kemudian cari bilik sebelah.

Kedalaman carian pertama:

Carian pertama mendalam ialah melawati bucu yang belum dilawati, menandainya sebagai dilawati, dan kemudian mengakses bucu lain yang belum dilawati secara rekursif dalam senarai bersebelahan bucu awal

Tambah tatasusunan pada kelas Graf:

Salin kod Kod adalah seperti berikut:

this.marked = [];//Simpan bucu yang dilawati
for(var i=0;i This.marked[i] = false;//Dimulakan kepada false
}

Fungsi carian mendalam-pertama:

Salin kod Kod adalah seperti berikut:

fungsi dfs(v){
This.marked[v] = true;
//Pernyataan if tidak diperlukan di sini
If(this.adj[v] != undefined){
​​print("Puncak yang dilawati: " v );
untuk setiap (var w dalam ini.adj[v]){
Jika(!ini.ditandakan[w]){
This.dfs(w);
            }
}
}
}

Pencarian luas didahulukan

Breadth-first search (BFS) ialah kaedah carian buta yang bertujuan untuk mengembangkan dan memeriksa semua nod dalam graf secara sistematik untuk mencari hasil. Dalam erti kata lain, ia tidak mengambil kira kemungkinan lokasi hasil dan mencari keseluruhan graf dengan teliti sehingga keputusan ditemui.

Carian keluasan didahulukan bermula dari bucu pertama dan cuba melawat bucu sedekat mungkin dengannya, seperti yang ditunjukkan di bawah:

Prinsip kerjanya ialah:

1. Mula-mula cari bucu yang belum dilawati bersebelahan dengan bucu semasa dan tambahkannya pada senarai bucu yang dilawati dan baris gilir; 2. Kemudian ambil bucu v seterusnya daripada graf dan tambahkannya pada senarai bucu yang dilawati
3. Akhir sekali, tambahkan semua bucu yang belum dilawati bersebelahan dengan v pada baris gilir
Berikut ialah takrifan fungsi carian luas pertama:

Salin kod Kod adalah seperti berikut:
bfs(s) fungsi{
var baris gilir = [];
This.marked = benar;
Queue.push(s);//Tambah pada penghujung baris gilir
While(queue.length>0){
          var v = queue.shift();//Alih keluar daripada kepala baris gilir
If(v == undefined){
                                      print("Puncak yang dilawati: " v);
}
untuk setiap (var w dalam ini.adj[v]){
Jika(!ini.ditandakan[w]){
This.edgeTo[w] = v;
This.marked[w] = true;
queue.push(w);
            }
}
}
}

Laluan terpendek

Apabila melakukan carian luas pertama, laluan terpendek dari satu bucu ke satu bucu bersambung ditemui secara automatik

Tentukan laluan

Untuk mencari laluan terpendek, anda perlu mengubah suai algoritma carian pertama keluasan untuk merekodkan laluan dari satu bucu ke bucu lain Kami memerlukan tatasusunan untuk menyimpan semua tepi dari satu bucu ke bucu seterusnya tepi tatasusunanKepada

Salin kod Kod adalah seperti berikut:

this.edgeTo = [];//Tambah baris ini pada kelas Graf

//fungsi bfs
bfs(s) fungsi{
var baris gilir = [];
This.marked = benar;
Queue.push(s);//Tambah pada penghujung baris gilir
While(queue.length>0){
          var v = queue.shift();//Alih keluar daripada kepala baris gilir
If(v == undefined){
                                      print("Puncak yang dilawati: " v);
}
untuk setiap (var w dalam ini.adj[v]){
Jika(!ini.ditandakan[w]){
This.edgeTo[w] = v;
This.marked[w] = true;
queue.push(w);
            }
}
}
}

Algoritma pengisihan topologi

Isihan topologi akan mengisih semua bucu graf terarah supaya tepi terarah menghala dari bucu sebelumnya ke bucu kemudian.
Algoritma pengisihan topologi adalah serupa dengan BFS Perbezaannya ialah algoritma pengisihan topologi tidak serta-merta mengeluarkan bucu yang dilawati Sebaliknya, ia melawati semua bucu bersebelahan dalam senarai bucu semasa tidak akan ditolak senarai itu habis dalam timbunan.

Algoritma pengisihan topologi dibahagikan kepada dua fungsi Fungsi pertama ialah topSort(), yang digunakan untuk menyediakan proses pengisihan dan memanggil fungsi tambahan topSortHelper(), dan kemudian memaparkan senarai puncak yang diisih

.

Kerja utama algoritma pengisihan topologi diselesaikan dalam fungsi rekursif topSortHelper(). Akhirnya, puncak semasa ditolak ke tindanan.

Salin kod Kod adalah seperti berikut:

//topSort() fungsi
fungsi topSort(){
timbunan var = [];
var dilawati = [];
for(var i =0;i         melawati[i] = palsu;
}
for(var i = 0;i Jika(dilawati[i] == palsu){
This.topSortHelper(i,visited,stack);
}
}
for(var i = 0;i Jika(timbunan[i] !=tidak ditentukan && tindanan[i] != palsu){
​​​​​print(this.vertexList[tindanan[i]]);
}
}
}

//topSortHelper() fungsi
fungsi topSortHelper(v,dilawati,tindan){
dilawati[v] = benar;
untuk setiap (var w dalam ini.adj[v]){
Jika(!melawat[w]){
This.topSortHelper(dilawati[w],dilawati,tindan);
}
}
​ stack.push(v);
}

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Melaksanakan Algoritma Pembelajaran Mesin dalam C++: Cabaran dan Penyelesaian Biasa Melaksanakan Algoritma Pembelajaran Mesin dalam C++: Cabaran dan Penyelesaian Biasa Jun 03, 2024 pm 01:25 PM

Cabaran biasa yang dihadapi oleh algoritma pembelajaran mesin dalam C++ termasuk pengurusan memori, multi-threading, pengoptimuman prestasi dan kebolehselenggaraan. Penyelesaian termasuk menggunakan penunjuk pintar, perpustakaan benang moden, arahan SIMD dan perpustakaan pihak ketiga, serta mengikuti garis panduan gaya pengekodan dan menggunakan alat automasi. Kes praktikal menunjukkan cara menggunakan perpustakaan Eigen untuk melaksanakan algoritma regresi linear, mengurus memori dengan berkesan dan menggunakan operasi matriks berprestasi tinggi.

Terokai prinsip asas dan pemilihan algoritma bagi fungsi isihan C++ Terokai prinsip asas dan pemilihan algoritma bagi fungsi isihan C++ Apr 02, 2024 pm 05:36 PM

Lapisan bawah fungsi C++ sort menggunakan isihan gabungan, kerumitannya ialah O(nlogn), dan menyediakan pilihan algoritma pengisihan yang berbeza, termasuk isihan pantas, isihan timbunan dan isihan stabil.

Algoritma pengesanan yang dipertingkatkan: untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi Algoritma pengesanan yang dipertingkatkan: untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi Jun 06, 2024 pm 12:33 PM

01Garis prospek Pada masa ini, sukar untuk mencapai keseimbangan yang sesuai antara kecekapan pengesanan dan hasil pengesanan. Kami telah membangunkan algoritma YOLOv5 yang dipertingkatkan untuk pengesanan sasaran dalam imej penderiaan jauh optik resolusi tinggi, menggunakan piramid ciri berbilang lapisan, strategi kepala pengesanan berbilang dan modul perhatian hibrid untuk meningkatkan kesan rangkaian pengesanan sasaran dalam imej penderiaan jauh optik. Menurut set data SIMD, peta algoritma baharu adalah 2.2% lebih baik daripada YOLOv5 dan 8.48% lebih baik daripada YOLOX, mencapai keseimbangan yang lebih baik antara hasil pengesanan dan kelajuan. 02 Latar Belakang & Motivasi Dengan perkembangan pesat teknologi penderiaan jauh, imej penderiaan jauh optik resolusi tinggi telah digunakan untuk menggambarkan banyak objek di permukaan bumi, termasuk pesawat, kereta, bangunan, dll. Pengesanan objek dalam tafsiran imej penderiaan jauh

Bandingkan struktur data kompleks menggunakan perbandingan fungsi Java Bandingkan struktur data kompleks menggunakan perbandingan fungsi Java Apr 19, 2024 pm 10:24 PM

Apabila menggunakan struktur data kompleks dalam Java, Comparator digunakan untuk menyediakan mekanisme perbandingan yang fleksibel. Langkah-langkah khusus termasuk: mentakrifkan kelas pembanding, menulis semula kaedah bandingkan untuk menentukan logik perbandingan. Buat contoh pembanding. Gunakan kaedah Collections.sort, menghantar contoh koleksi dan pembanding.

Aplikasi algoritma dalam pembinaan 58 platform potret Aplikasi algoritma dalam pembinaan 58 platform potret May 09, 2024 am 09:01 AM

1. Latar Belakang Pembinaan 58 Portrait Platform Pertama sekali, saya ingin berkongsi dengan anda latar belakang pembinaan 58 Portrait Platform. 1. Pemikiran tradisional platform pemprofilan tradisional tidak lagi mencukupi Membina platform pemprofilan pengguna bergantung pada keupayaan pemodelan gudang data untuk menyepadukan data daripada pelbagai barisan perniagaan untuk membina potret pengguna yang tepat untuk memahami tingkah laku, minat pengguna dan keperluan, dan menyediakan keupayaan sampingan, akhirnya, ia juga perlu mempunyai keupayaan platform data untuk menyimpan, bertanya dan berkongsi data profil pengguna dan menyediakan perkhidmatan profil dengan cekap. Perbezaan utama antara platform pemprofilan perniagaan binaan sendiri dan platform pemprofilan pejabat pertengahan ialah platform pemprofilan binaan sendiri menyediakan satu barisan perniagaan dan boleh disesuaikan atas permintaan platform pertengahan pejabat berkhidmat berbilang barisan perniagaan, mempunyai kompleks pemodelan, dan menyediakan lebih banyak keupayaan umum. 2.58 Potret pengguna latar belakang pembinaan potret di platform tengah 58

Struktur dan algoritma data Java: penjelasan mendalam Struktur dan algoritma data Java: penjelasan mendalam May 08, 2024 pm 10:12 PM

Struktur data dan algoritma ialah asas pembangunan Java Artikel ini meneroka secara mendalam struktur data utama (seperti tatasusunan, senarai terpaut, pepohon, dll.) dan algoritma (seperti pengisihan, carian, algoritma graf, dll.) dalam Java. Struktur ini diilustrasikan dengan contoh praktikal, termasuk menggunakan tatasusunan untuk menyimpan skor, senarai terpaut untuk mengurus senarai beli-belah, tindanan untuk melaksanakan rekursi, baris gilir untuk menyegerakkan benang, dan pepohon dan jadual cincang untuk carian dan pengesahan pantas. Memahami konsep ini membolehkan anda menulis kod Java yang cekap dan boleh diselenggara.

Struktur data PHP: Keseimbangan pepohon AVL, mengekalkan struktur data yang cekap dan teratur Struktur data PHP: Keseimbangan pepohon AVL, mengekalkan struktur data yang cekap dan teratur Jun 03, 2024 am 09:58 AM

Pokok AVL ialah pokok carian binari seimbang yang memastikan operasi data yang pantas dan cekap. Untuk mencapai keseimbangan, ia melakukan operasi belok kiri dan kanan, melaraskan subpokok yang melanggar keseimbangan. Pokok AVL menggunakan pengimbangan ketinggian untuk memastikan ketinggian pokok sentiasa kecil berbanding bilangan nod, dengan itu mencapai kerumitan masa logaritma (O(logn)) operasi carian dan mengekalkan kecekapan struktur data walaupun pada set data yang besar.

Algoritma pengesyoran berita berdasarkan peningkatan graf global Algoritma pengesyoran berita berdasarkan peningkatan graf global Apr 08, 2024 pm 09:16 PM

Pengarang |. Disemak oleh Wang Hao |. Sekitar tahun 2010, aplikasi berita asing yang popular termasuk Zite dan Flipboard, manakala aplikasi berita tempatan yang popular adalah empat portal utama. Dengan populariti produk cadangan berita era baharu yang diwakili oleh Toutiao, apl berita telah memasuki era baharu. Bagi syarikat teknologi, tidak kira yang mana satu mereka, selagi mereka menguasai teknologi algoritma pengesyoran berita yang canggih, mereka pada dasarnya akan mempunyai inisiatif dan suara di peringkat teknikal. Hari ini, mari kita lihat kertas Anugerah Pencalonan Kertas Panjang Terbaik RecSys2023—GoingBeyondLocal:GlobalGraph-EnhancedP

See all articles