Repositori ini, saya akan menggunakan Python untuk mengimplementasikan beberapa algoritma terkenal. Algoritma diatur sesuai dengan strategi yang digunakan. Setiap algoritma akan memiliki penjelasan tentang masalah yang dicoba diselesaikan dan beberapa sumber daya yang relevan.
(Tujuan dari repositori ini adalah untuk membuat readme yang indah untuk semua algoritma brilian yang telah saya ulas ini.)
Isi:
Bagian ini, saya akan berbicara tentang strategi Divide and Conquer yang terkenal dan menunjukkan beberapa aplikasi dari strategi ini.

Prosedur standar untuk multiplikasi dua angka n digit membutuhkan sejumlah operasi dasar yang sebanding dengan. Adapun algoritma Karatsuba, ini mengurangi waktu berjalan ke sebagian besar
Ide utama
Langkah dasar algoritma Karatsuba adalah formula yang memungkinkan seseorang untuk menghitung produk dari dua angka besar dan menggunakan tiga multiplikasi angka yang lebih kecil, masing -masing dengan sekitar setengah lebih banyak digit atau, ditambah beberapa tambahan dan pergeseran digit.
Properti
Back to Top
Waktu berjalan terburuk untuk algoritma ini adalah.
Gif di atas menunjukkan cara kerja gabungan bekerja: 
Ide utama
Bagilah daftar yang tidak disortir ke dalam N sublists, masing -masing berisi 1 elemen (daftar elemen 1 dianggap diurutkan) dan berulang kali menggabungkan sublist untuk menghasilkan sublists baru yang diurutkan sampai hanya ada 1 sublist yang tersisa. Ini akan menjadi daftar yang diurutkan.
Properti
Back to Top
Ide utama
Seperti gambar di atas, ketika kita pertama kali menerima elemen dari sub-array kanan dalam operasi penggabungan, yang menunjukkan elemen kanan lebih kecil dari (panjang sub-array kiri-indeks elemen elemen kiri).
Saat algoritma berlangsung, tambahkan semua inversi akan memberi kita total inversi.
Properti
Back to Top
Properti
Back to TopBagian ini saya akan berbicara tentang dua algoritma yang telah menggunakan variabel acak di dalamnya.

Ide utama
Quicksort pertama kali membagi array besar menjadi dua sub-array yang lebih kecil: elemen rendah dan elemen tinggi relatif terhadap elemen yang dipilih secara acak. Quicksort kemudian dapat mengurutkan sub-array secara rekursif. Jadi, titik kunci dalam jenis cepat adalah memilih elemen partisi.
Properti
Back to Top
Ide utama
Dengan mengulangi waktu algoritma kontraksi dengan pilihan acak independen dan mengembalikan potongan terkecil, probabilitas tidak menemukan pemotongan minimum adalah
Properti
Back to TopUntuk menempatkan struktur data sebagai bagian independen menyesatkan; Namun, saya akan memperkenalkan masalah yang membingungkan yang diselesaikan secara elegan oleh struktur data. Beberapa struktur data mungkin memiliki strategi desain algoritma yang belum ditinjau.

Ide utama
BFS digunakan untuk menghitung node yang dapat dijangkau dari node sumber dalam grafik yang tidak terarah atau diarahkan. Node yang dapat dijangkau dicetak dalam urutan yang ditemukan. Antrian digunakan untuk menyimpan node berwarna abu -abu (lihat gif di bawah). Istilah "luas" di BFS berarti menemukan simpul yang dapat dijangkau dengan panjang terpendek. Luasnya memperluas perbatasan antara node yang dikunjungi dan node yang belum ditemukan.

Properti
Back to Top
Ide utama
Dan DFS digunakan dalam grafik terarah dan memberi tahu berapa banyak node yang dapat dijangkau oleh simpul sumber dan mencetaknya dengan urutan yang kami temukan. Kami menggunakan Stack untuk menyimpan node yang kami klasifikasi sebagai titik awal untuk grafik. "Kedalaman" dalam namanya berarti bahwa algoritma ini akan berjalan sedalam mungkin untuk sumber yang diberikan dan ketika mencapai titik akhir, ia kembali ke simpul start.

