มันโอเคที่จะไม่เข้าใจต้นไม้ RB อย่างสมบูรณ์หรือไม่? [ปิด]


15

ดังนั้นฉันเพิ่งเรียนรู้ต้นไม้สีดำสีแดงที่ Cormen และว้าว! โดยทั่วไปแล้วฉันชอบที่จะเข้าใจอัลกอริธึมและโครงสร้างข้อมูลทั้งหมดจนถึงจุดที่ฉันสามารถสร้างมันใหม่ตั้งแต่ต้นโดยไม่ต้องโกงดูรหัสหลอก ฉันชอบอัลกอริธึมดังนั้นฉันสนุกกับการเรียนรู้วิธีทำงานและฉันมักจะไปทีละบรรทัดและลองบางกรณีโดยดูที่รหัสและตรวจสอบว่าเกิดอะไรขึ้นเป็นสิ่งที่ฉันเข้าใจว่าควรจะเกิดขึ้น

แค่เข้าใจว่าเกิดอะไรขึ้นฉันใช้เวลามากมายกับต้นไม้ RB แม้จะมีคำอธิบายของหนังสือฉันก็ยังพบว่ามันยากที่จะเข้าใจรหัส ไม่ต้องพูดถึงว่าฉันไม่เข้าใจวิธีการทำงานของเหตุหมุน ฉันไม่พบว่าใช้งานง่ายเลย ฉันหมายถึงกรณีที่แตกต่างกันสาม (หก) จริงสำหรับการแทรกและจากนั้น 4 กรณีสำหรับการลบ? เป็นไปได้ไหมที่จะเข้าใจสิ่งนี้ เป็นไปไม่ได้ที่ฉันจะสร้างรหัสนี้ใหม่โดยไม่ต้องโกง จนกระทั่งต้นไม้ไบนารีฉันสามารถนำสิ่งต่าง ๆ ออกมาจากหัวของฉันด้วยการปรับแต่งบางอย่างมันจะใช้ได้เสมอ แต่ต้นไม้ RB ฉันจะไม่ลองด้วยซ้ำ ฉันหมายถึงแม้ครูจะสับสนในบางครั้งดังนั้นฉันคิดว่ามันไม่ง่ายเลย แต่ในเวลาเดียวกันเราไม่ควรที่จะเข้าใจทุกสิ่งที่เกิดขึ้นหรืออย่างน้อยก็ทำไม? หนังสือทำไม่ได้ ไม่อธิบายว่ามีบางคนคิดเรื่องการหมุนอย่างไร มีใครสังเกตเห็นว่าด้วยการหมุน 2 รอบคุณสามารถแก้ปัญหาการแทรกได้อย่างไร ที่น่าตื่นตาตื่นใจ!

คำถามของฉันคือฉันต้องเข้าใจต้นไม้ RB 100% จริง ๆ หรือไม่ ฉันรู้สึกว่าการกระโดดข้ามสิ่งเลวร้ายโดยไม่เข้าใจอย่างถ่องแท้ ขอบคุณล่วงหน้านะ! (PS: ไม่มีแท็กสำหรับ RB-tree จริงๆแล้วไม่ได้แม้แต่กับ tree แค่ binary-tree ดังนั้นฉันจึงใส่อัลกอริธึมเท่านั้น)


18
“ ชายหนุ่มในวิชาคณิตศาสตร์คุณไม่เข้าใจสิ่งต่าง ๆ คุณเพิ่งชินกับมัน” - John von Neumann

2
@Clash ในบริบทใด ฉันไม่คิดว่าฉันต้องรู้ว่าต้นไม้ RB ทำงานอย่างไรในสภาพแวดล้อมแบบมืออาชีพ แต่อาจแตกต่างกันไปตามสิ่งที่คุณต้องการทำ ฉันจะบอกว่าคุณสบายดีที่จะข้าม 'em จนคุณต้องการ' em
อดัมเลียร์

4
@Clash มันทำให้ฉันรำคาญอย่างมากที่คุณบอกว่ามันเป็น "การโกง" ที่จะนำสิ่งใดไปใช้พร้อมกับคำแนะนำจากแหล่งข้อมูลภายนอก รหัสเทียมมีอยู่ด้วยเหตุผล - พวกเขาไม่จำเป็นต้องทำจากหน่วยความจำ ฉันเห็นด้วยกับ Winston อย่างสมบูรณ์: การทำความเข้าใจและการรู้จากความทรงจำนั้นเป็นสองสิ่งที่แตกต่างกัน ท่องจำ! = ความเข้าใจและเข้าใจ! = ท่องจำ
doppelgreener

