Java 批处理字符串包含操作优化?
我有两套绳子,A和B。 我想解决的问题是计算集合B中有多少字符串包含集合A中的任何单个字符串。例如: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:“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 | b)”,但随后非常大。此模式可以编译并针对每个单词运行。不确定这是否是一种加速
此外,使用Java 8及其并行流,从A到B以1000块为单位。注意,即使最好的算法最坏的情况是m*n,这个问题也是可并行的。如果集合
A
总是包含一个字符,这可以在O(n)
中实现,其中n是集合B
的大小。否则它就是上面建议的O(m*n)
。