Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Java 批处理字符串包含操作优化?_Java_String_Algorithm_Search_Batch File - Fatal编程技术网

Java 批处理字符串包含操作优化?

Java 批处理字符串包含操作优化?,java,string,algorithm,search,batch-file,Java,String,Algorithm,Search,Batch File,我有两套绳子,A和B。 我想解决的问题是计算集合B中有多少字符串包含集合A中的任何单个字符串。例如: A:“A”,“b” B:“abc”、“dsf”、“aqc”、“yyy”、“xxx”、“bbb” 结果是3(“abc”、“aqc”、“bbb”) 不幸的是,在我的例子中,集合A和集合B非常大,比如说,集合A有数百万个字符串,集合B有数十亿个字符串。所以我必须用Java语言进行数百万个、数十亿个“indexof”操作。算法复杂度为O(m*n) 有什么优化算法可以让它更快吗?可能数据库搜索和咖啡休息是

我有两套绳子,A和B。 我想解决的问题是计算集合B中有多少字符串包含集合A中的任何单个字符串。例如:
A:“A”,“b”
B:“abc”、“dsf”、“aqc”、“yyy”、“xxx”、“bbb”
结果是3(“abc”、“aqc”、“bbb”)

不幸的是,在我的例子中,集合A和集合B非常大,比如说,集合A有数百万个字符串,集合B有数十亿个字符串。所以我必须用Java语言进行数百万个、数十亿个“indexof”操作。算法复杂度为O(m*n)


有什么优化算法可以让它更快吗?

可能数据库搜索和咖啡休息是常见的做法

但让我们看看

使用字母组:

  • 首先将每个字母映射到一个最常见的素数字母:e2,t3,o5,i7
  • 计算A和B中字符串的所有字母素数的乘积
  • 现在B中的候选者是那些可以被A中的任何元素划分的
  • 这可能会大大减少可能的候选对象的映射
使用搜索模式(A中的术语字母树):

  • 这有点像制作一个正则表达式模式(a | b)”,但随后非常大。此模式可以编译并针对每个单词运行。不确定这是否是一种加速

此外,使用Java 8及其并行流,从A到B以1000块为单位。

注意,即使最好的算法最坏的情况是m*n,这个问题也是可并行的。如果集合
A
总是包含一个字符,这可以在
O(n)
中实现,其中n是集合
B
的大小。否则它就是上面建议的
O(m*n)