3
มันโอเคที่จะไม่สนใจต้นไม้ RB จริงๆ - จนกว่าฉันจะต้องการมัน?
Steven A. Lowe

1
อาจจะเข้าใจเมื่อคุณควรใช้ต้น RB ในการเลือกต้นไม้ชนิดอื่น ๆ ทั้งหมด รู้ว่าพวกเขาแก้ปัญหาอะไรและเหตุผลทั้งหมดในการเลือกต้นไม้ RB แต่ถ้าคุณต้องใช้หนึ่ง (นอกหลักสูตร) ​​คุณจะสามารถค้นหาได้ เหตุใดจึงต้องรู้วิธีที่จะทำจากหน่วยความจำ
Dawood พูดว่าคืนสถานะโมนิก้า

คำตอบ:


13

คุณดูเหมือนจะถือเอาความคิดของ "ความเข้าใจ" กับ "ความสามารถในการเขียนโค้ดโดยไม่ต้องดูหนังสือ" นี่เป็นสองสิ่งที่แตกต่างกัน หากคุณสามารถดูว่าการหมุนโหนดต้นไม้จัดเรียงต้นไม้อย่างไรเพื่อรักษาสมดุลคุณก็เข้าใจ ความสามารถในการเรียกคืนทุกกรณีทันทีที่มีการหมุนเกิดขึ้นไม่ใช่ประเด็น

ตัวฉันเองฉันอาจจะคิดว่าการหมุนถ้าฉันมีปากกา / กระดาษ / หลายชั่วโมงเพื่อเล่นกับมัน แต่ฉันไม่สามารถเขียนมันได้อย่างแน่นอน ถ้าฉันต้องเขียนอัลกอริธึมจริง ๆ ฉันจะค้นหาเพื่อให้แน่ใจว่าฉันได้รับรายละเอียดทั้งหมดถูกต้อง แน่นอนในเกือบทุกสถานการณ์ฉันจะใช้โค้ดที่เขียนแล้ว

ที่มาของการใช้งานทั้งหมดคือเมื่อคุณเจอสถานการณ์ที่ไม่เหมาะกับอัลกอริทึมใด ๆ คุณไม่จำเป็นต้องเขียนการนำต้นไม้มาใช้เอง แต่คุณสามารถพบว่าตัวเองพูดต้องทำให้ทายาทของรายการที่เชื่อมโยงเป็นสองเท่า ในกรณีนี้การเข้าใจแนวคิดพื้นฐานเบื้องหลังการหมุนจะมีประโยชน์มาก


2
'คุณดูเหมือนจะถือเอาความคิดของ "ความเข้าใจ" กับ "ความสามารถในการเขียนโค้ดโดยไม่ต้องดูหนังสือ" นี่เป็นสองสิ่งที่แตกต่างกัน ' เอ่อ ... ไม่ หากคุณกำลังเขียนสิ่งนี้อาจเป็นไปได้ว่าคุณยังไม่ได้เรียนคณิตศาสตร์มากกว่าหนึ่งหรือสองปีของวิทยาลัย ในบางจุด "การทำความเข้าใจ" คณิตศาสตร์ (ซึ่งได้รับความอนุเคราะห์จากทัวริงเท่ากับการคำนวณ) เป็นเพียงการแสดงให้เห็นถึงสิ่งที่คุณ "เข้าใจ" เท่านั้น ไม่มีวิธีแก้ปัญหาหรือ ifs หรือ maybes หรือ foo หรือ bar หรือ baz ในระดับนั้นถ้าคุณไม่สามารถพิสูจน์การยืนยันทางคณิตศาสตร์ของคุณได้คุณก็จะได้ขนมปัง (เว้นแต่ชื่อของคุณคือแฟร์มาต์)
เดนิสเดอเบอร์นาดี

