binary搜索k

问题描述 投票:0回答:2

while(left<=right)
there是完整的代码:

public static int searchFirstOfK(List<Integer> A, int k) { int left = 0, right = A.size() - 1, result = -1; // A.subList(left, right + 1) is the candidate set. while (left <= right) { int mid = left + ((right - left) / 2); if (A.get(mid) > k) { right = mid - 1; } else if (A.get(mid) == k) { result = mid; // Nothing to the right of mid can be the first occurrence of k. right = mid - 1; } else { // A.get(mid) < k left = mid + 1; } } return result; }
我如何知道何时使用左侧的距离小于或等于右,或者仅使用左图小于右。 

在此答案上构建另一个二进制搜索问题:

如何简化C?

java algorithm binary-search
2个回答
2
投票
如果您想找到第一次出现的位置,那么找到匹配元素时就无法停止。 您的搜索应该看起来像这样(当然,假设列表已排序):

int findFirst(List<Integer> list, int valueToFind) { int pos=0; int limit=list.size(); while(pos<limit) { int testpos = pos+((limit-pos)>>1); if (list.get(testpos)<valueToFind) pos=testpos+1; else limit=testpos; } if (pos < list.size() && list.get(pos)==valueToFind) return pos; else return -1; }

注意,我们只需要在迭代中进行一次比较。 二进制搜索找到了所有前面元素小于

valueToFind

的独特位置,并且所有以下所有元素都更大或相等。
链接的答案突出了以这种方式编写二进制搜索的几个优点。
    

简单地提出了编号

考虑数组仅具有一个元素的情况,即,要搜索的元素也是{0}

在这种情况下,

0

,但是如果您的病情为

2
投票
,则

while(left<right)

将返回。

此答案是在已发布的代码的上下文中。如果我们谈论的是替代方案,以便我们可以使用
searchFirstOfK
,那么马特·蒂默尔人的答案是正确的,并且是一种更好的方法。

贝洛(Below)是马特(OP-称为普通二进制)和Matt Timmermans(我们称其为优化的二进制)方法的thecomparison

,用于包含0到5000000之间的值的列表:


    

这个是一个非常有趣的问题。事情是有一种方法可以始终正确地进行二进制搜索。事情是确定正确的范围并避免单个元素卡住行为。
-1

仅要记住的关键是,您总是将左派作为最小的不满意元素,并且是最大的条件满足元素。一旦您通过此方法理解范围划分,您将永远不会在二进制搜索中失败。

上面的初始化将为您提供满足最大的条件。 

通过更改初始化,您可以获得各种元素(例如满足元素的小条件)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.