Properti
Back to Top
Masalah pemeliharaan median adalah bahwa jika bilangan bulat dibaca dari aliran data, temukan median elemen yang dibaca demikian dengan cara yang efisien. Untuk kesederhanaan, anggap tidak ada duplikat.
Ide utama
Kita dapat menggunakan tumpukan maks di sisi kiri untuk mewakili elemen yang kurang dari median yang kurang efektif, dan tumpukan min di sisi kanan untuk mewakili elemen yang lebih besar dari median efektif. Ketika perbedaan antara ukuran dua tumpukan lebih besar atau sama dengan 2, kami beralih satu elemen ke tumpukan ukuran lain yang lebih kecil.
Properti
Back to Top
Ide utama
Melalui pengamatan sederhana, kami mengetahui bahwa tranpose grafik memiliki SCC yang sama dengan grafik asli. Kami menjalankan DFS dua kali. Pertama kali, kami menjalankannya pada G dan menghitung waktu finishing untuk setiap simpul. Dan kemudian, kita menjalankan DFS pada g^t tetapi di loop utama DFS, pertimbangkan simpul dalam urutan penurunan waktu finishing.
Properti
Back to Top
Ide utama
Dalam grafik yang tidak diarahkan, kita dapat menggunakan struktur data ini untuk mengetahui berapa banyak SCC. Gambar di bawah ini menunjukkan cara kerjanya.

Properti
Back to Top Di bagian ini, saya akan memperkenalkan algoritma serakah, satu strategi desain algoritma yang kuat.
Dari Wikipedia, algoritma serakah adalah paradigma algoritmik yang mengikuti heuristik pemecahan masalah dalam membuat pilihan optimal lokal pada setiap tahap [1] dengan harapan menemukan optimal global. Dalam banyak masalah, strategi serakah tidak secara umum menghasilkan solusi yang optimal, tetapi tetap saja heuristik serakah dapat menghasilkan solusi optimal lokal yang mendekati solusi optimal global dalam waktu yang wajar.
Dalam masalah pemilihan aktivitas, setiap aktivitas memiliki berat dan panjangnya sendiri. Dan tujuan kami adalah untuk meminimalkan jumlah berat*. Ini adalah contoh yang sangat mudah dan bagus untuk menunjukkan bagaimana algoritma serakah bekerja dan memberikan bukti yang elegan menggunakan teknik pertukaran argumen.
Ide utama
Jika kita mengurutkan aktivitas berdasarkan berat/panjang nilai, kita dapat membuktikan struktur optimal yang ada tidak bisa lebih baik dari pengaturan ini. 
Seperti gambar yang ditunjukkan di atas, kami mempertimbangkan biaya yang disebabkan oleh dua kegiatan yang berkisar berbeda dalam dua pengaturan (I, J). Kami mengetahui bahwa biaya dalam algoritma serakah lebih kecil dari struktur optimal dengan nilai wi*lj - wj*li, yang lebih besar dari atau sama dengan 0.
Properti
Back to Top
Ide utama
Kami mengurutkan array sesuai dengan waktu selesai. Algoritma ini menempatkan pekerjaan pertama yang waktu mulainya lebih besar dari waktu selesai Last Job.
Properti
Back to Top
Salah satu cara untuk menyandikan buku ini adalah dengan menggunakan pengkodean panjang tetap. Seperti yang ditunjukkan di bawah ini:

Adapun pengkodean Huffman, struktur pohon yang sebenarnya terlihat seperti ini:

Ide utama
Kami memelihara pohon biner dan membuat simpul baru sebagai induk untuk dua huruf yang paling tidak sering. Dan kunci untuk simpul baru ini adalah jumlah kunci untuk kedua anaknya. Kami mengulangi ini sampai tidak ada node yang tersisa di "buku" ini.

Properti
Back to TopAlgoritma Dijkstra adalah algoritma untuk menemukan jalur terpendek antara node dalam grafik. Namun, ia memiliki satu prasyarat, semua jalur harus lebih besar atau sama dengan 0.

Ide utama
Node terpisah menjadi dua kelompok, satu kelompok ditandai seperti yang dieksplorasi. Dan kami memperbarui jarak dari grup yang belum dijelajahi ke grup yang dijelajahi dengan jarak terpendek.
Properti
Back to Top
Ide utama
Algoritma dapat secara informal digambarkan sebagai melakukan langkah -langkah berikut:
Inisialisasi pohon dengan satu titik, dipilih secara sewenang -wenang dari grafik.
Tumbuhkan pohon dengan satu tepi: dari tepi yang menghubungkan pohon ke simpul belum di pohon, temukan tepi minimum, dan pindahkan ke pohon.
Ulangi Langkah 2 (sampai semua simpul ada di pohon).
Properti
Back to Top
Ide utama
Sangat mirip dengan SCC, kita dapat menghentikan alogrithm awal untuk mengontrol jumlah kelas dalam grafik kita, yang berarti kita dapat mengelompokkan grafik.
Properti
Back to Top Di bagian ini, saya akan memperkenalkan algoritma dinamis, satu strategi desain algoritma yang kuat.
Dari Wikipedia, pemrograman dinamis (juga dikenal sebagai Optimasi Dinamis) adalah metode untuk menyelesaikan masalah yang kompleks dengan memecahnya menjadi kumpulan subproblem yang lebih sederhana, memecahkan masing -masing subproblem tersebut hanya sekali, dan menyimpan solusi mereka.