14
@Dennis ฉันมี MS ใน CS พร้อมหลักสูตรคณิตศาสตร์ในระดับที่สูงกว่าค่าเฉลี่ยสำหรับวิชาเอก ฉันกลัวว่าคุณไม่เข้าใจประเด็นของฉัน ความสามารถในการพิสูจน์หรือแสดงให้เห็นถึงสิ่งที่คุณเข้าใจเป็นสิ่งสำคัญมาก ความสามารถในการจดจำรายละเอียดของการพิสูจน์หรือวิธีการไม่ได้ คุณควรจะสามารถเขียนรหัสได้ แต่ฉันไม่เห็นการใช้งานใด ๆ สำหรับความต้องการที่จะสามารถเขียนโค้ดจาก MEMORY
Winston Ewert

2
ระวังที่คุณมองหาด้วยเช่นกัน - IIRC หนังสือบางเล่มมีข้อผิดพลาดที่สำคัญในอัลกอริธึมต้นไม้สีแดงดำ
Steve314

2
@ Steve314 คุณไม่จำเป็นต้องเข้าใจ RB เพื่อที่จะเป็นผู้แต่งตำราเลย! ;)
Winston Ewert

ขอบคุณ Winston นี่ทำให้ฉันโล่งใจ! มีเพียงไม่กี่สิ่งที่ฉันไม่เข้าใจด้วยรหัสที่ฉันอาจโพสต์ในอนาคตอันใกล้ แต่ฉันดีใจที่ไม่เข้าใจ (โดยเข้าใจฉันหมายถึงการเขียนรหัสโดยไม่ต้องโกง) ทำไม / ใครบางคนสังเกตเห็น 3/6 คดีสำหรับการแทรกและ 4/8 คดีสำหรับการลบ
เบอร์นาร์โด Pires

4

หากคุณคุ้นเคยกับการเขียนโปรแกรมที่ใช้งานได้จริงคุณอาจพบว่าวิธีการนี้มีประโยชน์มากกว่า (Okasaki 1999):

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

ถ้าไม่อย่างน้อยก็ให้จำไว้จากประโยคเปิด:

เรียนรู้ทุกคนเกี่ยวกับต้นไม้ค้นหาแบบทวิภาคสมดุลในชั้นเรียนวิทยาศาสตร์คอมพิวเตอร์เบื้องต้นของพวกเขา แต่แม้กระทั่งตัวสั่นฉะนั้นที่คิดว่าจริง ๆ แล้วการใช้สัตว์ดังกล่าว


ฮ่าฮ่าไรอัน! นั่นทำให้ฉันโล่งใจ! ขอบคุณมาก! วันนี้ฉันยังสังเกตเห็นว่ามีคำถามเพียงเล็กน้อยเกี่ยวกับ SO เกี่ยวกับ RB-Trees ดังนั้นฉันคิดว่าพวกเขามีเล่ห์เหลี่ยมจริงๆ
เบอร์นาร์โด Pires

2
ฉันคิดว่ามันเป็นแค่นั้นนอกเหนือจากนักเรียนซีเอสวิทยาลัยแล้วพวกเขายังเป็นประเภทที่ใช้งานได้ประมาณหนึ่งครั้งต่อหนึ่งภาษาโปรแกรม (หรือน้อยกว่าฉันคิดว่ารหัส RB ที่ได้รับความนิยมสูงสุดสำหรับ Scheme นั้นได้รับการพอร์ตจากรหัส RB สำหรับ OCaml)
Ryan Culpepper

ลิงค์เสีย: กระจก 1 , กระจก 2 การอ้างอิงเต็มรูปแบบในกรณีที่กระจกทั้งสองไม่พร้อมใช้งานในบางจุดในอนาคต: Chris Okasaki, "ต้นไม้สีแดงดำในการตั้งค่าการทำงาน", วารสารการเขียนโปรแกรมการทำงาน, 9 (4), pp471-477, กรกฎาคม 1999
สโนว์บอล

3

คุณไม่จำเป็นต้องเข้าใจการหมุนอย่างละเอียด คุณควรเข้าใจความสัมพันธ์ระหว่างต้นไม้ RB กับต้นไม้ 2-3-4 (ดู Sedgewick) การหมุนที่บ้าคลั่งเหล่านั้นทำให้รู้สึกได้ถึงความรู้สึกเมื่อคุณคิดว่ามันเป็นต้นไม้ 2-3-4 หากอาจารย์ของคุณไม่ได้สอนต้นไม้ RB เป็นรายละเอียดการปฏิบัติสำหรับต้นไม้ 2-3-4 คุณควรอ่านบางอย่างบนต้นไม้ 2-3-4 (การรักษาของ Sedgewick นั้นค่อนข้างดี แต่ Wikipedia ไม่มีเลย)

