ความแตกต่างระหว่างต้นไม้เซกเมนต์, ต้นไม้ช่วงเวลา, ต้นไม้ดัชนีแบบไบนารีและต้นไม้ช่วงคืออะไร?


200

อะไรคือความแตกต่างระหว่างต้นไม้เซกเมนต์, ต้นไม้ช่วงเวลา, ต้นไม้ดัชนีแบบไบนารีและต้นไม้ช่วงในแง่ของ:

  • ความคิดหลัก / คำนิยาม
  • การประยุกต์ใช้งาน
  • ประสิทธิภาพ / การสั่งซื้อในมิติที่สูงขึ้น / การใช้พื้นที่

โปรดอย่าเพิ่งให้คำจำกัดความ


12
มันไม่ซ้ำกันคำถามนั้นก็คือถ้าต้นไม้เฟนวิคเป็นลักษณะทั่วไปของช่วงเวลาม้วนผมและคำถามของผมก็เฉพาะเจาะจงมากขึ้นและแตกต่างออกไป
Aditya

7
ยังไม่ได้รับคำตอบที่stackoverflow.com/questions/2795989/…คำตอบที่ได้นั้นจะให้คำจำกัดความ
Aditya

12
มันกว้างเกินไปอย่างไร "x และ y แตกต่างกันอย่างไร?" มีความชัดเจนและมุ่งเน้นตามที่ได้รับ นี่เป็นคำถามที่ดีมาก
IVlad

16
และไม่มีคำตอบที่ดีสำหรับสิ่งนี้ใช้ได้ทุกที่ คำตอบที่ดีจะดีสำหรับชุมชน
Aditya

22
โครงสร้างข้อมูลส่วนใหญ่เหล่านี้ (ยกเว้นต้นไม้เฟนวิค) ได้รับการตรวจสอบในรูปแบบไฟล์ PDF นี้: "ช่วงเวลา, กลุ่ม, ช่วงและลำดับความสำคัญการค้นหาต้นไม้" (โดย DT Lee) หรือคุณสามารถอ่านว่ามันเป็นบทจากหนังสือเล่มนี้: "คู่มือของโครงสร้างข้อมูลและการประยุกต์ใช้"
Evgeny Kluev

คำตอบ:


319

โครงสร้างข้อมูลทั้งหมดเหล่านี้ใช้สำหรับการแก้ปัญหาต่าง ๆ :

  • ทรีของเซกเมนต์จะจัดเก็บช่วงเวลาและปรับให้เหมาะสมสำหรับเคียวรี " ของช่วงเวลาใดที่มีจุดที่กำหนด "
  • ต้นไม้ช่วงเวลาเก็บช่วงเวลาเช่นกัน แต่ปรับให้เหมาะสมสำหรับแบบสอบถาม" ซึ่งช่วงเวลาเหล่านี้ทับซ้อนกับแบบสอบถามช่วงเวลาที่กำหนด " นอกจากนี้ยังสามารถใช้สำหรับการสอบถามจุด - คล้ายกับส่วนของต้นไม้
  • ทรีช่วงเก็บคะแนนและปรับให้เหมาะกับข้อความค้นหา " ซึ่งคะแนนอยู่ในช่วงเวลาที่กำหนด "
  • ต้นไม้ที่มีการทำดัชนีไบนารีจะจัดเก็บรายการ - นับต่อดัชนีและปรับให้เหมาะสำหรับคำสั่ง " จำนวนรายการที่มีระหว่างการสอบถามดัชนี m และ n "

ประสิทธิภาพ / การใช้พื้นที่สำหรับมิติเดียว:

  • ทรีของเซกเมนต์ - O (n logn) เวลาประมวลผลล่วงหน้าเวลาค้นหา O (k + logn) พื้นที่ O (n logn)
  • ต้นไม้ช่วงเวลา - O (n logn) เวลาการประมวลผลล่วงหน้าเวลาแบบสอบถาม O (k + logn) พื้นที่ O (n)
  • ทรีช่วง - เวลาประมวลผลล่วงหน้า O (n logn), เวลาสอบถาม O (k + logn), พื้นที่ O (n)
  • ต้นไม้ดัชนีแบบไบนารี - เวลาการประมวลผลล่วงหน้า O (n logn), เวลาแบบสอบถาม O (logn), พื้นที่ O (n)

