Bagaimana menulis artikel yang sangat kusut tentang algoritma. Akhirnya, menurut saya lebih baik mulai menulis dari level yang paling sederhana. Dari awal, saya akan mendapatkan beberapa kelas berat, seperti kecerdasan buatan, algoritme pembelajaran mesin, dan banyak pengetahuan matematika dan pengoptimalan. Saya rasa itu akan sangat tertekan. Tentu saja Saya mungkin tidak bisa melakukannya, benar.
Saya berencana memberikan solusi untuk setiap pertanyaan dalam dua bahasa, satu bahasa statis dan satu bahasa dinamis.
Saya memilih bahasa C, Python dan Java sebagai bahasa pengimplementasiannya.Karena keterbatasan tempat, teman-teman yang tertarik untuk mengimplementasikan bahasa lain, silahkan coba sendiri.
LeetCode 427. Bangun Quad Tree
Deskripsi Masalah:
Kami ingin menggunakan quadtree untuk menyimpan jaringan Boolean N x N. Nilai setiap sel di jaringan hanya akan benar atau salah. Node akar pohon mewakili seluruh jaringan. Untuk setiap node, akan dibagi menjadi empat node anak sampai nilai di area ini semuanya sama.
Setiap node memiliki dua variabel Boolean lainnya: isLeaf dan val. isLeaf benar jika node ini adalah node daun. Variabel val menyimpan nilai area yang diwakili oleh simpul daun.
Tugas Anda adalah menggunakan quadtree untuk merepresentasikan jaringan tertentu.
catatan:
Contoh:
Contoh berikut akan membantu Anda memahami masalah ini:
Diberikan jaringan 8 x 8 berikut, kami akan membangun quadtree yang sesuai seperti ini:
Quadtree yang sesuai akan terlihat seperti berikut, setiap node diwakili oleh sepasang (isLeaf, val).
Untuk node non-daun, val bisa berubah-ubah, jadi gunakan * sebagai gantinya.
Implementasi bahasa C ++:
Quadtree adalah struktur data yang sangat penting, jika Anda belum pernah mendengarnya, ingatlah sekarang. Biasanya digunakan dalam data dua dimensi, seperti pemrosesan gambar, dan dapat digunakan untuk merepresentasikan atau mengompres data. Standar HEVC / H.265 yang terkenal menggunakan quadtree untuk menyandikan dan mendekode gambar. Selain gambar, quadtree dapat digunakan untuk objek lain yang dapat direpresentasikan sebagai data dua dimensi, terutama untuk representasi data renggang.
Sekarang kita berada di topik.
Grafik yang diberikan pada contoh sudah sangat jelas, kita akan menemukan bahwa ini adalah proses rekursif yang khas, kita akan melakukannya dengan cara rekursif.
kode acara seperti di bawah ini:
Dalam proses rekursi, kita harus mengurangi panjang bingkai secara bertahap dari atas ke bawah, dari kiri ke kanan. Misalnya, jika grid 8 * 8, maka grid yang kita lintasi adalah dari 8 * 8 menjadi 4 * 4 hingga 2 * 2, hingga 1 * 1. Jadi ini mengharuskan kita untuk menyesuaikan lebar dan posisi grid selama rekursi (menunjukkan di mana itu atas, bawah, kiri, dan kanan).
Fungsi asli tidak memenuhi persyaratan, jadi kami menetapkan fungsi tambahan _doQuadTree (), yang menerima 5 parameter, parameter pertama adalah referensi ke kisi, dan empat parameter berikutnya adalah subskrip baris awal dan baris akhir berikutnya. Indeks (tidak termasuk), indeks kolom awal, indeks kolom akhir (tidak termasuk).
Sebelum kita melakukan traverse, kita menganalisis, kita akan menemukan bahwa akan ada tiga jenis node di quadtree:
1. Jika ada semua 0 dalam grid, itu adalah simpul daun yang valnya 0, dan keempat anaknya nol;
2. Jika ada semua 1 di grid, itu adalah simpul daun yang valnya 1, dan keempat anaknya nol;
3. Jika grid memiliki 1 dan 0, maka val adalah node non-daun, dan keempat turunannya tidak kosong;
Untuk sebuah pohon, jumlah simpul daun biasanya sangat banyak, dan sebagai simpul daun, terdapat kesamaan, yaitu semua 0 atau semua 1 simpul daun dapat digunakan kembali, yang dapat menghemat Banyak overhead tambahan, bukan hanya menghemat ruang.
Jadi kami mendefinisikan dua objek node _falseLeafNode dan _trueLeafNode.
Traversal dimulai ketika _doQuadTree () dipanggil. Baris 32 hingga 35 kode adalah keseluruhan proses traversal. Ini akan melintasi langkah demi langkah dari grid besar ke sel.
Kode 29 ~ 30 baris. Jika kondisi ini terpenuhi, artinya sekarang telah dilintasi ke sel, maka jelas itu adalah simpul daun, yang dapat ditentukan sesuai dengan nilai di sel.
Kode 37 ~ 42 baris. Jika satu traversal berakhir, traversal akan menuju ke baris 37. Pada saat ini, dapatkan nilai val dan nilai isLeaf dari semua grid saudara. Untuk C ++ Jika semua jumlah isLeaf adalah 4, itu berarti semua grid adalah node daun.Jika jumlah semua nilai val sama dengan 0, berarti seluruh grid semuanya 0. Demikian pula jika jumlah nilai val adalah 4 Jika, maka seluruh grid semuanya 1s, yang jelas merupakan simpul daun. Sebaliknya, seluruh grid adalah node non-daun, jadi objek Node baru harus dibuat. .
Implementasi bahasa python:
Prinsip realisasi bahasa python dan bahasa C pada dasarnya sama. Perbedaannya adalah ketika membandingkan val dan isLeaf, python dapat dengan mudah membandingkan val secara langsung dengan menggabungkan ==.
kode acara seperti di bawah ini:
Implementasi bahasa Jawa:
Implementasi Java sama dengan implementasi bahasa C. Perbedaannya masih pada perbandingan antara val dan isLeaf. Tipe Boolean Java tidak dapat secara langsung berpartisipasi dalam empat operasi aritmatika sebagai tipe integral, tetapi hanya dapat menggunakan operasi perbandingan. Perhatikan baris 35 di sini, jika dinilai apakah semua nilai val sama.
kode acara seperti di bawah ini:
- Kampanye Nona Internasional China | Chen Xiaohua dari Hong Kong menang, tapi Meizhou tidak masuk dalam 5 besar dan netizen tidak marah?
- Mengambil mimpi sebagai kuda untuk menghayati kejayaan, mulailah perjalanan intelektual Lexus vivo dalam semilir angin musim gugur yang sejuk
- Apakah ini skema warna eksklusif lagi? ! Sepasang kulit paten atas Air Max 97 ini, Anda ingin segera berdiri setelah terpapar
- Kedai teh nostalgia telah diselamatkan, lelaki tua Lianxianglou menghabiskan 400.000 sebulan untuk menjaga perasaan orang Hong Kong!
- Apakah mobil keluarga kompak merupakan usaha patungan? Kedua mobil otonom ini mengungkapkan ketidakpuasannya
- Kurir | BMW, yang berbicara tentang "empat modernisasi", apa yang akan ditampilkan Shanghai Auto Show?
- Pengganti Tan Yuying resmi meninggalkan sarang TVB. Ingatkah Anda dengan pembawa acara anak-anak yang menemani Anda?