Apakah boleh untuk tidak sepenuhnya memahami RB Trees? [Tutup]


15

Jadi saya baru belajar pohon merah-hitam di Cormen dan wow! Biasanya saya suka memahami semua algoritma dan struktur data hingga saya bisa membangunnya kembali dari awal tanpa harus menyontek melihat kode semu. Saya sangat suka algoritma jadi saya senang belajar bagaimana mereka bekerja dan saya biasanya pergi baris demi baris dan mencoba beberapa kasus dengan melihat kode dan memeriksa apakah yang terjadi adalah apa yang saya pahami yang seharusnya terjadi.

Hanya memahami apa yang terjadi, saya BANYAK waktu untuk pohon RB. Bahkan dengan penjelasan buku itu, saya masih kesulitan memahami kode itu. Belum lagi saya tidak mengerti bagaimana / mengapa rotasi bekerja. Saya tidak menemukan itu intuitif sama sekali. Maksud saya, tiga (enam sebenarnya) kasus berbeda untuk dimasukkan dan kemudian 4 kasus untuk dihapus? Apakah mungkin untuk memahami hal ini? Tidak mungkin bagi saya untuk membangun kembali kode ini tanpa curang. Sampai pohon biner saya dapat mengimplementasikan hal-hal itu dari kepala saya, dengan beberapa penyesuaian akan selalu berhasil, tetapi pohon RB saya bahkan tidak akan mencoba. Maksudku, bahkan guru kadang-kadang bingung, jadi kurasa itu tidak mudah, tetapi pada saat yang sama, tidakkah kita harus memahami semua yang terjadi atau setidaknya mengapa? Buku tidak Saya tidak benar-benar menjelaskan bagaimana seseorang muncul dengan gagasan rotasi. Bagaimana seseorang memperhatikan bahwa dengan 2 rotasi Anda bisa menyelesaikan masalah penyisipan? Itu luar biasa!

Pertanyaan saya adalah, apakah saya benar-benar harus 100% memahami pohon RB? Saya merasa melewatkan hal-hal buruk tanpa sepenuhnya memahaminya. Terima kasih sebelumnya, teman-teman! (PS: tidak ada tag untuk RB-tree, sebenarnya bahkan tidak untuk tree, hanya binary-tree, jadi saya hanya menempatkan algoritma)


18
"Anak muda, dalam matematika kamu tidak mengerti banyak hal. Kamu hanya terbiasa dengan mereka." - John von Neumann

2
@Clash Dalam konteks apa? Saya rasa saya tidak pernah perlu tahu bagaimana pohon RB bekerja di lingkungan profesional, tetapi itu mungkin berbeda berdasarkan apa yang ingin Anda lakukan. Saya akan mengatakan Anda baik-baik saja untuk melewati mereka sampai Anda membutuhkannya.
Adam Lear

4
@Clash Sangat mengganggu saya bahwa Anda mengatakan itu "curang" untuk menerapkan apa pun dengan panduan dari sumber eksternal. Pseudocode ada karena suatu alasan - mereka menghilangkan keharusan untuk melakukannya dari memori. Saya sepenuhnya setuju dengan Winston: memahami dan mengetahui dari ingatan adalah dua hal yang berbeda yang saling eksklusif. Menghafal! = Memahami dan memahami! = Menghafal.
doppelgreener

3
Tidak masalah untuk tidak benar-benar peduli tentang pohon RB - sampai saya membutuhkannya?
Steven A. Lowe

1
Mungkin mengerti KAPAN Anda harus menggunakan pohon RB, dalam preferensi untuk semua jenis implementasi pohon lainnya. Ketahui masalah apa yang mereka pecahkan, dan semua alasan untuk memilih pohon RB. Tetapi jika Anda harus menerapkan satu (di luar ujian, tentu saja), Anda akan dapat mencarinya; jadi mengapa repot-repot mengetahui cara melakukannya dari memori?
Dawood mengatakan mengembalikan Monica

Jawaban:


13

