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.