RB Ağaçlarını tam olarak anlamamak uygun mudur? [kapalı]


15

Bu yüzden Cormen'de kırmızı siyah ağaçlar öğrendim ve vay canına! Tipik olarak tüm algoritmaları ve veri yapılarını, sahte kodlara bakmaktan hile yapmak zorunda kalmadan sıfırdan yeniden oluşturabildiğim noktaya kadar anlamak isterim. Ben gerçekten nasıl çalıştığını öğrenmek zevk algoritmalar seviyorum ve genellikle satır satır gidin ve koda bakarak ve ne olması gerektiğini anladım olup olmadığını kontrol ederek bazı durumlarda deneyin.

Sadece neler olduğunu anlamak bana RB ağaçları için çok zaman aldı. Kitabın açıklamalarında bile, kodu kavramakta zorlanıyordum. Döndürmelerin nasıl / neden çalıştığını anlayamadığımı belirtmiyorum. Hiç sezgisel bulmuyorum. Demek istediğim, yerleştirme için üç (altı aslında) farklı vaka ve sonra silme için 4 vaka? Bu şeyi anlamak mümkün mü? Hile yapmadan bu kodu yeniden oluşturmak benim için imkansız. İkili ağaca kadar, kafamdan bir şeyler uygulayabilirdim, bazı tweaking ile her zaman işe yarayacaktı, ama RB ağaçları denemeyeceğim bile. Demek istediğim, bazen öğretmen bile karıştı, bu yüzden o kadar kolay olmadığını düşünüyorum, ama aynı zamanda, olan her şeyi anlamamıza gerek yok, en azından neden? Kitap yapmadı gerçekten birisinin rotasyon fikrini nasıl ortaya çıkardığını açıklamayın. Birisi 2 tur ile herhangi bir yerleştirme problemini çözebileceğinizi nasıl fark etti? Bu inanılmaz!

Benim sorum, gerçekten% 100 RB ağaçlarını anlamak zorunda mıyım? Tam olarak anlamadan bir tür kötü şeyler atlıyorum. Şimdiden teşekkürler çocuklar! (PS: RB ağacı için etiket yok, aslında ağaç için bile değil, sadece ikili ağaç, bu yüzden sadece algoritmalar koydum)


18
"Genç adam, matematikte bir şeyleri anlamıyorsun. Sadece onlara alışırsın." - John von Neumann

2
@Clash Hangi bağlamda? RB ağaçlarının profesyonel bir ortamda nasıl çalıştığını bilmem gerektiğini hiç sanmıyorum, ancak bu ne yapmak istediğinize bağlı olarak değişebilir. Onlara ihtiyacın olana kadar atlamakta iyi olduğunu söyleyebilirim.
Adam Lear

4
@Clash Harici bir kaynaktan gelen rehberlikle herhangi bir şeyi uygulamanın "aldattığını" söylemeniz beni çok rahatsız ediyor. Sahte kod bir nedenden dolayı var - bunu bellekten yapma ihtiyacını ortadan kaldırıyorlar. Winston'a tamamen katılıyorum: bellekten anlamak ve bilmek iki farklı karşılıklı münhasır şeydir. Ezberlemek! = Anlayış ve anlayış! = Ezberlemek.
doppelgreener

3
RB ağaçlarını gerçekten önemsemem - onlara ihtiyacım olana kadar?
Steven A. Lowe

1
Belki diğer tüm ağaç uygulama türlerine göre RB ağaçlarını NE ZAMAN kullanmanız gerektiğini anlayın. Hangi problemleri çözdüklerini ve RB ağaçlarını seçmenin tüm nedenlerini bilin. Ancak, bir tane uygulamak zorunda kalırsanız (elbette bir sınavın dışında), bakabilirsiniz; Peki neden hafızadan nasıl yapılacağını bilmek zahmetine girsin ki?
Dawood diyor Monica

Yanıtlar:


13