Anda tampaknya menyamakan gagasan "memahami" dengan "bisa menulis kode tanpa melihat buku." Ini adalah dua hal yang berbeda. Jika Anda dapat melihat bagaimana memutar simpul pohon mengatur ulang pohon untuk menjaga keseimbangan, maka Anda memahaminya. Mampu untuk segera mengingat semua kasus yang berlaku rotasi bukan itu intinya.

Saya sendiri, saya mungkin bisa mengetahui rotasi jika saya punya pena / kertas / beberapa jam untuk bermain dengannya. Tapi tentu saja saya tidak bisa menuliskannya tanpa pikir panjang. Jika saya benar-benar harus menulis algoritma seperti itu, saya akan mencarinya untuk memastikan saya mendapatkan semua detail dengan benar. Tentu saja, dalam hampir semua situasi saya akan menggunakan kode yang sudah ditulis.

Di mana semua ini mulai digunakan adalah ketika Anda menemukan situasi yang tidak cocok dengan salah satu algoritma. Anda tidak perlu menulis implementasi pohon Anda sendiri. Tetapi Anda dapat menemukan diri Anda, katakanlah, perlu meratakan ahli waris dari daftar yang memiliki hubungan ganda. Dalam hal itu, setelah memahami ide dasar di balik rotasi bisa sangat membantu.


2
"Anda tampaknya menyamakan ide" pemahaman "dengan" bisa menulis kode tanpa melihat buku. " Ini adalah dua hal yang berbeda.' Err ... tidak. Jika Anda menulis ini, kemungkinan Anda belum pernah belajar matematika lebih dari setahun atau dua tahun di perguruan tinggi, bahkan jika itu. Pada suatu titik, "memahami" matematika (yang, berdasarkan Turing, sama dengan komputasi) hanya tentang mampu menunjukkan apa yang Anda "mengerti". Tidak ada solusi atau ifs atau maybes atau foo atau bar atau baz. Pada tingkat itu, jika Anda tidak dapat membuktikan pernyataan matematika Anda, Anda bersulang. (Kecuali nama Anda Fermat.)
Denis de Bernardy

14
@ Dennis, saya memiliki MS di CS dengan jumlah rata-rata kursus matematika untuk jurusan. Saya khawatir Anda belum mengerti maksud saya. Mampu membuktikan atau menunjukkan apa yang Anda pahami sangat penting. Mampu menghafal detail bukti atau metode tidak. Anda HARUS bisa menulis kode. Tapi saya tidak melihat ada gunanya persyaratan untuk dapat menulis kode dari MEMORY.
Winston Ewert

2
Hati-hati di mana Anda melihatnya juga - IIRC, beberapa buku teks memiliki kesalahan signifikan dalam algoritma pohon merah-hitam mereka.
Steve314

2
@ Steve314, Anda bahkan tidak perlu memahami RB untuk menjadi penulis buku teks! ;)
Winston Ewert

Terima kasih Winston, ini membuat saya lega! Hanya ada beberapa hal yang saya tidak mengerti dengan kode yang mungkin saya posting dalam waktu dekat. Tapi saya sangat senang bahwa tidak apa-apa untuk tidak mengerti (dengan mengerti maksud saya menulis kode tanpa curang) mengapa / bagaimana seseorang memperhatikan 3/6 case untuk dimasukkan dan 4/8 case untuk dihapus.
Bernardo Pires

4

