Aralıklarla ilgili güncellemeler ve sıfır sayısını sorgulamak için veri yapısı


13

N boyutu bir tamsayı tablosu korumak ve zaman O ( log n ) aşağıdaki işlemlere izin verecek bir veri yapısı arıyorum .tnO(logn)

  • artırır, t [ a ] , t [ a + 1 ] , ... , t [ b ] .increase(a,b)t[a],t[a+1],,t[b]
  • t [ a ] , t [ a + 1 ] , , t [ b ] azaltan ( a , b ) azalma.decrease(a,b)t[a],t[a+1],,t[b]
  • endeksleri sayısını verir, I öyle ki t [ i ] 0 .support()it[i]0

Her bir azaltma çağrısının, aynı parametrelerle artırmak için bir önceki çağrıyla eşleştirilebileceği vaadine sahipsiniz . Aklımdaki uygulama, zamanında doğrusal dikdörtgenlerin birleştiği alanın O ( n log n ) zamanını hesaplamak için bir tarama hattı algoritmasıdır .a,bO(nlogn)

Dört ağaç büyüklüğüne sahiptir , bu yüzden bir çözüm değildir. Fenwick veya Interval ağaçları doğru lezzete sahiptir, ancak yukarıdaki işlemleri desteklemek için onları nasıl genişleteceğimizi görmüyorum.Θ(n2)


Fenwick ağaçları, "azaltmak için yapılan her çağrının, aynı a, b parametreleriyle artırmak için önceki bir çağrı ile eşleştirilebileceği vaadini kullanmaz.
Jeremy

Sahip olabileceğiniz giriş sayısı en fazla (tekrarları algılayabilir ve veri yapısına ekleyemezsiniz), yine de ortak ölçü ağacı veri yapısını kullanarak O ( log n ) performansı elde ederiz . Bkz. Cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… slayt 47-52. n2O(logn)
Chao Xu

Jérémie ve Chao Xu. Yorumlarınız için teşekkürler. Artık Aralık Ağacının değişen aralık kümelerinin toplam uzunluğunu korumak için nasıl kullanılabileceğini anlıyorum. Bu aslında çok sevimli bir veri yapısı.
Christoph Dürr

Genel veri yapısı problemi için, süresinde arama yapmak O ( p ) O ( n 2 ) boşluğunu gerektirir ; burada p , aktif koordinat çiftleri listesinin boyutudur. Fakat gerçekten de sweepline algoritması s O ( n ) boşluk kalır doğrusal böylece. Sorun hala daha iyi alan bir veri yapısı için açık olan , O ( p ) sırasında, slog(n2)O(log(n))O(p)O(n2)ppO(n)O(p) . pω(n)
Jeremy

2
İşte aynı soruna diğer çözümlere karşı uygulamalarınızı test edebileceğiniz hoş bir bağlantı: spoj.com/OI/problems/NKMARS
Erel Segal-Halevi

Yanıtlar:


2

Segment ağacı kullanın - aralığının daha küçük aralıklara yinelenen bir bölümü . Güncelleme işlemlerinizin her bir aralığı [ a , b ] , bu özyinelemeli bölümdeki aralıkların O ( günlük n ) olarak bölümlenebilir. Her aralık [ x , y ] deposu için:[1,n][a,b]O(logn)[x,y]

  • [ X , y ] , [ a , b ] ' nin bölümlendiği aralıklardan biri olacak şekilde artırılmış ve azaltılmamış [ a , b ] aralıklarının sayısıc(x,y)[a,b][x,y][a,b]
  • Özyinelemede [ x , y ] veya daha düşük aralıkların bölümlenmiş alt kümeleri kapsamında olmayan hücrelerin sayısıu(x,y)[x,y]

Sonra özyinelemeli split [ x , z ] ve [ z + 1 , w ] Elimizdeki u ( x , y ) = { 0 ise  C ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) aksi takdirde[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
böylece bir aralıktaki diğer veriler değiştiğinde her değerini sabit zamanda güncelleyebiliriz . Her destek sorgusu u ( 1 , n ) 'ye bakarak cevaplanabilir .u(x,y)u(1,n)

Bir artış gerçekleştirmek için işlemi, bölüm [ a , b ] içine O ( log n ) aralıkları, artım C ( x , y ) bu aralıkların her biri için ve yeniden hesaplamak için yukarıdaki formül kullanmak u ( x , y ) bu aralıkların her biri ve atalarının her biri için. Azaltma işlemi, bir artış yerine bir azalmayla aynıdır.(a,b)[a,b]O(logn)c(x,y)u(x,y)


İkinci mermini anladığımı sanmıyorum. etiketli çürük olan alt ağaçta , hangi hücreler [ x , y ] ' deki aralıklı bölümlenmiş alt kümeler tarafından kapsanmaz ? Tüm aralık [ x , y ] kapsam dışı mı, yani u ( x , y ) = 0 ? [x,y][x,y][x,y]u(x,y)=0
jbapple

Hangi artış işlemlerini yaptığınıza bağlıdır. Başlangıçta hepsi açığa çıkar, ancak (veya [ x , y ] içinde başlayan veya biten ya da bölümünde [ x , y ] içeren) küçük bir aralığı artırdığınızda azalır. [x,y][x,y][x,y]
David Eppstein

Bir örnek verebilir misiniz?
jbapple

Aralığınızın sayı olduğunu varsayalım [1,8]. Yinelemeli olarak [1,4], [4,8], sonra [1,2], [3,4], [5,6] ve [7,8] 'e bölünür, ardından tüm tek element aralıkları. Başlangıçta, her şey ortaya çıkar, tüm c [x, y] = 0 ve her aralık u = uzunluğuna sahiptir. Ama sonra bir artış [2,6] işlemi yaptığınızı varsayın. İçine [2,6] ayrılabilecek O (log n) maksimum aralıkları [2,2], [3,4] ve [5,6] 'dır, bu nedenle bu üç için c [x, y] ayarladık Cevabımdaki formüle göre, bu üç aralık için de u [x, y] 'in 0 olmasına neden olur. u [1,2] 1 olur, u [1,4] da 1 olur, u [ 5,8] = 2 ve u [1,8] = 1 + 2 = 3
David Eppstein

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.