โดยทั่วไปแล้วการทำความเข้าใจรายละเอียดการนำไปปฏิบัติว่าทำไมบางครั้งอัลกอริทึมจึงมีประโยชน์ในบางครั้งเท่านั้น การทำความเข้าใจกับเหตุผลว่าทำไมอัลกอริทึมจึงมีประโยชน์เกือบทุกครั้ง ความสามารถในการคิดหาอัลกอริทึมด้วยตัวเองนั้นไม่จำเป็น แต่อัลกอริธึมที่คุณเข้าใจจะมีโอกาสมากขึ้น


1

หากคุณต้องการ "RB Trees By Heart" เพื่อการสอบในสัปดาห์หน้าคุณจะต้องกัดกระสุนและเรียนรู้พวกเขา ในกรณีนี้คุณควรพิจารณาวิธีการเรียนรู้ของคุณอีกครั้ง บางทีการพยายามอธิบาย RB ต้นไม้ให้กับเพื่อนร่วมชั้นจะช่วยให้คุณมากกว่าการเขียนโค้ดที่อ้างว้างอีกคืนหนึ่ง

หาก RB Trees เป็นพื้นฐานสำหรับเส้นทางต่อไปของคุณหลังจากวันหยุดพักผ่อนให้ข้ามพวกเขาตอนนี้ (โดยไม่มีความรู้สึกที่ไม่ดี) และตั้งสมาธิกับเส้นทางของภาคเรียนนี้ แต่อย่าลืมหัวข้อที่สามารถเตรียมคุณให้พร้อมสำหรับความพยายามครั้งที่สองที่ RB Trees

หากคุณรู้สึกอย่างจริงใจว่าคุณไม่เคยต้องการพวกเขาจริงๆ (เทียบกับความคิดเห็นของแอนนาเลียร์) จูบพวกเขาโดยไม่เสียใจ - ไม่มีใครรู้มากไปกว่าการหยดลงในทะเลแห่งความรู้ (แย่เกินไปที่ครูมักจะคิดว่า สำคัญ).


1

กุญแจสู่ความสำเร็จในการเขียนโปรแกรมคืออย่ายอมแพ้ :

วันนี้ต้นไม้ RB ของพรุ่งนี้จะเป็นอย่างอื่น บทเรียนที่มีขนาดใหญ่จะไม่ให้ขึ้น

สำหรับฉันนั่นเป็นหนึ่งในสาระสำคัญหลักของการเขียนโปรแกรมไม่ยอมแพ้ ...

ผมขอแนะนำว่าคุณพยายามและเมื่อคุณไม่ทำมันอีกครั้ง

"จนกว่าคุณจะได้รับจนกว่าจะคลิกจนกว่ามันจะทำงาน"

เพราะเมื่อคุณเอาชนะภูเขาได้ท้องฟ้าก็ชัดเจน กะใจของคุณในการทำความเข้าใจคุณจะสูงขึ้นชั่วคราว(จนถึงภูเขาถัดไป) การยกระดับชั่วคราวนี้มีค่ามากกว่าเงินทั้งหมดในโลก ..


ขอบคุณนี่คือความกลัวของฉัน! ถ้าฉันยอมแพ้สิ่งนี้จะทำให้ฉันหยุดสิ่งต่อไปได้อย่างไร นี่คือเหตุผลที่ฉันเสียเวลาเกือบทั้งวันเพื่อทำความเข้าใจการแทรกและการลบ
เบอร์นาร์โด Pires

ไม่ต้องเสียเปล่าเลยเชื่อฉันเถอะเมื่อมัน "คลิก" ระดับความสูงมากกว่าที่ทำขึ้นสำหรับเหงื่อและน้ำตาทั้งหมด
Darknight

0

วิธีที่ดีที่สุดที่จะเข้าใจก็คือลองทำดู :

  • มีการหมุน 3 หรือ 6 ครั้ง เอากระดาษหนึ่งแผ่นแล้วเขียนออกมาทีละตัว
  • เมื่อคุณได้รับแล้วให้ไปดำเนินการกับ Red Black Tree ไม่เป็นไรถ้าคุณต้องหาข้อมูลบางอย่าง

มันเป็นวิธีที่เราทำที่วิทยาลัย และสำหรับการสอบเราต้องอธิบายว่ามันทำงานได้อย่างไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.