Sparse Table
Sparse table aralıklardaki elemanların toplamı, minimumu, maksimumu ve EBOB'ları gibi sorgulara \(\mathcal{O}(\log N)\) zaman karmaşıklığında cevap alabilmemizi sağlayan bir veri yapısıdır. Bazı tip sorgular (aralıktaki minimum, maksimum sayıyı bulma gibi) ise \(\mathcal{O}(1)\) zaman karmaşıklığında yapmaya uygundur.
Bu veri yapısı durumu değişmeyen, sabit bir veri üzerinde ön işlemler yaparak kurulur. Dinamik veriler için kullanışlı değildir. Veri üzerinde herhangi bir değişiklik durumda Sparse table tekrardan kurulmalıdır. Bu da maliyetli bir durumdur.
Yapısı ve Kuruluşu¶
Sparse table iki bouyutlu bir dizi şeklinde, \(\mathcal{O}(N\log N)\) hafıza karmaşıklığına sahip bir veri yapısıdır. Dizinin her elemanından \(2\)'nin kuvvetleri uzaklıktaki elemanlara kadar olan cevaplar Sparse table'da saklanır. \(ST_{x,i}\), \(x\) indeksli elemandan \(x + 2^i - 1\) indeksli elemana kadar olan aralığın cevabını saklayacak şekilde sparse table kurulur.
Sorgu Algoritması¶
Herhangi bir \([l,r]\) aralığı için sorgu algoritması sırasıyla şu şekilde çalışır:
- \([l,r]\) aralığını cevaplarını önceden hesapladığımız aralıklara parçala.
- Sadece \(2\)'nin kuvveti uzunluğunda parçaların cevaplarını sakladığımız için aralığımızı \(2\)'nin kuvveti uzunluğunda aralıklara ayırmalıyız. \([l,r]\) aralığının uzunluğunun ikilik tabanda yazdığımızda hangi aralıklara parçalamamız gerektiğini bulmuş oluruz.
- Bu aralıklardan gelen cevapları birleştirerek \([l,r]\) aralığının cevabını hesapla.
Herhangi bir aralığın uzunluğunun ikilik tabandaki yazılışındaki \(1\) rakamlarının sayısı en fazla \(\log(N)\) olabileceğinden parçalayacağımız aralık sayısı da en fazla \(\log(N)\) olur. Dolayısıyla sorgu işlemimiz \(\mathcal{O}(\log N)\) zaman karmaşıklığında çalışır.
Örneğin: \([4,17]\) aralığının cevabını hesaplamak için algoritmamız \([4,17]\) aralığını \([4,11]\), \([12,15]\) ve \([16,17]\) aralıklarına ayırır ve bu \(3\) aralıktan gelen cevapları birleştirerek istenilen cevabı hesaplar.
Minimum ve Maksimum Sorgu¶
Sparse Table veri yapısının diğer veri yapılarından farklı olarak \(\mathcal{O}(1)\) zaman karmaşıklığında aralıklarda minimum veya maksimum sorgusu yapabilmesi en avantajlı özelliğidir.
Herhangi bir aralığın cevabını hesaplarken bu aralıktaki herhangi bir elemanı birden fazla kez değerlendirmemiz cevabı etkilemez. Bu durum aralığımızı \(2\)'nin kuvveti uzunluğunda maksimum \(2\) adet aralığa bölebilmemize ve bu aralıkların cevaplarını \(\mathcal{O}(1)\) zaman karmaşıklığında birleştirebilmemize olanak sağlar.
Sparse Table veri yapısı ile ilgili örnek bir probleme buradan ulaşabilirsiniz.