修改二进制搜索以获得更好的性能

时间:2015-09-28 18:44:10

标签: algorithm binary-search

Problem

尝试的解决方案:(1)假设x是奇数。我们将搜索集减少了一半。在最坏的情况下,复杂度现在是log(n / 2)= logn - 1。现在我们只是对奇数进行二分搜索。

我不确定这个解决方案是否正确,因为我不知道解决此类问题的一般方法。我很感激所有3个部分的解决方案。如果我没有迷路的话,我肯定会尝试更多的问题。我在发布之前已经尝试过很好地处理这个问题我只是不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

所有三种情况的答案都相似。不是通过二分法尝试整数候选x=i,而是尝试奇数(x=2i+1),方(i^2)或幂(2^i)的候选者。在所有这三种情况下,都可以尝试k个不同的值,最差时需要进行Lg(k)次比较。

唯一的区别是当您用n

表示这些数字时
  1. Lg(k) = Lg(n/2) = Lg(n)-1
  2. Lg(k) = Lg(√n) = Lg(n)/2
  3. Lg(k) = Lg(Lg(n))

答案 1 :(得分:1)

如果您可以找到必须执行二进制搜索的数字的设置,则只需要记录新数字中的数字数字< / strong>。那是因为在您对目标数字进行了本地化后,您只需对它们执行二进制搜索即可找到 x

您将获得总共n个数字来执行二进制搜索,它们是 {1,...,n}的集合。

x 为奇数且 n 可表示为 2 k

由于x是奇数,你只能在集合的奇数中找到它。因此,与 n 相反,您需要设置 n / 2 大小以查找目标编号。正如 n = 2 k ,新集合的大小(我们称之为 n'),= = em> n / 2 。对这组数字进行二进制搜索的最坏情况运行时是Log( n'中的数字),即Log( n / 2)或

  

(记录n) - 1 = k - 1

x 是一个完美的正方形而 n 可以表示为(2 k 2

在这种情况下,您的新目标数字组将减少为仅包含完美的方形数字。这个新集合将包含数字{1,4,9,...,n}。此集合中的数字计数等于√n。想一想,当它只有1时,计数为√1= 1.当它有1和4时,其中的数字计数为√4= 2.

因此,根据新集 n' = √n的大小,对这组新数字进行二进制搜索的最坏情况运行时间再次= Log ( n'中的数字)= Log(√n)等于

  

(Log n)/ 2 = k

x 为2的幂时, n 可表示为 2 (2 k

在这里,设置为运行二进制搜索的目标被简化为仅为2的幂的数字。简单明了,该集合将包含{1,2,4,8 ... n}等数字。此集合中的数字计数等于(Log n)+ 1 。同样,你可以看到当集合只有1时,计数是(Log 1(= 0)+ 1)= 1.当set有1和2时,计数是(Log 2(= 1)+ 1)= 2等等。

此运行时复杂性又是Log( n'中的数字)= Log((Log n)+ 1)。如果你在日志中宽恕1,那就是

  

日志(Log(n)) = k