Algorithm 输入查询的sqrt分解

Algorithm 输入查询的sqrt分解,algorithm,data-structures,Algorithm,Data Structures,我在这个网站上读到了关于sqrt分解数据结构的内容 我已经理解了DS的标准算法,其中我们将输入数组划分为大小为sqrt(N)的桶,其中N是数组的大小 但我不能理解的是:输入查询的sqrt分解 假设我们遇到了一些问题,其中我们得到了一些输入数据,然后是k个查询,每个查询我们都必须处理并发出响应。我们考虑当请求被请求(不改变系统状态,但只要求一些信息)和修改(即影响系统的状态最初被设置为输入数据)时的情况。p> 这是我无法理解的给定方法:将k个查询拆分为大小为sqrt(k)的bucket,并一次性处

我在这个网站上读到了关于sqrt分解数据结构的内容

我已经理解了DS的标准算法,其中我们将输入数组划分为大小为sqrt(N)的桶,其中N是数组的大小

但我不能理解的是:输入查询的sqrt分解

假设我们遇到了一些问题,其中我们得到了一些输入数据,然后是k个查询,每个查询我们都必须处理并发出响应。我们考虑当请求被请求(不改变系统状态,但只要求一些信息)和修改(即影响系统的状态最初被设置为输入数据)时的情况。p> 这是我无法理解的给定方法:将k个查询拆分为大小为sqrt(k)的bucket,并一次性处理每个bucket中的所有查询


为什么我们将查询分解为sqrt大小的存储桶??以及我们如何处理每个bucket中的所有查询???

他并没有将查询拆分为bucket,而是在逻辑上将数据拆分为sqrt(k)的bucket。然后,他不再在收到每个查询时对其进行响应,而是对查询进行重新排序,以便按范围进行处理。也就是说,在bucket N中开始的查询在bucket N+1中开始的查询之前处理,在bucket M中结束的查询在bucket M+1中结束的查询之前处理

因此,查询是按从左到右的顺序处理的

如果存在sqrt(n)个存储桶,则每个存储桶的大小都是sqrt(n)。假设q=sqrt(n)

假设第一个查询只使用bucket 1。程序必须对第一个铲斗进行q^2计算。然后缓存结果,这样在bucket 1中启动的任何其他查询都不必再次进行计算。当程序从左到右处理查询时,它最终必须对每个bucket执行相同的q^2计算。如果查询最终使用了所有的存储桶,那么我们进行了q计算,每个计算花费了q^2的时间


因为q=sqrt(n),那么q*q^2=sqrt(n)*n.

像其他好主意一样,在一些特殊情况下使用查询。 整个过程都是关于一个查询桶的,您最多可以使用两个指针一次遍历整个数组

所以这个必要条件是 -如果我们有[l,r]段的答案,我们可以很容易地得到[l.r+1],[l+1,r],[l,r-1]段的答案

如何证明sqrt(Q)*k时间复杂度。

-首先,假设您可以在O(1)中获得这些段的答案([l.r+1],[l+1,r],[l,r-1]),给出该段的答案[l,r]
-由于查询的每个bucket,左边的顺序是任意的,右边的顺序是递增的,因此对于bucket中的每个查询,我们可以使用O(bucket length)迭代形式是移动左指针,但对于右指针只能增加,因此对于整个bucket,我们只能将右指针移动到数组的末尾一次。

如果他将数据拆分为sqrt(k)个bucket,那么应该有N个/sqrt(k)个bucket??但事实并非如此。另外,我们如何处理这个离线算法中的修改查询?PS:原始站点是<>但它是俄文的(谷歌chrome翻译效果很好)