SQRT Decomposition
Square Root Decomposition algoritması dizi üzerinde \(\mathcal{O}(\sqrt{N})\) zaman karmaşıklığında sorgu yapabilmemize ve \(\mathcal{O}(1)\) zaman karmaşıklığında ise değişiklik yapabilmemize olanak sağlayan bir veri yapsıdır.
Yapısı ve Kuruluşu¶
Dizinin elemanları her biri yaklaşık \(\mathcal{O}(\sqrt{N})\) uzunluğunda bloklar halinde parçalanır. Her bir blokun cevabı ayrı ayrı hesaplanır ve bir dizide saklanır.
Blokların Cevapları | \(21\) | \(13\) | \(50\) | \(32\) | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dizideki Elemanlar | \(3\) | \(6\) | \(2\) | \(10\) | \(3\) | \(1\) | \(4\) | \(5\) | \(2\) | \(7\) | \(37\) | \(4\) | \(11\) | \(6\) | \(8\) | \(7\) |
Elemanların İndeksleri | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) | \(9\) | \(10\) | \(11\) | \(12\) | \(13\) | \(14\) | \(15\) | \(16\) |
Sorgu Algoritması¶
Herhangi bir \([l,r]\) aralığı için sorgu algoritması sırası ile şu şekilde çalışır:
- Cevabını aradığımız aralığın tamamen kapladığı blokların cevabını cevabımıza ekliyoruz.
- Tamamen kaplamadığı bloklardaki aralığımızın içinde olan elemanları tek tek gezerek cevabımıza ekliyoruz.
Cevabını aradığımız aralığın kapsadığı blok sayısı en fazla \(\sqrt{N}\) olabileceğinden \(1.\) işlem en fazla \(\sqrt{N}\) kez çalışır. Tamamen kaplamadığı ancak bazı elemanları içeren en fazla \(2\) adet blok olabilir. (Biri en solda diğeri en sağda olacak şekilde.) Bu \(2\) blok için de gezmemiz gereken eleman sayısı maksimum \(2\sqrt{N}\) olduğundan bir sorgu işleminde en fazla \(3\sqrt{N}\) işlem yapılır, dolayısıyla sorgu işlemimiz \(\mathcal{O}(\sqrt{N})\) zaman karmaşıklığında calışır.
Blokların Cevapları | \(21\) | \(13\) | \(50\) | \(32\) | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dizideki Elemanlar | \(3\) | \(6\) | \(2\) | \(10\) | \(3\) | \(1\) | \(4\) | \(5\) | \(2\) | \(7\) | \(37\) | \(4\) | \(11\) | \(6\) | \(8\) | \(7\) |
Elemanların İndeksleri | \(1\) | \(2\) | \(3\) | \(4\) | \(5\) | \(6\) | \(7\) | \(8\) | \(9\) | \(10\) | \(11\) | \(12\) | \(13\) | \(14\) | \(15\) | \(16\) |
Eleman Güncelleme Algoritması¶
Herhangi bir elemanın değerini güncellerken o elemanı içeren blokun değerini güncellememiz yeterli olacaktır. Dolayısıyla güncelleme işlemimimiz \(\mathcal{O}(1)\) zaman karmaşıklığında çalışır.
SQRT Decomposition veri yapısı ile ilgili örnek bir probleme buradan ulaşabilirsiniz.