"Anlama" fikrini "kitaba bakmadan kodu yazabilme" ile eşit görüyorsunuz. Bunlar iki farklı şey. Ağaç düğümlerini döndürmenin dengeyi korumak için ağacı nasıl yeniden düzenlediğini görebiliyorsanız, anlarsınız. Rotasyonların uygulandığı tüm vakaları hemen hatırlayabilmek önemli değildir.

Kendim, onunla oynamak için kalem / kağıt / birkaç saatim olsaydı muhtemelen rotasyonları bulabilirdim. Ama kesinlikle düşünmeden yazamadım. Aslında böyle bir algoritma yazmak zorunda kalsaydım, tüm ayrıntıları doğru bir şekilde aldığımdan emin olmak için bakardım. Tabii ki, neredeyse her durumda zaten yazılı kod kullanırdım.

Tüm bunların kullanıldığı yerde, algoritmaların hiçbirine tam olarak uymayan bir durumla karşılaşırsınız. Kendi ağaç uygulamanızı asla yazmanıza gerek kalmayacak. Ancak kendinizi, çift bağlantılı listelerin bir heiraşisini düzleştirmeniz gerektiğini bulabilirsiniz. Bu durumda, dönmenin arkasındaki temel fikri anlamak çok yararlı olabilir.


2
“Anlama” fikrini, “kitaba bakmadan kodu yazabilme” ile eşleştiriyor gibisiniz. Bunlar iki farklı şey.' Hata ... hayır. Eğer bunu yazıyorsanız, muhtemelen bir veya iki yıllık bir kolejden çok daha fazla matematik okumadığınız anlamına gelir. Bir noktada, matematiği "anlamak" (Turing'in izniyle hesaplamaya denktir) yalnızca “anladığınızı” gösterebilmektir. Hiçbir geçici çözüm veya ifs veya maybes veya foo veya bar veya baz yoktur. Bu seviyede, matematik iddianızı kanıtlayamıyorsanız, tost edersiniz. (İsminiz Fermat değilse.)
Denis de Bernardy

14
@Dennis, CS'de majör için ortalamanın üzerinde bir matematik dersine sahip bir MS'im var. Demek istediğim, anlamadım. Anladığınızı kanıtlayabilmeniz veya gösterebilmeniz çok önemlidir. Bir ispat veya yöntemin ayrıntılarını ezberlemek mümkün değildir. Kodu yazabilmelisiniz. Ancak MEMORY kodunu yazabilmek için bir gereksinim görmüyorum.
Winston Ewert

2
Nereye baktığınıza da dikkat edin - IIRC, bazı ders kitaplarında kırmızı-siyah ağaç algoritmalarında önemli hatalar var.
Steve314

2
@ Steve314, o zaman bir ders kitabı yazarı olmak için RB anlamak gerekmez! ;)
Winston Ewert

Teşekkürler Winston, bu beni rahatlattı! Yakın gelecekte yayınlayabileceğim kodla anlamadığım sadece birkaç şey var. Ama çok memnunum (anladığım kadarıyla kodu hile yapmadan yazmayı anlıyorum) neden / birinin sokulmak için 3/6 ve silme için 4/8 vakaları nasıl fark ettiğini çok sevindim.
Bernardo Pires

4

İşlevsel programlamaya hiç aşina değilseniz, bu yaklaşımı onlara daha iyi bulabilirsiniz (Okasaki 1999):

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

Değilse, en azından açılış cümlesinden kalbi alın:

Herkes, bilgisayar bilimi derslerinde dengeli ikili arama ağaçlarını öğrenir, ancak aslında böyle bir canavarı hayata geçirme düşüncesinde stouthearted titreme bile .


Hahah ryan! Bu beni rahatlattı! Çok teşekkürler! Bugün ayrıca SO hakkında RB Ağaçları hakkında çok az soru olduğunu fark ettim. Sanırım gerçekten zorlar.
Bernardo Pires

2
Bence, sadece üniversite CS öğrencileri dışında, her programlama dili için yaklaşık bir kez uygulanan bir şeydir. (Ya da daha az. Bence Scheme için en popüler RB kodu OCaml için RB kodundan alındı.)
Ryan Culpepper