Jika Anda benar-benar fasih dengan pemrograman fungsional, Anda mungkin menemukan pendekatan ini lebih baik bagi mereka (Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

Jika tidak, setidaknya ingat dari kalimat pembuka:

Semua orang belajar tentang pohon pencarian biner seimbang dalam kelas ilmu komputer pengantar mereka, tetapi bahkan orang-orang yang takut akan hal itu benar-benar mengimplementasikan binatang buas semacam itu.


Hahah ryan! Itu membuat saya lega! Terima kasih banyak! Hari ini saya juga memperhatikan bahwa ada sangat sedikit pertanyaan di SO tentang RB-Trees. Jadi saya kira mereka benar-benar rumit.
Bernardo Pires

2
Saya pikir hanya itu, selain dari mahasiswa CS perguruan tinggi, mereka adalah jenis hal yang diimplementasikan sekitar satu kali per bahasa pemrograman. (Atau kurang. Saya pikir kode RB paling populer untuk Skema porting dari kode RB untuk OCaml.)
Ryan Culpepper

Tautan rusak: mirror 1 , mirror 2 . Kutipan lengkap jika kedua cermin tidak tersedia di beberapa titik di masa depan: Chris Okasaki, "Pohon Merah-Hitam dalam Pengaturan Fungsional", Jurnal Pemrograman Fungsional, 9 (4), pp471-477, Juli 1999.
Snowball

3

Anda tidak perlu memahami rotasi secara detail. Anda harus memahami hubungan antara pohon RB dan pohon 2-3-4 (lihat Sedgewick). Semua rotasi gila itu jauh lebih masuk akal ketika Anda menganggapnya sebagai pohon 2-3-4. Jika profesor Anda belum mengajarkan pohon RB sebagai detail implementasi untuk 2-3-4 pohon, Anda mungkin harus membaca sesuatu di 2-3-4 pohon. (Perawatan Sedgewick cukup bagus; Wikipedia tidak memilikinya.)

Secara lebih umum, memahami detail implementasi mengapa suatu algoritma berfungsi kadang-kadang hanya berguna. Memahami logika mengapa algoritma bekerja hampir selalu bermanfaat. Mampu membuat sendiri algoritma biasanya tidak diperlukan, meskipun semakin banyak algoritma yang Anda pahami, semakin besar peluang yang Anda miliki.


1

Jika Anda membutuhkan "RB Trees By Heart" untuk ujian Anda minggu depan, Anda harus menggigit peluru dan mempelajarinya. Dalam hal ini, Anda harus mempertimbangkan kembali metode pembelajaran Anda. Mungkin mencoba menjelaskan RB Trees ke teman sekelas akan membantu Anda lebih dari satu malam penulisan kode kesepian.

Jika RB Trees adalah basis untuk kursus Anda berikutnya setelah liburan, lewati saja sekarang (tanpa perasaan buruk) dan berkonsentrasilah pada kursus semester ini. Tapi tetap awasi matamu untuk topik yang bisa mempersiapkanmu untuk upaya kedua di RB Trees.

Jika Anda benar-benar merasa bahwa Anda tidak akan pernah benar-benar membutuhkannya (lih. Komentar Anna Lear), cium mereka selamat tinggal tanpa penyesalan - tidak ada yang tahu lebih banyak bahwa setetes di lautan pengetahuan (terlalu buruk bahwa guru sering berpikir drop mereka adalah yang paling penting).


1

Kunci keberhasilan pemrograman adalah jangan pernah menyerah :

Hari ini pohon RB-nya besok akan menjadi sesuatu yang lain. Pelajaran yang lebih besar adalah tidak menyerah .

Bagi saya, itulah salah satu inti dari pemrograman, tidak menyerah ...

Saya menyarankan agar Anda terus mencoba , dan ketika Anda gagal LAKUKANNYA .

"Sampai Anda mendapatkan, sampai klik, sampai berjalan."

Karena begitu Anda mengatasi gunung, langit menjadi cerah. Pikiran Anda berubah pemahaman, Anda untuk sementara waktu (sampai gunung berikutnya) . Peningkatan sementara ini bernilai lebih dari semua uang di dunia ..


Terima kasih, ini justru ketakutan saya! Jika saya menyerah, apa yang menghentikan saya untuk menyerah pada hal selanjutnya? Inilah sebabnya saya menghabiskan hampir sepanjang hari hanya untuk memahami penyisipan dan penghapusan.
Bernardo Pires

Tidak pernah sia-sia, percayalah padaku ketika "mengklik" ketinggian lebih dari sekadar mengganti keringat dan air mata.
Darknight

0

Cara terbaik untuk memahaminya adalah dengan mencobanya :

  • Ada 3 atau 6 rotasi. Ambil selembar kertas dan tulis satu per satu.
  • Setelah Anda mendapatkannya, pergi dan terapkan Red Black Tree. Tidak apa-apa jika Anda harus mencari beberapa hal.

Begitulah cara kami melakukannya di kampus. Dan untuk pemeriksaan kami harus menjelaskan bagaimana sebagian itu bekerja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.