获取非常大的字符串中所有出现的子字符串

时间:2019-06-04 14:49:32

标签: javascript

类似indexOf的东西,除了我需要找到所有索引。如果存在.indexOf和,lastIndexOf,是否不应该有一个函数来获取所有出现的索引?我找不到。

请注意,该字符串非常大,大约1MB,因此我需要最快的解决方案。

为澄清起见,我需要获取字符串中子字符串出现的所有位置。

例如

var str = "foo bar foo bar"; //the real string is 1MB
var indexes = str.indexOfAll('foo'); //the function I need
console.log(indexes); //should print [0,8];

想到的一件事是在循环循环中使用indexOf,找到第一个单词,在索引处剪切字符串,然后再次使用indexOf,依此类推,直到找不到任何内容。我不确定性能(剪切和重新创建大字符串)。

1 个答案:

答案 0 :(得分:2)

简便的解决方案:

import com.twitter.algebird.HyperLogLogMonoid
import com.twitter.algebird.HyperLogLog.int2Bytes

object AlgebirdHLLApp {
  def main(args: Array[String]): Unit = {
    println("This is the Spark test of the Algebird HyperLogLog application")

    val hll = new HyperLogLogMonoid(4)
    val data = List(1, 1, 2, 2, 3, 3, 4, 4, 5, 5)
    val seqHll = data.map { hll.create(_) }
    val sumHll = hll.sum(seqHll)
    val approxSizeOf = hll.sizeOf(sumHll)
    val actualSize = data.toSet.size
    val estimate = approxSizeOf.estimate

    println("Actual size: " + actualSize)
    println("Estimate size: " + estimate)
  }
}

如果您需要高性能的产品,可以查看特定的文本搜索/索引算法,例如Aho–Corasick algorithmBoyer–Moore string-search algorithm

是否真的取决于您的用例以及您搜索的文本是更改的还是静态的,并且可以事先进行索引以实现最佳性能。