Jadi, jika panjang batang adalah 8 dan nilai -nilai potongan yang berbeda diberikan sebagai berikut, maka nilai maksimum yang dapat diperoleh adalah 22 (dengan memotong dua potong panjang 2 dan 6).
Ide utama
Kami melihat dekomposisi sebagai terdiri dari sepotong panjang pertama saya memotong ujung kiri, dan kemudian sisa tangan kanan panjang n-i. Jadi, pseudocode terlihat seperti:

Pohon rekursi yang menunjukkan panggilan rekursif yang dihasilkan dari panggilan cut_rod (p, n) terlihat seperti:

Untuk menyimpan perhitungan berulang untuk sub-masalah kecil, kami menghafal array untuk menyimpan nilai-nilai ini.
Properti
Back to Top
Ide utama
Struktur optimal:

Properti
Back to Top Ide utama
Dari CLRS, struktur optimal untuk masalah ini adalah:

Properti
Back to Top Ide utama
Algoritma ini didasarkan pada pengamatan yang sangat intuitif. Misalkan kita memiliki subset {1, 2, 3, 4, ..., k} (menunjukkan sebagai v (k)) dari kelompok simpul asli {1, 2, 3, ..., n}. Jika P adalah jalan terpendek dari I ke J dalam V (k), kami memiliki dua kasus. Pertama, jika k tidak ada di P, maka P harus menjadi jalur terpendek di V (K-1). Kedua, jika k ada di P, maka kita dapat memisahkan jalan menjadi dua, p1: i K, P2: k J. dan P1 harus menjadi jalan terpendek dari I ke K dengan V (K-1), P2 harus menjadi jalan terpendek dari K ke J dengan V (K-1).

Properti
Back to Top Dari dari Wikipedia, masalah keputusan NP-lengkap adalah salah satu milik NP dan kelas kompleksitas NP-hard. Dalam konteks ini, NP berarti "waktu polinomial nondeterministik". Set masalah NP-Complete sering dilambangkan dengan NP-C atau NPC.
Di bagian ini, saya akan memperkenalkan tiga masalah NPC yang sangat terkenal dan menjelaskan algoritma perkiraan untuk mendekatinya.

Ide utama
Sangat sulit untuk menemukan penutup simpul minimum tetapi kita dapat menemukan penutup perkiraan dengan paling banyak dua kali simpul dalam waktu polinomial.

Properti
Back to Top
Ide utama
Algoritma perkiraan untuk TSP adalah algoritma serakah (CLRS P1114). Di sini, saya juga ingin memperkenalkan algoritma yang tepat untuk TSP menggunakan pemrograman dinamis.
Subproblem: Untuk setiap tujuan j ∈ {1,2, ..., n}, setiap subset s {1,2, ..., n} yang berisi 1 dan j, mari ls, j = panjang minimum jalur dari 1 ke j yang mengunjungi tepatnya simpul s [tepat sekali masing -masing]. Jadi, kekambuhan yang sesuai:

Properti
Back to Top 3-SAT adalah salah satu dari 21 masalah lengkap NP-NP, dan digunakan sebagai titik awal untuk membuktikan bahwa masalah lain juga keras.
Di sini, saya memperkenalkan algoritma Papadimitriou untuk 2-SAT (ini adalah algoritma yang sangat sangat menarik , jadi saya memutuskan untuk memperkenalkannya meskipun 2-SAT bukan NPC).
Ide utama
Pilih penugasan awal acak dan pilih klausa yang tidak puas sewenang -wenang dan balikkan nilai salah satu variabelnya. Ini pseudocode:

Kesepakatan santai seperti itu dengan klausa akan secara mengejutkan memberi kita kemungkinan yang sangat besar untuk menemukan jawaban yang sebenarnya. Mekanisme ini terletak pada istilah fisika (jalan acak). Jika Anda tertarik, saya sangat menyarankan Anda untuk melalui bagaimana berjalan acak terkait dengan papadimitriou.
Properti
Back to Top