Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Algorithm 如何找到排序列表子集的边界?_Algorithm_Search - Fatal编程技术网

Algorithm 如何找到排序列表子集的边界?

Algorithm 如何找到排序列表子集的边界?,algorithm,search,Algorithm,Search,我面临以下困境:我有一个字符串列表,我想找到以某个前缀开头的字符串集。列表已排序,因此最简单的解决方案是: 对集合的前缀执行二进制搜索,当找到以前缀开头的元素时,线性向上遍历,直到到达子集的顶部 然而,这是以线性时间运行的,我想知道是否有人能提出一种更有效的方法来实现这一点 一旦您在集合中找到一个元素,只需保持二进制搜索,直到找到端点。您可以对顶部元素执行类似的二进制搜索,但您应该查找的字符串是以前缀严格大于所述前缀开头的第一个字符串。这也需要O(lgn)时间。对顶部进行二进制搜索,对底部进行二

我面临以下困境:我有一个字符串列表,我想找到以某个前缀开头的字符串集。列表已排序,因此最简单的解决方案是:

对集合的前缀执行二进制搜索,当找到以前缀开头的元素时,线性向上遍历,直到到达子集的顶部


然而,这是以线性时间运行的,我想知道是否有人能提出一种更有效的方法来实现这一点

一旦您在集合中找到一个元素,只需保持二进制搜索,直到找到端点。

您可以对顶部元素执行类似的二进制搜索,但您应该查找的字符串是以前缀严格大于所述前缀开头的第一个字符串。这也需要O(lgn)时间。

对顶部进行二进制搜索,对底部进行二进制搜索。一旦你找到第一个命中,你知道顶部在该点之上,底部在该点之下(或者在这两种情况下都在该点)。有了顶部和底部,就有了解决方案。

只需对顶部进行二进制搜索。字符串中有哪些字符?想知道是否可以对0和Z进行二进制搜索以获得边界。你不知道它们是什么,但这就是为什么要进行搜索。从整个列表的顶部和底部开始搜索,然后将其一分为二。典型的二进制搜索只有一个结果,第一个或最后一个元素。在搜索中,当您点击第一个元素时,您需要从该点执行二进制搜索,使用下半部分查找您需要的最后一个元素,上半部分查找第一个元素。这将阻止对整个事件进行2次二进制搜索,因为查找第一个元素可能需要一些时间。我不同意。。。你刚刚告诉他找到第一个元素的最快方法和找到最后一个元素的最慢方法。一旦你发现只有一半的工作完成了。。。你需要找到最后一个。。。可能在2公里之外,也可能在500公里之外。完成这项工作需要3次二进制搜索。你确定吗?您可以使用相同的技术查找带有前缀的序列中的第一个元素,也可以使用二进制搜索轻松地找到最后一个元素。通过两次二进制搜索(时间O(lgn))可以找到范围的边界。朴素的线性搜索需要时间O(lgn+k),因为你要做一个二进制搜索加上一个线性搜索。而且,我不知道你所说的“找到最后一个的最慢方法”是什么意思;简单的线性搜索需要时间O(n)才能找到最后一个元素,而我的O(lgn)搜索速度是指数级的。