Algorithm 字符串上二进制搜索的复杂性
我有一个字符串排序数组:例如:[“bar”、“foo”、“top”、“zebra”],我想搜索数组中是否存在输入字 例如: 现在,二进制搜索将考虑复杂性,即O(logn),其中n是数组的长度。就这么好 但是,在某些时候,我们需要进行字符串比较,这可以在线性时间内完成 现在,输入数组可以包含不同大小的单词。所以当我 am计算最终复杂度最终答案是否为O(m*logn) 其中Algorithm 字符串上二进制搜索的复杂性,algorithm,big-o,time-complexity,complexity-theory,binary-search,Algorithm,Big O,Time Complexity,Complexity Theory,Binary Search,我有一个字符串排序数组:例如:[“bar”、“foo”、“top”、“zebra”],我想搜索数组中是否存在输入字 例如: 现在,二进制搜索将考虑复杂性,即O(logn),其中n是数组的长度。就这么好 但是,在某些时候,我们需要进行字符串比较,这可以在线性时间内完成 现在,输入数组可以包含不同大小的单词。所以当我 am计算最终复杂度最终答案是否为O(m*logn) 其中m是我们要在数组中搜索的单词的大小,在我们的例子中是 “斑马”是我们要搜索的词吗 是的,你的想法和你提出的解决方案都是正确的。在
m
是我们要在数组中搜索的单词的大小,在我们的例子中是
“斑马”是我们要搜索的词吗
是的,你的想法和你提出的解决方案都是正确的。在字符串搜索的整体复杂性中,你也需要考虑最长字符串的长度。 一个简单的字符串比较是一个
O(m)
操作,其中m
是两个字符串中较大者的长度
但是,考虑到数组已排序,我们可以改进很多。正如用户建议的那样
通过跟踪在搜索过程中匹配了多少字符,可以提高复杂度
字符串比较,并存储下限和下限的当前计数
搜索期间的上限。由于数组已排序,我们知道
下一个要测试的中间条目的前缀必须匹配到
两个深度中的最小值,因此我们可以跳过
比较那个前缀。事实上,我们要么一直在进步
或在不匹配的情况下立即停止增量比较,以及
因此,永远不需要继续走老路
因此,如果找到字符,则必须在字符串末尾进行字符总数的比较,否则甚至不能进行太多比较(如果在早期阶段失败)
因此,总体复杂性将是
O(m+logn)
是的,您的想法以及您提出的解决方案都是正确的。在字符串搜索的整体复杂性中,你也需要考虑最长字符串的长度。
一个简单的字符串比较是一个O(m)
操作,其中m
是两个字符串中较大者的长度
但是,考虑到数组已排序,我们可以改进很多。正如用户建议的那样
通过跟踪在搜索过程中匹配了多少字符,可以提高复杂度
字符串比较,并存储下限和下限的当前计数
搜索期间的上限。由于数组已排序,我们知道
下一个要测试的中间条目的前缀必须匹配到
两个深度中的最小值,因此我们可以跳过
比较那个前缀。事实上,我们要么一直在进步
或在不匹配的情况下立即停止增量比较,以及
因此,永远不需要继续走老路
因此,如果找到字符,则必须在字符串末尾进行字符总数的比较,否则甚至不能进行太多比较(如果在早期阶段失败)
因此,在一个简单的实现中,总体复杂性将是
O(m+logn)
,是的,但是如果字符串的长度很长,则可以在比较中跳过以前匹配的前缀。实际上,您只需要在下限和上限上匹配每个字符串两次,从而使搜索成为一个O(logn+m)
操作。@doynax-不,我认为在每个深度,都会比较字符串以检查它们是否匹配。因此,O(logn)必须与O(m)相乘,以便在每个级别进行比较。所以,我认为最坏的情况分析应该是相同的,即O(logn*m)。你还不同意吗?@Am_I_我刚刚编辑了这个问题,m不是数组中最长单词的大小,但m是我们要搜索的单词的大小。让我知道它听起来是否正确?@Am_I_有帮助:诀窍是跟踪字符串比较期间匹配的字符数,并在搜索期间存储下限和上限的当前计数。由于数组已排序,我们知道接下来要测试的中间条目的前缀必须至少匹配两个深度中的最小值,因此我们可以跳过对该前缀的比较。实际上,我们总是在取得进展,或者在不匹配的情况下立即停止增量比较,因此永远不需要继续进行旧的比较。@doynax-哦,我明白了。我自己怎么就不能这么想!谢谢,我把你的观点写进了我的答案中。在一个简单的实现中,是的,但是如果字符串的长度很长,你可以在比较中跳过以前匹配的前缀。实际上,您只需要在下限和上限上匹配每个字符串两次,从而使搜索成为一个O(logn+m)
操作。@doynax-不,我认为在每个深度,都会比较字符串以检查它们是否匹配。因此,O(logn)必须与O(m)相乘,以便在每个级别进行比较。所以,我认为最坏的情况分析应该是相同的,即O(logn*m)。你还不同意吗?@Am_I_我刚刚编辑了这个问题,m不是数组中最长单词的大小,但m是我们要搜索的单词的大小。让我知道它听起来是否正确?@Am_I_有帮助:诀窍是跟踪字符串比较期间匹配的字符数,并在搜索期间存储下限和上限的当前计数。由于数组已排序,我们知道接下来要测试的中间条目的前缀必须至少匹配两个深度中的最小值,因此我们可以跳过对该前缀的比较。实际上,我们总是在取得进展,或者在不匹配的情况下立即停止增量比较,因此永远不需要继续进行旧的比较。@doynax-哦,我明白了。我自己怎么就不能这么想!谢谢,我把你的观点写在我的答案中,写在你的名字后面
search (String[] str, String word) {
// binary search implemented + string comaparison.
}