ต้นย่อยของต้นไม้สีแดงและสีดำ


14

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

เพื่อให้ชัดเจนฉันกำลังพูดถึงอัลกอริทึมที่ให้ต้นไม้สีแดงและดำและสองขอบเขตจะผลิตต้นไม้สีแดงและสีดำใหม่พร้อมองค์ประกอบทั้งหมดของต้นไม้แรกที่อยู่ภายในขอบเขตเหล่านั้น

แน่นอนว่าขอบเขตบนของความซับซ้อนนั้นคือความซับซ้อนของการสำรวจต้นไม้ต้นหนึ่งและสร้างอีกต้นโดยการเพิ่มองค์ประกอบ


3
@Radu: มีข้อผิดพลาดในคุณสมบัติการแก้ไขความคิดเห็น ถ้าคุณใช้น้ำยางในความคิดเห็นและแก้ไขความคิดเห็นของคุณจะเห็นพฤติกรรมแปลก ๆ เช่นการทำสำเนา ฯลฯ
Aryabhata

@Radu ฉันได้เพิ่มวรรคสองสามย่อหน้าเพื่ออธิบายคำถามของฉันได้ดียิ่งขึ้น
Daniel C. Sobral

ต้นไม้เปลี่ยนรูปหรือไม่
Tsuyoshi Ito

นอกจากนี้คุณหมายถึงขอบเขตบนแทนที่จะเป็นขอบเขตล่างในย่อหน้าสุดท้ายหรือไม่
Tsuyoshi Ito

2
ดูเหมือนว่าการดำเนินการแยกบนต้นไม้สีแดงดำสามารถดำเนินการได้ในเวลาที่เลวร้ายที่สุด O (log n) โดยที่ n คือจำนวนองค์ประกอบในต้นไม้ การเรียกร้องนี้สามารถพบได้ในการแนะนำของกระดาษ "หมดจดกรณีที่ร้ายแรงที่สุดเวลาคงที่รายการเรียงลำดับ catenable" โดย Gerth Stølting Brodal, Christos Makris และ Kostas Tsichlas, ESA 2006: cs.au.dk/~gerth/pub/esa06trees.html . ดังที่ฉันได้กล่าวถึงในความคิดเห็นก่อนหน้าของฉันสิ่งนี้จะช่วยให้การดำเนินการกรณีที่เลวร้ายที่สุด O (log n) - เวลาของการดำเนินการช่วงย่อย
Tsuyoshi Ito

คำตอบ:


10

คำตอบนี้รวมความคิดเห็นของฉันกับคำถามและขยายออก

การดำเนินการช่วงย่อยบนต้นไม้สีแดงดำสามารถดำเนินการได้ในเวลาที่เลวร้ายที่สุด O (log n) โดยที่ n คือจำนวนองค์ประกอบในแผนผังต้นกำเนิด เนื่องจากต้นไม้ที่ได้จะมีบางโหนดร่วมกับต้นตำรับวิธีการนี้จึงเหมาะสมเฉพาะถ้าต้นไม้นั้นไม่เปลี่ยนรูป (หรือต้นไม้สามารถเปลี่ยนแปลงได้ แต่ต้นไม้เดิมนั้นไม่ต้องการอีกต่อไป)

ประกาศแรกว่าการดำเนินการช่วงย่อยสามารถดำเนินการได้โดยการดำเนินการแยกสองครั้ง ที่นี่การดำเนินการแยกจะใช้ต้นไม้ T สีแดงดำและคีย์ x และสร้างต้นไม้สองต้น L และ R โดยที่ L ประกอบด้วยองค์ประกอบทั้งหมดของ T น้อยกว่า x และ R องค์ประกอบของ T ที่มากกว่า x ดังนั้นเป้าหมายของเราในตอนนี้คือการดำเนินการแยกบนต้นไม้สีแดงดำในเวลาที่เลวร้ายที่สุดกรณี O (log n)

