algorithm - 修改二分搜索以获得更好的性能

标签 algorithm binary-search

Problem

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

我不确定这个解决方案是否正确,因为我不知道解决此类问题的一般方法。我希望能找到所有三个部分的解决方案。如果我没有迷失的话,我肯定会尝试更多的问题。在发布之前我已经尝试提前解决这个问题,但我只是不知道该怎么做。

最佳答案

如果您可以找到必须执行二分搜索的数字集合,则只需记录新集合中的数字计数.这是因为当你本地化了你的目标数字后,你只需要对它们进行二分查找就可以找到x

给定总共 n 个数字来执行二分搜索,它们是集合 {1, ..., n}。


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

由于 x 是奇数,因此您只能在集合的奇数中找到它。因此,与 n 不同,您有 n/2 大小的集合来查找目标数字。如 n = 2k,新集合的大小(我们称之为n')= n/2。对这组数字进行二分搜索的最坏情况运行时间将是 Log(n' 中的数字),即 Log (n/2) 或

(Log n) - 1 = k - 1


x为完全平方数且n可表示为(2k)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(2k)

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

此运行时间复杂度又是 Log(n' 中的数字)= Log ((Log n) + 1)。如果你纵容日志中的1,那就是

Log(Log(n)) = k

关于algorithm - 修改二分搜索以获得更好的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829752/

相关文章:

算法:对线条/其他几何形状的缓冲效果

c++ - 为什么这个实现的二分搜索比 std::binary_search() 慢得多?

algorithm - 在二进制搜索实现中出现编译错误

c++ - 没有 if-else 语句的递归二分查找 C++

java - 如果所查找的值不存在,递归二分查找何时终止

algorithm - Shell排序的时间复杂度?

algorithm - 计算数字出现次数

c++ - 二进制搜索: how to determine half of the array

c++ - ACM ICPC - 数论

python - 无法实现计数排序算法