Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 为多个查询计算字符串中字符的出现次数?_String_Algorithm_Data Structures_Range Query_String Algorithm - Fatal编程技术网

String 为多个查询计算字符串中字符的出现次数?

String 为多个查询计算字符串中字符的出现次数?,string,algorithm,data-structures,range-query,string-algorithm,String,Algorithm,Data Structures,Range Query,String Algorithm,我想为n个查询查找字符串中出现的字符: 例如,字符串是:“我爱数学” 任务是找出以下情况的发生: 范围内的“i”: 1-4(a substring starting from 1st character and ending at 4th) 2-5 3-10 范围内的“\”: 1-10 3-9 产出将是: 1 0 0

我想为n个查询查找字符串中出现的字符: 例如,字符串是:“我爱数学” 任务是找出以下情况的发生:

范围内的“i”:

          1-4(a substring starting from 1st character and ending at 4th)
          2-5
          3-10
范围内的“\”:

           1-10
           3-9
产出将是:

           1
           0
           0
           2
           1

类似的问题是查找字符串中某个字符的出现次数,但其复杂性为O(N),但在这种情况下,如果我这样做,会导致非常高的复杂性,是否有一种数据结构可以用来解决此问题?

我们将保留每个字符在每个位置的出现次数,例如字符串abacaba

    a b a c a b a
|  |1|2|3|4|5|6|7
a | 1 1 2 2 3 3 4
b | 0 1 1 1 1 2 2
c | 0 0 0 1 1 1 1
现在,如果我们想回答一个问题,我们可以执行以下操作

范围为3-5的字母“a”


我们在位置5减去位置3之前的出现次数,即[5]-a[3-1]=3-1=2字母“a”在3到5之间出现2次,我们将保持每个字符在每个位置的出现次数,例如字符串abacaba

    a b a c a b a
|  |1|2|3|4|5|6|7
a | 1 1 2 2 3 3 4
b | 0 1 1 1 1 2 2
c | 0 0 0 1 1 1 1
现在,如果我们想回答一个问题,我们可以执行以下操作

范围为3-5的字母“a”


我们在位置5减去位置3之前的出现次数,即[5]-a[3-1]=3-1=2字母“a”在范围3到5中出现了2次,搜索每个查询的范围的时间复杂度为O(n*q)

n:字符串的长度

问:查询数目

但是有一个更好的方法 你可以用

树构造的时间复杂度为O(N),每个查询的时间复杂度为O(log(N))


因此,对于q查询,时间复杂度将是O(q*log(n))

搜索每个查询的范围的时间复杂度将是O(n*q)

n:字符串的长度

问:查询数目

但是有一个更好的方法 你可以用

树构造的时间复杂度为O(N),每个查询的时间复杂度为O(log(N))

因此,对于q查询,时间复杂度将是O(q*log(n))

复杂度将是
O(q*n)
,其中
q
是查询的数量,
n
是字符串的长度(如果您使用简单的实现)。或者,您可以使用树将复杂度降低到
O(qlogn)
,空间复杂度为
O(n)
。或者可以使用一个表,将每个字符映射到某个字符所在的索引列表。复杂性将保持不变。复杂性将是
O(q*n)
,其中
q
是查询的数量,
n
是字符串的长度(如果您选择简单的实现)。或者,您可以使用树将复杂度降低到
O(qlogn)
,空间复杂度为
O(n)
。或者可以使用一个表,将每个字符映射到某个字符所在的索引列表。复杂性将保持不变。