📜  莫的算法的工作和需要

📅  最后修改于: 2021-05-08 18:45:53             🧑  作者: Mango

莫氏算法是一种通用算法。它可以用于许多需要在静态数组中处理范围查询的问题,即,数组值在查询之间不会更改。在每个查询中,对于给定范围[a,b],其思想是基于ab位置之间的数组元素来计算值。由于数组是静态的,因此查询可以按任何顺序进行处理,并且Mo’s Algorithm以特殊顺序处理查询,从而确保算法有效地工作。

它保持阵列的有效范围,并且每时每刻都知道有关该有效范围的查询结果。该算法一一处理查询,并始终通过插入和删除元素来移动活动范围的端点。

时间复杂度: O(N√N* f(N))数组有N的地方 元素,有N 查询,元素的每次插入和删除都需要O(f(N))时间。

Mo算法的诀窍在于处理查询的顺序:

  • 阵列被划分成k个块= O(√N)元件和一个查询[A 1,B 1]的查询之前被处理[A 2,B 2]如果任一[1 / K] <[2- / k ]或[a1 / k] = [a2 / k]b 1 2 是真的。
  • 因此,其左端点位于某个块中的所有查询都将根据其右端点依次进行处理。
  • 使用此顺序,该算法仅执行O(N√N)运算,因为左端点移动O(N)乘以O(√N)步,而右端点移动O(√N)乘以O(N)步。 。
  • 因此,两个端点在算法期间总共移动了O(N√N)个步骤。

示例:考虑一个问题:给定一组查询,每个查询对应于数组中的一个范围,而任务是为每个查询计算该范围中不同元素的数量。在Mo的算法中,查询总是以相同的方式排序,但这取决于如何保持查询答案的问题。

  • 在这个问题上,想法是维护一个数组 数数[] 其中count [x]表示元素x在有效范围内出现的次数。
  • 从一个查询移到另一个查询时,活动范围会更改。例如,如果当前的范围是{4,2,5,4,2,4,3,3,4}和下一范围是{4,2,5,4,2,4,3,3,4 }。 (范围标记为粗体)
  • 将分三个步骤:左端点向右移动一个步骤,右端点向右移动两个步骤。
  • 每一步之后,数组 数数[] 需要更新。
  • 在添加元素x之后,将count [x]的值增加1 ,如果之后的count [x] = 1 ,则还将对查询的答案增加1
  • 同样,删除元素后 x ,将count [x]的值减少1 ,如果此后count [x] = 0 ,则将查询的答案也减少1
  • 在此问题中,执行每个步骤所需的时间为O(1) ,因此该算法的总时间复杂度为O(N√N)