(k คือจำนวนผลลัพธ์ที่รายงาน)

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

  • ทรีของเซกเมนต์ - ช่วงเวลาสามารถเพิ่ม / ลบในเวลา O (logn) (ดูที่นี่ )
  • ต้นไม้ช่วงเวลา - ช่วงเวลาสามารถเพิ่ม / ลบในเวลา O (logn)
  • ทรีช่วง - คะแนนใหม่สามารถเพิ่ม / ลบในเวลา O (logn) (ดูที่นี่ )
  • ต้นไม้ดัชนีแบบไบนารี - จำนวนไอเท็มนับต่อดัชนีสามารถเพิ่มขึ้นได้ในเวลา O (logn)

ขนาดที่สูงขึ้น (d> 1):

  • ทรีของเซกเมนต์ - O (n (logn) ^ d) เวลาการประมวลผลล่วงหน้า O (k + (logn) ^ d) เวลาคิวรี O (n (logn) ^ (d-1)) พื้นที่
  • ต้นไม้ช่วงเวลา - O (n logn) เวลาการประมวลผลล่วงหน้า, O (k + (logn) ^ d) เวลาสอบถาม, พื้นที่ O (n logn)
  • ทรีช่วง - O (n (logn) ^ d) เวลาการประมวลผลล่วงหน้า, O (k + (logn) ^ d) เวลาสอบถาม, พื้นที่ O (n (logn) ^ (d-1))
  • ต้นไม้ดัชนีแบบไบนารี - O (n (logn) ^ d) เวลาประมวลผลล่วงหน้า, O ((logn) ^ d) เวลาสอบถาม, พื้นที่ O (n (logn) ^ d)

12
ฉันได้รับความประทับใจจริง ๆ ว่าแบ่งส่วนต้นไม้ <ช่วงเวลาจากนี้ มีเหตุผลใดที่จะชอบแผนภูมิต้นไม้หรือไม่? เช่นใช้งานง่าย?
j_random_hacker

7
@j_random_hacker: อัลกอริธึมที่แบ่งกลุ่มต้นไม้มีข้อได้เปรียบในรูปแบบมิติสูงที่ซับซ้อนกว่าของคิวรีช่วงเวลา ตัวอย่างเช่นการค้นหาว่าเซกเมนต์ของเส้นตรงที่ไม่ได้เป็นแกนขนานตัดกับหน้าต่าง 2D
Lior Kogan

5
ขอบคุณฉันจะสนใจในรายละเอียดใด ๆ ที่คุณสามารถให้ที่
j_random_hacker

3
@j_random_hacker ต้นไม้เซกเมนต์มีการใช้ที่น่าสนใจอีกอย่าง: RMQ (ช่วงการค้นหาขั้นต่ำ) ใน O (log N) เวลาที่ N คือขนาดช่วงเวลาโดยรวม
ars-longa-vita-brevis

1
เหตุใดต้นไม้แบ่งส่วนพื้นที่ O (n log n)? พวกเขาเก็บ N ใบไม้ + N / 2 + N / 4 + ... + N / 2 ^ (บันทึก N) และผลรวมนี้คือ O (N) ถ้าฉันไม่ผิด คำตอบ @ @ icc97 ยังรายงานถึงพื้นที่ O (N)
Ant

24

ไม่ใช่ว่าฉันสามารถเพิ่มอะไรก็ได้ในคำตอบของ Liorแต่ดูเหมือนว่าจะทำได้ด้วยตารางที่ดี

มิติเดียว

k คือจำนวนผลลัพธ์ที่รายงาน

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |        n logn |     n logn |         n logn |    n logn |
|Query         |        k+logn |     k+logn |         k+logn |      logn |
|Space         |        n logn |          n |              n |         n |
|              |               |            |                |           |
|Insert/Delete |          logn |       logn |           logn |      logn |

ขนาดที่สูงขึ้น

d > 1

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |     n(logn)^d |     n logn |      n(logn)^d | n(logn)^d |
|Query         |    k+(logn)^d | k+(logn)^d |     k+(logn)^d |  (logn)^d |
|Space         | n(logn)^(d-1) |     n logn | n(logn)^(d-1)) | n(logn)^d |

ตารางเหล่านี้ถูกสร้างในรูปแบบ Markdown Markdown - ดูสรุปสาระสำคัญนี้หากคุณต้องการตารางที่จัดรูปแบบไว้อย่างดี


2
คุณหมายถึงอะไรจากผลการรายงาน
Pratik Singhal

@ ps06756 อัลกอริทึมการค้นหามักจะมี runtime ของ log (n) โดยที่ n คือ inputsize แต่สามารถให้ผลลัพธ์ที่เป็นเชิงเส้นใน n ซึ่งไม่สามารถทำได้ในเวลาลอการิทึม (ไม่สามารถแสดงตัวเลข n ใน log (n)) .
oerpli

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