java - 使用线程计算子字符串的所有出现次数
问题描述
假设我有 t 个线程,计算字符串 S 中子字符串 T 的所有非重叠出现的最佳解决方案是什么?
这是一段正常计数的代码,但我不确定如何同时实现它。如果 t 小于子串的长度会发生什么?
public class Substrings {
public int countOccurrences(String S, String T) {
int count = 0, offset = 0, index;
while((index = S.indexOf(T, offset)) != -1) {
offset = index + T.length();
count++;
}
return count;
}
}
解决方案
我不确定你为什么要这样做,因为这样的操作非常快,除非你有很多巨大的字符串。最佳解决方案不是我想考虑的,但是有一种简单的方法可以做到这一点,它的速度大约是最佳解决方案的两倍。将字符串拆分为多个部分,并使用线程在每个部分上运行 countOccurrences。将您找到的所有索引放入一个集合中。然后将这些部分向前滑动一段长度的一半,然后再做一次。第二部分将查找跨节的任何事件。当然,您可以通过两侧字符串的长度来限制第二次搜索,但这会使代码复杂化。作为一个练习,也许你可以用 Boyer-Moore 来做这个。
推荐阅读
- django - 没有使用 Django import export 导入除 id 字段之外的字段
- sql - 如何从事务块中获取选择结果?
- apache - 启动乘客时缺少模块错误
- typescript - 对象属性的类型安全映射
- django - 更新/合并数据,而不是用 Django Rest Framework 中的 PUT 方法替换它
- excel - 继承时 VBA 类型不匹配(错误 13),用户来自
- mongodb - 如何在整个集合中进行仅总和查询?
- html - 如何使用 jinja/html 处理引号中的引号?
- c++ - 创建一个可以在类型和变量上调用的类型特征
- asp.net - Web API 项目中的 JWT 令牌