Segment ağaçlar, aralık ağaçları, ikili indekslenmiş ağaçlar ve aralık ağaçları arasındaki farklar nelerdir?


200

Segment ağaçlar, aralık ağaçları, ikili endekslenmiş ağaçlar ve aralık ağaçları arasındaki farklar:

  • Anahtar fikir / tanım
  • Uygulamalar
  • Daha yüksek boyutlarda performans / sipariş / alan tüketimi

Lütfen sadece tanım vermeyin.


12
Bu bir kopya değil, bu soru fenwick ağaçlarının aralıklı gerilimin genelleştirilmesi olup, sorum daha spesifik ve farklıysa.
Aditya

7
Stackoverflow.com/questions/2795989/… adresinde yanıtlanmamıştır , buradaki cevap sadece tanım verir.
Aditya

12
Nasıl çok geniş? "X ve y arasındaki bazı farklar nelerdir?" olabildiğince açık ve odaklıdır. Bu çok iyi bir soru.
IVlad

16
Ve bunun hiçbir yerde mevcut iyi bir cevabı yok. Topluluk için iyi bir yanıt harika olacak
Aditya

23
Bu veri yapılarının çoğu (Fenwick ağaçları hariç) şu pdf'de incelenmiştir: "Aralık, Segment, Aralık ve Öncelikli Arama Ağaçları" (DT Lee tarafından). Veya bu kitaptan bir bölüm olarak okuyabilirsiniz: "Veri Yapıları ve Uygulamaları El Kitabı" .
Evgeny Kluev

Yanıtlar:


319

Tüm bu veri yapıları farklı problemleri çözmek için kullanılır:

  • Segment ağacı aralıkları saklar ve " bu aralıklardan hangisi belirli bir nokta içerir " sorguları için optimize edilir .
  • Aralıklı ağaç aralıkları da saklar, ancak " bu aralıklardan hangisi belirli bir aralıkla çakışır " sorguları için optimize edilmiştir . Kesim ağacına benzer nokta sorguları için de kullanılabilir.
  • Aralık ağacı noktaları saklar ve " belirli bir aralığa düşen noktalar " sorguları için optimize edilir .
  • İkili dizinlenmiş ağaç , dizin başına öğe sayısını depolar ve " dizin m ile n arasında kaç öğe var " sorguları için optimize edilir .

Bir boyut için performans / Alan tüketimi:

  • Segment ağacı - O (n logn) ön işleme süresi, O (k + logn) sorgu süresi, O (n logn) alanı
  • Aralık ağacı - O (n logn) ön işleme süresi, O (k + logn) sorgu süresi, O (n) boşluk
  • Aralık ağacı - O (n logn) ön işleme süresi, O (k + logn) sorgu süresi, O (n) boşluk
  • İkili Endeksli ağaç - O (n logn) ön işleme süresi, O (logn) sorgu süresi, O (n) boşluk

(k bildirilen sonuç sayısıdır).

Kullanım senaryosunun hem veri değişikliklerini hem de sorguları içermesi bakımından tüm veri yapıları dinamik olabilir:

  • Segment ağacı - aralık O (logn) zamanında eklenebilir / silinebilir ( buraya bakın )
  • Aralık ağacı - aralık O (logn) zamanında eklenebilir / silinebilir
  • Aralık ağacı - O (logn) zamanında yeni noktalar eklenebilir / silinebilir ( buraya bakın )
  • İkili Endeksli ağaç - Endeks başına öğe sayısı O (logn) zamanında arttırılabilir

Daha yüksek boyutlar (d> 1):

  • Segment ağacı - O (n (logn) ^ d) ön işleme süresi, O (k + (logn) ^ d) sorgu süresi, O (n (logn) ^ (d-1)) alanı
  • Aralık ağacı - O (n logn) ön işleme süresi, O (k + (logn) ^ d) sorgu süresi, O (n logn) alanı
  • Aralık ağacı - O (n (logn) ^ d) ön işleme süresi, O (k + (logn) ^ d) sorgu süresi, O (n (logn) ^ (d-1))) boşluk
  • İkili İndekslenmiş ağaç - O (n (logn) ^ d) ön işleme süresi, O ((logn) ^ d) sorgu süresi, O (n (logn) ^ d) boşluk

12
Gerçekten ağaçların bu bölümden <aralıklı olduğu izlenimini edindim. Segment ağacını tercih etmek için herhangi bir neden var mı? Örneğin, uygulama basitliği?
j_random_hacker

7
@j_random_hacker: Bölüm ağaçlarına dayalı algoritmalar, aralık sorgusunun bazı daha karmaşık yüksek boyutlu değişkenlerinde avantajlara sahiptir. Örneğin, eksen-paralel olmayan çizgi parçalarının 2B pencereyle kesiştiğini bulmak.
Lior Kogan

5
Teşekkürler, bu konuda verebileceğiniz herhangi bir ayrıntıyla ilgilenirim.
j_random_hacker

3
@j_random_hacker, segment ağaçlarının başka bir ilginç kullanımı daha vardır: O (log N) zamanında RMQ'lar (aralık minimum sorguları), burada N toplam aralık boyutudur.
ars-longa-vita-brevis

1
Segment ağaçları O (n log n) neden boşluk? N yaprakları + N / 2 + N / 4 + ... + N / 2 ^ (log N) depolarlar ve yanılmıyorsam bu toplam O (N) olur. Ayrıca @ icc97 yanıtı da O (N) boşluğunu bildirir.
Ant

24

Lior'un cevabına bir şey ekleyebileceğimden değil , ama iyi bir tabloyla yapabileceği anlaşılıyor.

Bir Boyut

k rapor edilen sonuçların sayısı

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

Daha Yüksek Boyutlar

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 |

Bu tablolar Github Biçimlendirilmiş Markdown'da oluşturulur - tabloların güzel biçimlendirilmesini istiyorsanız bu Gist'e bakın .


2
Bildirilen sonuçlarla ne demek istiyorsun?
Pratik Singhal

@ ps06756 arama algoritmaları genellikle n'nin girdi boyutu olduğu bir günlük (n) çalışma zamanına sahiptir, ancak n'de doğrusal olan ve logaritmik zamanda yapılamayan sonuçlar verebilir (log (n) zamanında n sayısı çıktısı mümkün değildir) .
oerpli

1
Segment Ağacı O(n logn) spaceilk tabloda olmamalı mı ?
Danny_ds
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.