เราจะดำเนินการแยกบนต้นไม้สีแดงดำในเวลา O (log n) ได้อย่างไร มันกลับกลายเป็นว่ามีวิธีการที่รู้จักกันดี (ผมไม่ทราบ แต่ผมผู้เชี่ยวชาญของโครงสร้างข้อมูล no.) พิจารณาเข้าร่วมการดำเนินงานซึ่งจะมีต้นไม้สองต้น L และ R ดังกล่าวว่าค่าใน L ทุกคนเป็นน้อยกว่าค่าใน R ทุกคนและผลิตต้นไม้ประกอบด้วยทั้งหมด ค่าใน L และ R การดำเนินการเข้าร่วมสามารถดำเนินการได้ในเวลาที่เลวร้ายที่สุด O (| r L −r R | +1) โดยที่ r Lและ r Rคืออันดับของ L และ R ตามลำดับ (นั่นคือจำนวนโหนดสีดำบนเส้นทางจากรากถึงแต่ละใบไม้) การดำเนินการแยกสามารถนำมาใช้โดยใช้การดำเนินการเข้าร่วม O (log n) ครั้งและเวลาที่เลวร้ายที่สุดทั้งหมดยังคงเป็น O (log n) โดยพิจารณาผลรวมเหลื่อม

ส่วนที่ 4.1 และ 4.2 ของหนังสือ [Tar83] โดย Tarjan อธิบายวิธีการดำเนินการเข้าร่วมและการแยกบนต้นไม้สีแดงดำในช่วงเวลาที่เลวร้ายที่สุด O (log n) การใช้งานเหล่านี้ทำลายต้นไม้ดั้งเดิม แต่มันง่ายที่จะแปลงเป็นการใช้งานที่ไม่เปลี่ยนรูปแบบโดยการคัดลอกโหนดแทนการดัดแปลง

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

อ้างอิง

[Tar83] Robert Endre Tarjan โครงสร้างข้อมูลและเครือข่ายอัลกอริทึม เล่มที่ 44 ของCBMS-NSF Regional Conference Series ในสาขาคณิตศาสตร์ประยุกต์ SIAM, 1983


@Radu GRIGore: ใช่เว้นแต่ฉันจะพลาดบางสิ่งบางอย่าง
Tsuyoshi Ito

@Radu GRIGore: หรืออาจจะไม่ตอนนี้ฉันไม่แน่ใจ การใช้งานของการดำเนินการแยกนี้จัดสรร O (log n) โหนดใหม่สำหรับทรีเอาท์พุท แต่ฉันคิดว่าการดำเนินการทั้งหมดสามารถดำเนินการได้ในลักษณะแบบเรียกซ้ำหางซึ่งต้องการพื้นที่ทำงาน O (1) เท่านั้น หากสิ่งนี้ถูกต้องคำตอบสำหรับคำถามของคุณจะขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "พื้นที่พิเศษ"
Tsuyoshi Ito

@Radu GRIGore: ในกรณีนี้ฉันคิดว่าพื้นที่พิเศษคือ O (1) แม้ว่าฉันจะไม่ได้ตรวจสอบอย่างรอบคอบ
Tsuyoshi Ito

@Radu GRIGore: ฉันไม่สามารถเห็นเหตุผลที่ว่าทำไมเราถึงใส่ใจเกี่ยวกับปริมาณของพื้นที่ทำงานโดยไม่สนใจปริมาณของพื้นที่ที่จำเป็นในการจัดเก็บผลลัพธ์ ในทฤษฎีความซับซ้อนปัญหามักจะระบุว่าผลลัพธ์คืออะไรดังนั้นพื้นที่ที่ต้องการเก็บผลลัพธ์ไม่ได้ขึ้นอยู่กับอัลกอริธึม อย่างไรก็ตามในปัญหาปัจจุบันมีหลายวิธีที่จะใช้การดำเนินการที่จำเป็นและการใช้งานบางอย่างต้องการพื้นที่เพิ่มเติมเพื่อเก็บผลลัพธ์กว่าคนอื่น ๆ หากคุณเพิกเฉยต่อความแตกต่างของพื้นที่จำนวนนี้ฉันไม่เห็นว่าทำไมคุณถึงสนใจพื้นที่ทำงานที่เราต้องการ
Tsuyoshi Ito

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

8

