Aralık modu sorgusu - Range mode query

İçinde veri yapıları, aralık modu sorgu problemi, bazı giriş verilerinde bir veri yapısı oluşturarak, mod girişin herhangi bir ardışık alt kümesinin.

Sorun bildirimi

Bir dizi verildiğinde , formun sorularını cevaplamak istiyoruz , nerede . Mod herhangi bir dizinin bir unsurdur öyle ki frekansı frekansından büyük veya eşittir . Örneğin, eğer , sonra çünkü üç kez meydana gelirken diğer tüm değerler daha az meydana gelir. Bu problemde, sorgular formun alt dizilerinin modunu sorar. .

Teorem 1

İzin Vermek ve herhangi biri ol çoklu kümeler. Eğer modudur ve , sonra modudur .

Kanıt

İzin Vermek modu olmak ve frekansı olmak . Farz et ki modu değil . Böylece bir unsur var frekansla bu moddur . Dan beri modu ve şu , sonra . Böylece, modu olmalı bu bir çelişkidir.

Sonuçlar

UzaySorgu ZamanıKısıtlamalarKaynak
[1]
kelime boyutu[1]
[2]
[2]

Alt sınır

Kullanan herhangi bir veri yapısı hücreleri her birinin ihtiyacı olan bitler Aralık modu sorgusunu yanıtlama zamanı.[3]

Bu, sabit zamanlı sorgu süresi ve doğrusal alan sunan çözümlere sahip minimum aralık sorgusu gibi diğer aralık sorgu sorunlarıyla çelişir. Bu, mod sorununun sertliğinden kaynaklanmaktadır, çünkü modunu bilsek bile ve modu , modunu hesaplamanın basit bir yolu yoktur. . Herhangi bir öğesi veya mod olabilir. Örneğin, eğer ve frekansı , ve ve frekansı da bir unsur olabilir frekansla içinde ve frekans içinde . , ancak frekansı frekansından daha büyüktür ve , hangi yapar için daha iyi bir aday -den veya .

Karekök sorgu süreli doğrusal uzay veri yapısı

Chan ve ark.[1] kullanır uzay ve sorgu zamanı. Ayarlayarak , anlıyoruz ve alan ve sorgu süresi sınırları.

Ön işleme

İzin Vermek bir dizi olmak ve A'nın farklı değerlerini içeren bir dizi olabilir, burada farklı öğelerin sayısıdır. Biz tanımlıyoruz her biri için bir dizi olmak , sırasını (konumunu) içerir içinde . Diziler doğrusal bir tarama ile oluşturulabilir .

Diziler ayrıca, her biri için , . Sonra bir dizi oluşturuyoruz öyle ki herkes için , rütbesini içerir içinde . Yine, doğrusal bir tarama dizi oluşturmak için yeterlidir ve .

Artık formun sorularını yanıtlamak mümkün. içinde en azından "sabit zamanda, kontrol ederek .

Dizi B'ye bölünmüştür bloklar , her boyutta . Böylece bir blok yayılır . Her bir bloğun veya ardışık blok setinin modu ve frekansı iki tabloda önceden hesaplanacaktır. ve . modu veya eşdeğer olarak, modu , ve ilgili frekansı kaydeder. Bu iki tablo şurada saklanabilir boşluk ve burada doldurulabilir tarayarak bir dizi hesaplama her seferinde aşağıdaki algoritmayla:

algoritma computeS_Sprime dır-dir    giriş: Dizi B = [0: n - 1], Dizi D = [0: Delta - 1], Tam Sayı s    çıktı: Tablolar S ve Sprime    İzin Vermek S ← Tablo (0: n - 1, 0: n - 1) let Sprime ← Tablo (0: n - 1, 0: n - 1) let firstOccurence ← Dizi (0: Delta - 1) hepsi için ben içinde {0, ..., Delta - 1} yapmak        firstOccurence [i] ← -1 sonu için    için i ← 0: s - 1 yapmak            İzin Vermek j ← i × t izin ver c ← 0 izin fc ← 0 izin noBlock ← izin verdim block_start ← j izin block_end ← min {(i + 1) × t - 1, n - 1} süre j yapmak                Eğer firstOccurence [B [j]] = -1 sonra                firstOccurence [B [j]] ← j eğer biterse		            Eğer atLeastQInstances (firstOccurence [B [j]], block_end, fc + 1) sonra                c ← B [j] fc ← fc + 1 eğer biterse		            Eğer j = block_end sonra                S [i * s + noBlock] ← c Sprime [i × s + noBlock] ← fc noBlock ← noBlock + 1 block_end ← min {block_end + t, n - 1} eğer biterse        bitince        hepsi için j içinde {0, ..., Delta - 1} yapmak            firstOccurence [j] ← -1 sonu için    sonu için

Sorgu

Sorgu algoritmasını dizi üzerinden tanımlayacağız . Bu bir yanıta çevrilebilir , o zamandan beri , için bir mod ancak ve ancak için bir mod . İçin bir cevabı dönüştürebiliriz cevaba sürekli olarak içine bakarak veya ilgili dizinde.

Bir sorgu verildi sorgu üç bölüme ayrılmıştır: önek, aralık ve sonek. İzin Vermek ve . Bunlar, tamamen içerdiği ilk ve son bloğun indislerini belirtir. . Bu blokların aralığı, aralık olarak adlandırılır. Önek daha sonra (aralıktan önceki dizinler kümesi) ve son ek (aralıktan sonraki dizinler kümesi). Önek, sonek veya aralık boş olabilir, ikincisi ise .

