Apa perbedaan antara pohon segmen, pohon interval, pohon indeks biner dan pohon jarak?

200

Apa perbedaan antara pohon segmen, pohon interval, pohon indeks biner dan pohon rentang dalam hal:

  • Gagasan / definisi utama
  • Aplikasi
  • Performa / ketertiban dalam dimensi / konsumsi ruang yang lebih tinggi

Tolong jangan hanya memberikan definisi.

Aditya
sumber
12
Ini bukan duplikat, Pertanyaan itu adalah apakah pohon fenwick adalah generalisasi interval interval, dan pertanyaan saya lebih spesifik dan berbeda.
Aditya
7
Belum dijawab di stackoverflow.com/questions/2795989/… , jawaban di sana hanya memberikan definisi.
Aditya
12
Bagaimana itu terlalu luas? "Apa perbedaan antara x dan y?" sejelas dan fokus seperti yang didapat. Ini pertanyaan yang sangat bagus.
IVlad
16
Dan tidak ada jawaban yang baik untuk ini tersedia di mana saja. Jawaban yang bagus akan bagus untuk komunitas
Aditya
22
Sebagian besar struktur data ini (kecuali pohon Fenwick) ditinjau dalam pdf ini: "Interval, Segmen, Rentang, dan Pohon Pencarian Prioritas" (oleh DT Lee). Atau Anda dapat membacanya sebagai bab dari buku ini: "Buku Pegangan Struktur Data dan Aplikasi" .
Evgeny Kluev

Jawaban:

319

Semua struktur data ini digunakan untuk memecahkan masalah yang berbeda:

  • Pohon segmen menyimpan interval, dan dioptimalkan untuk kueri " yang mana dari interval ini berisi titik tertentu ".
  • Interval tree juga menyimpan interval, tetapi dioptimalkan untuk kueri " yang mana dari interval ini tumpang tindih dengan interval yang diberikan ". Ini juga dapat digunakan untuk kueri titik - mirip dengan pohon segmen.
  • Rentang pohon menyimpan poin, dan dioptimalkan untuk kueri " yang jatuh dalam interval tertentu ".
  • Pohon biner diindeks menyimpan item-hitung per indeks, dan dioptimalkan untuk " berapa banyak item yang ada antara kueri indeks m dan n ".

Konsumsi Kinerja / Ruang untuk satu dimensi:

  • Pohon segmen - O (n logn) waktu preprocessing, O (k + logn) waktu query, O (n logn) ruang
  • Interval tree - O (n logn) waktu preprocessing, O (k + logn) waktu query, O (n) spasi
  • Rentang pohon - O (n logn) waktu preprocessing, O (k + logn) waktu query, O (n) ruang
  • Binary Indexed tree - O (n logn) waktu preprocessing, O (logn) waktu query, O (n) space

(k adalah jumlah hasil yang dilaporkan).

Semua struktur data dapat bersifat dinamis, dalam arti bahwa skenario penggunaan mencakup perubahan dan kueri data:

  • Pohon segmen - interval dapat ditambahkan / dihapus dalam waktu O (logn) (lihat di sini )
  • Interval tree - interval dapat ditambahkan / dihapus dalam waktu O (logn)
  • Pohon rentang - poin baru dapat ditambahkan / dihapus dalam waktu O (logn) (lihat di sini )
  • Binary Indexed tree - item-count per indeks dapat ditingkatkan dalam waktu O (logn)

Dimensi yang lebih tinggi (d> 1):

  • Pohon segmen - O (n (logn) ^ d) waktu preprocessing, O (k + (logn) ^ d) waktu permintaan, O (n (logn) ^ (d-1)) ruang
  • Interval tree - O (n logn) waktu preprocessing, O (k + (logn) ^ d) waktu permintaan, O (n logn) ruang
  • Rentang pohon - O (n (logn) ^ d) waktu preprocessing, O (k + (logn) ^ d) waktu permintaan, O (n (logn) ^ (d-1))) ruang
  • Binary Indexed tree - O (n (logn) ^ d) waktu preprocessing, O ((logn) ^ d) waktu permintaan, O (n (logn) ^ d) ruang
Lior Kogan
sumber
12
Saya benar-benar mendapatkan kesan bahwa segmen pohon <interval pohon dari ini. Apakah ada alasan untuk memilih pohon segmen? Misalnya kesederhanaan implementasi?
j_random_hacker
7
@ j_random_hacker: Algoritma berbasis pohon segmen memiliki keunggulan dalam varian dimensi tinggi tertentu yang lebih kompleks dari kueri interval. Misalnya, menemukan segmen garis non-sumbu-paralel yang bersinggungan dengan jendela 2D.
Lior Kogan
5
Terima kasih, saya akan tertarik dengan elaborasi apa pun yang Anda bisa berikan tentang itu.
j_random_hacker
3
@ j_random_hacker, pohon segmen memiliki kegunaan lain yang menarik: RMQ (rentang kueri minimum) dalam waktu O (log N) di mana N adalah ukuran interval keseluruhan.
ars-longa-vita-brevis
1
Mengapa pohon segmen O (n log n) ruang? Mereka menyimpan daun N + N / 2 + N / 4 + ... + N / 2 ^ (log N), dan jumlah ini adalah O (N) jika saya tidak salah. Juga @ icc97 jawab juga melaporkan ruang O (N).
Semut
24

Bukannya aku bisa menambahkan apa pun pada jawaban Lior , tapi sepertinya itu bisa dilakukan dengan tabel yang bagus.

Satu dimensi

k adalah jumlah hasil yang dilaporkan

|              | 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 |

Dimensi Tinggi

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 |

Tabel ini dibuat di Github Formatted Markdown - lihat Gist ini jika Anda ingin tabel diformat dengan baik.

icc97
sumber
2
Apa yang Anda maksud dengan hasil yang dilaporkan?
Pratik Singhal
@ ps06756 algoritma pencarian sering memiliki runtime log (n) di mana n adalah inputsize tetapi dapat menghasilkan hasil yang linier dalam n yang tidak dapat dilakukan dalam waktu logaritmik (mengeluarkan n angka dalam log (n) waktu tidak mungkin) .
oerpli
1
Bukankah seharusnya Segment Tree ada O(n logn) spacedi tabel pertama?
Danny_ds