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(log⁡n)

  • 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(nlog⁡n)

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(log⁡n)
— 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)pp∈O(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(log⁡n)[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(log⁡n)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.