Aralık için mod zaten depolanmış . İzin Vermek içinde depolanan modun frekansı olabilir . Aralık boşsa, izin ver . Teorem 1 ile şunu hatırlayın: ön ekin, açıklığın veya son ekin bir öğesidir. Frekansın mevcut adaydan daha yüksek olup olmadığını kontrol etmek için öneki ve son ekteki her öğe üzerinde doğrusal bir tarama gerçekleştirilir. , bu durumda ve yeni değere güncellenir. Taramanın sonunda, modunu içerir ve frekansı.

Tarama prosedürü

Prosedür hem önek hem de sonek için benzerdir, bu nedenle bu prosedürü her ikisi için çalıştırmak yeterlidir:

İzin Vermek geçerli öğenin dizini olabilir. Üç durum vardır:

  1. Eğer , sonra mevcuttu ve frekansı zaten sayılmıştır. Bir sonraki öğeye geçin.
  2. Aksi takdirde, sıklığının olup olmadığını kontrol edin. içinde en azından (bu, kontrol etmekle eşdeğer olduğundan, sabit zamanda yapılabilir. ).
    1. Değilse, bir sonraki öğeye geçin.
    2. Eğer öyleyse, gerçek frekansı hesaplayın nın-nin içinde doğrusal bir tarama ile (dizinden başlayarak ) veya içinde ikili arama . Ayarlamak ve .

Bu doğrusal tarama (frekans hesaplamaları hariç), blok boyutu ile sınırlıdır. ne ön ek ne de son ek bundan daha büyük olamaz . Frekans hesaplamaları için yapılan doğrusal taramaların daha ileri bir analizi, bunun aynı zamanda blok boyutu ile sınırlandığını göstermektedir.[1] Böylece sorgu zamanı .

Sabit sorgu süreli alt-kuadratik uzay veri yapısı

Bu yöntem [2] kullanır sabit zamanlı sorgu için alan. Sabit bir sorgu süresi isteniyorsa, bunun Chan ve diğerleri tarafından önerilen çözümden daha iyi bir çözüm olduğunu gözlemleyebiliriz.[1] ikincisi bir boşluk verirken sabit sorgu süresi için eğer .

Ön işleme

İzin Vermek dizi olun. Ön işleme üç adımda yapılır:

  1. Diziyi böl içinde bloklar , her bloğun boyutu . Bir masa oluşturun boyut nerede modu . Bu adım için toplam alan
  2. Herhangi bir sorgu için , İzin Vermek içeren blok ol ve içeren blok ol . Aralık, tamamen içerdiği bloklar kümesi olsun . Mod bloğun% 50'si geri alınabilir . Teorem 1'e göre mod, ön ekin bir öğesi olabilir (indisler aralığın başlangıcından önce), son ekin bir öğesi (indisleri sürenin bitiminden sonra) veya . Ön ekin boyutu artı son ekin boyutu aşağıdakilerle sınırlandırılmıştır: , böylece modun konumu, ile arasında değişen bir tamsayı olarak saklanır. -e , nerede öneki / soneki bir konumu belirtir ve modun aralığın modu olduğunu gösterir. Var blokları içeren olası sorgular ve , bu nedenle bu değerler bir boyut tablosunda saklanır . Ayrıca, var bu tür tablolar, dolayısıyla bu adım için gereken toplam alan . Bu tablolara erişmek için tablodaki moda ek olarak bir işaretçi eklenir. her bir blok çifti için.
  3. Sorguları işlemek için nerede ve aynı bloktaki tüm bu çözümler önceden hesaplanmıştır. Var bunlardan üç boyutlu bir tabloda saklanırlar bu boyutta.

Bu veri yapısı tarafından kullanılan toplam alan hangi azalır eğer alırsak .

Sorgu

Bir sorgu verildiğinde , tamamen bir bloğun içinde olup olmadığını kontrol edin, bu durumda cevap tabloda saklanır . Sorgu tam olarak bir veya daha fazla bloğu kapsıyorsa, cevap tabloda bulunur. . Aksi takdirde, tabloda depolanan işaretçiyi kullanın pozisyonda , nerede sırasıyla içeren blokların indisleridir ve , masayı bulmak için Bu bloklar için modun konumlarını içeren ve modu bulmak için konumu kullanan . Bu, sabit bir zamanda yapılabilir.

Referanslar

  1. ^ a b c d e Chan, Timothy M .; Durocher, Stephane; Larsen, Kasper Green; Morrison, Jason; Wilkinson Bryan T. (2013). "Dizilerde Aralık Modu Sorgusu için Doğrusal Uzay Veri Yapıları" (PDF). Hesaplama Sistemleri Teorisi. Springer: 1–23.
  2. ^ a b c Krizanc, Danny; Morin, Pat; Smid, Michiel H.M. (2003). "Listeler ve Ağaçlarda Aralık Modu ve Aralık Ortanca Sorguları" (PDF). ISAAC: 517–526.
  3. ^ Greve, M; Jørgensen, A .; Larsen, K .; Truelsen, J. (2010). "Hücre probu alt sınırları ve menzil modu için yaklaşımlar". Otomata, Diller ve Programlama: 605–616.