การแก้ปัญหาคือไม่ใช้ต้นไม้สีแดงดำ ในต้นไม้สเปรย์และต้นไม้ AVL รหัสสำหรับการแยกและเข้าร่วมนั้นง่ายมาก ฉันแนะนำคุณไปยัง URL ต่อไปนี้ด้วยรหัส java สำหรับแผนภูมิต้นไม้และ AVL ที่สนับสนุนสิ่งนี้ ไปที่ URL ต่อไปนี้และดู Set.java (avl trees) และ SplayTree.java (splay trees)

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- แดนนี่ Sleator


5
ยินดีต้อนรับสู่เว็บไซต์ Danny!
Suresh Venkat

2
สิ่งนี้จะช่วยแก้ไขการนำไปใช้งานของ Scala Red Black เพื่อรองรับ subranging ในเวลาที่น้อยกว่าได้O(n)อย่างไร ฉันไม่ได้ถามว่าต้นไม้ชนิดใดที่มีการใช้งานช่วงย่อยง่าย ๆ เพราะนั่นไม่ใช่ปัญหาที่ฉันมี คำตอบนี้มีเจตนาดี แต่ไม่ได้อยู่ในหัวข้อและไม่มีประโยชน์ต่อปัญหาในมือ
Daniel C. Sobral

6

(นี่เป็นการแสดงความคิดเห็น แต่ฉันใหม่เกินไปที่จะแสดงความคิดเห็น)

ฉันแค่ต้องการทราบว่าคุณอาจสนใจในการดำเนินการ "excision" ซึ่งจะส่งกลับค่า subrange เป็นต้นไม้ใหม่และต้นไม้อินพุตที่ไม่มี subrange เป็นอีก คุณต้องมีการควบคุมในการเป็นตัวแทนของต้นไม้แม้ว่าเนื่องจากวิธีการที่รู้จักอาศัยลิงค์ระดับ ตัดตอนมาในเวลาลอการิทึมขนาดต้นไม้เล็กแม้ว่าในความหมายตัด ("ค่าตัดจำหน่าย" เป็น iirc เพราะฉันไม่สามารถเข้าถึงกระดาษอีกต่อไป) ดู:

K. Hoffman, K. Mehlhorn, P. Rosenstiehl และ RE Tarjan, การเรียงลำดับของจอร์แดนในเวลาเชิงเส้นโดยใช้แผนภูมิการค้นหาที่เชื่อมโยงระดับ, ข้อมูลและการควบคุม, 68 (1986), 170–184

ป.ล. การอ้างอิงข้างต้นมาจากการเขียนของ treidel Treaps ยังสนับสนุนการตัดออก


วิธีการนี้จะสันนิษฐานว่ามีตัวชี้ (หรือ "นิ้ว") อยู่แล้วในขอบเขตทั้งสอง
jbapple

3

nm[a,b]

  1. O(lgn)aa
  2. O(m)
  3. O(m)

O(m+lgn)O(n+mlgm)

o(m)Ω(lgm)klgm

ฉันไม่ได้ลงรายละเอียดดังนั้นฉันไม่แน่ใจว่าการทำบัญชีพิเศษมีผลต่อเวลาทำงานอย่างไร

O(1)Ω(lgm)


เมื่อคิดเกี่ยวกับเรื่องนี้ฉันคิดว่าฉันสามารถนับจำนวนคร่าวๆได้O(logn)ซึ่งฉันสามารถหลีกเลี่ยงอาร์เรย์ชั่วคราวได้
Daniel C. Sobral

คุณสามารถนับจำนวนได้ใน O (lg n) โดยจัดเก็บขนาดทรีย่อยไว้ในราก
Radu GRIGore

... แต่การจัดเก็บขนาดในโหนดนั้นขัดกับข้อกำหนดที่จะไม่ใช้พื้นที่เสริมดังนั้นการสังเกตของฉันจึงไม่กังวลเกี่ยวกับความจำของคุณ
Radu GRIGore

1
ต้นไม้ไบนารีสามารถปรับสมดุลได้อย่างสมบูรณ์แบบโดยใช้พื้นที่พิเศษคงที่เท่านั้น (นอกเหนือจากต้นไม้เอง): eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

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