Bağlantı koptu: ayna 1 , ayna 2 . Gelecekte bir noktada her iki aynanın da olmaması durumunda tam atıf: Chris Okasaki, "İşlevsel Bir Ortamda Kırmızı-Siyah Ağaçlar", Fonksiyonel Programlama Dergisi, 9 (4), s. 471-477, Temmuz 1999.
Kartopu

3

Dönüşleri ayrıntılı olarak anlamanız gerekmez. Sen gerektiğini RB ağaçları ve 2-3-4 ağaçları (Sedgewick'e bakınız) arasındaki ilişkiyi anlamasına. Bunları 2-3-4 ağaç olarak düşündüğünüzde, tüm bu çılgın dönüşler çok daha mantıklı. Profesörünüz RB ağaçlarını 2-3-4 ağaç için bir uygulama detayı olarak öğretmediyse, muhtemelen 2-3-4 ağaç üzerinde bir şeyler okumalısınız. (Sedgewick'in tedavisi oldukça iyi; Wikipedia'da yok.)

Daha genel olarak, bir algoritmanın neden işe yaradığının uygulama ayrıntılarını anlamak sadece bazen yararlıdır. Algoritmanın neden çalıştığının mantığını anlamak neredeyse her zaman yararlıdır. Algoritmayı ne kadar çok anlayabiliyorsanız, algoritmayı kendiniz bulmak genellikle gerekli değildir.


1

Gelecek hafta muayeneniz için "RB Ağaçları Kalbe" ihtiyacınız varsa, mermiyi ısırıp öğrenmelisiniz. Bu durumda, öğrenme yöntemlerinizi yeniden düşünmelisiniz. Belki de RB Ağaçlarını bir sınıf arkadaşına anlatmaya çalışmak, yalnız bir kod yazma gecesinden daha fazla yardımcı olacaktır.

RB Ağaçları tatilden sonra bir sonraki kursunuzun temelini oluşturuyorsa, onları şimdi (kötü duygular olmadan) atlayın ve bu dönemin rotasına konsantre olun. Ama sizi RB Ağaçları'nda ikinci bir denemeye hazırlayabilecek konular için gözlerinizi dört açın.

Dürüst olmak gerekirse, onlara gerçekten gerçekten ihtiyacınız olmayacağını düşünüyorsanız (çapraz başvuru Anna Lear'ın yorumu), pişman olmadan veda edin - kimse bilgi denizindeki bir düşüşten daha fazlasını bilmiyor (öğretmenlerin damlalarının en çok olduğunu düşünmesi çok kötü önemli).


1

Programlama başarısının anahtarı asla pes etmemektir :

Bugün RB ağaçları yarın başka bir şey olacak. Büyük ders vazgeçmiyor .

Benim için bu, programlamanın temel özlerinden biri, pes etmiyor ...

Denemeye devam etmenizi öneririm ve başarısız olduğunuzda TEKRAR YAPIN .

"Siz gidene kadar, klik sesi duyulana kadar, koşana kadar."

Çünkü dağların üstesinden geldiğinizde gökyüzü berraklaşır. Zihniniz anlayışta değişir, geçici olarak yükselirsiniz (bir sonraki dağa kadar) . Bu geçici yükselme, dünyadaki tüm paradan daha değerli.


Teşekkürler, bu benim korkumdu! Eğer bundan vazgeçersem, bir sonraki şeyden vazgeçmemi engelleyen nedir? Bu nedenle, yalnızca yerleştirme ve silme işlemlerini anlamak için neredeyse tüm günü boşa harcadım.
Bernardo Pires

Asla bir israf, tüm ter ve gözyaşları telafi daha fazla yükseklik "tıkladığında" inan bana.
Karanlık Gece

0

Bunu anlamanın en iyi yolu denemektir :

  • 3 veya 6 tur vardır. Bir parça kağıt alın ve bunları tek tek yazın.
  • Aldıktan sonra, gidip bir Kızıl Kara Ağaç uygulayın. Birkaç şeye bakmanız gerekiyorsa sorun değil.

Üniversitede böyle yaptık. Muayene için bir kısmının nasıl çalıştığını açıklamamız gerekiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.