Rumah > hujung hadapan web > tutorial js > Algoritma penutupan transitif membandingkan algoritma bawah ke atas dan atas ke bawah

Algoritma penutupan transitif membandingkan algoritma bawah ke atas dan atas ke bawah

王林
Lepaskan: 2024-01-13 15:12:07
asal
927 orang telah melayarinya

Algoritma penutupan transitif membandingkan algoritma bawah ke atas dan atas ke bawah

Perbandingan algoritma penutupan transitif: algoritma bawah ke atas vs algoritma atas bawah

Pengenalan:
Algoritma penutupan transitif ialah algoritma yang biasa digunakan dalam teori graf, yang boleh didapati dalam graf terarah atau tidak terarah Penutupan transitif graf . Dalam artikel ini, kami akan membandingkan dua kaedah pelaksanaan biasa bagi algoritma penutupan transitif: algoritma bawah ke atas dan algoritma atas ke bawah, dan memberikan contoh kod khusus.

1. Algoritma Bottom-up:
Algoritma bottom-up ialah kaedah pelaksanaan algoritma penutupan transitif Ia membina penutupan transitif graf dengan mengira semua laluan yang mungkin dalam graf. Langkah algoritma adalah seperti berikut:

  1. Memulakan matriks penutupan transitif TransitiveClosure dan menetapkannya sebagai matriks bersebelahan graf.
  2. Untuk setiap bucu v, tetapkan TransitiveClosurev kepada 1, menunjukkan bahawa bucu itu sendiri boleh dicapai.
  3. Untuk setiap pasangan bucu (u, v), jika terdapat tepi dari u ke v, tetapkan TransitiveClosureu kepada 1.
  4. Untuk setiap pasangan bucu (u,v), dan untuk semua bucu lain w, jika kedua-dua TransitiveClosureu dan TransitiveClosurew ialah 1, tetapkan TransitiveClosureu kepada 1.
  5. Gelung mengulangi langkah 4 sehingga matriks penutupan yang diluluskan tidak lagi berubah.

Berikut ialah contoh kod khusus algoritma bawah ke atas, dengan mengambil Graf matriks bersebelahan dan matriks penutupan transitif TransitiveClosure sebagai input:

def transitive_closure(Graph, TransitiveClosure):
    num_vertices = len(Graph)

    for v in range(num_vertices):
        TransitiveClosure[v][v] = 1

    for u in range(num_vertices):
        for v in range(num_vertices):
            if Graph[u][v]:
                TransitiveClosure[u][v] = 1

    for w in range(num_vertices):
        for u in range(num_vertices):
            for v in range(num_vertices):
                if TransitiveClosure[u][w] and TransitiveClosure[w][v]:
                    TransitiveClosure[u][v] = 1

    return TransitiveClosure
Salin selepas log masuk

2. Algoritma atas ke bawah:
Algoritma atas ke bawah juga merupakan algoritma penutupan transitif Kaedah pelaksanaan adalah untuk membina penutupan transitif graf dengan mengira secara rekursif kebolehcapaian setiap pasangan bucu. Langkah algoritma adalah seperti berikut:

  1. Memulakan matriks penutupan transitif TransitiveClosure dan menetapkannya sebagai matriks bersebelahan graf.
  2. Untuk setiap pasangan bucu (u, v), jika terdapat tepi dari u ke v, tetapkan TransitiveClosureu kepada 1.
  3. Untuk setiap pasangan bucu (u,v), dan untuk semua bucu lain w, jika kedua-dua TransitiveClosureu dan TransitiveClosurew ialah 1, tetapkan TransitiveClosureu kepada 1.
  4. Gelung mengulangi langkah 3 sehingga matriks penutupan yang diluluskan tidak lagi berubah.

Berikut ialah contoh kod khusus algoritma atas ke bawah, mengambil matriks bersebelahan Graf dan matriks penutupan transitif TransitiveClosure sebagai input:

def transitive_closure(Graph, TransitiveClosure):
    num_vertices = len(Graph)

    for u in range(num_vertices):
        for v in range(num_vertices):
            if Graph[u][v]:
                TransitiveClosure[u][v] = 1

    for w in range(num_vertices):
        for u in range(num_vertices):
            for v in range(num_vertices):
                if TransitiveClosure[u][w] and TransitiveClosure[w][v]:
                    TransitiveClosure[u][v] = 1

    return TransitiveClosure
Salin selepas log masuk

3. Analisis perbandingan:

  1. Kerumitan masa: algoritma bawah ke atas dan Algoritma atas-bawah Kerumitan masa bagi algoritma ke bawah ialah O(V^3), di mana V mewakili bilangan bucu.
  2. Kerumitan ruang: Kerumitan ruang bagi kedua-dua algoritma bawah ke atas dan algoritma atas ke bawah ialah O(V^2).
  3. Aplikasi praktikal: Algoritma bawah ke atas sesuai untuk graf kecil, manakala algoritma atas ke bawah sesuai untuk graf besar. Algoritma bawah ke atas perlu menyimpan semua matriks bersebelahan semasa pengiraan, manakala algoritma atas ke bawah boleh menggunakan rekursi untuk membahagikan graf.
  4. Kecekapan algoritma: Algoritma bawah ke atas perlu menyalin matriks bersebelahan ke dalam matriks penutupan transitif pada peringkat awal, manakala algoritma atas ke bawah secara langsung mengira pada matriks bersebelahan, jadi kecekapan algoritma atas ke bawah dalam peringkat awal lebih tinggi.

Kesimpulan:
Dua kaedah pelaksanaan algoritma penutupan transitif, algoritma bottom-up dan algoritma top-down, pada asasnya adalah sama dari segi kerumitan masa dan kerumitan ruang, tetapi terdapat perbezaan dalam aplikasi praktikal dan kecekapan. pada peringkat awal. Pilih kaedah pelaksanaan yang sesuai berdasarkan keperluan khusus dan saiz graf untuk mendapatkan kecekapan operasi dan prestasi yang lebih baik.

Atas ialah kandungan terperinci Algoritma penutupan transitif membandingkan algoritma bawah ke atas dan atas ke bawah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan