binary-search - 离散二分搜索主要理论
问题描述
我读过这个:https ://www.topcoder.com/community/competitive-programming/tutorials/binary-search 。有些部分看不懂==>
我们可以称之为主定理的内容是,当且仅当对于 S 中的所有 x,p(x) 意味着所有 y > x 的 p(y) 时,才可以使用二分搜索。这个属性是我们在丢弃搜索空间的后半部分时使用的。相当于说 ¬p(x) 意味着所有 y < x 的 ¬p(y) (符号 ¬ 表示逻辑非运算符),这是我们在丢弃前半部分搜索空间时使用的。
但是我认为当我们想在数组中找到一个元素(仅检查是否相等)时,这个条件不成立,并且这个条件只在我们试图找到不等式时成立,例如当我们搜索一个更大或等于的元素时到我们的目标值。
示例:我们在这个数组中找到 5。
索引=0 1 2 3 4 5 6 7 8 1 3 4 4 5 6 7 8 9
我们定义 p(x)=>
if(a[x]==5) return true else return false
第一步=>中间索引 = 8+1/2 = 9/2 = 4 ==> a[4]=5 并且 p(x) 对此是正确的,从主要理论来看,结果是 p(x+ 1) ........ p(n) 是真的,但不是。
那么问题是什么?
解决方案
我们可以在寻找精确值时使用该定理,因为我们
只在丢弃一半时使用它。如果我们正在寻找说 5,
并且我们在中间找到说 6,我们可以丢弃上半部分,
因为我们现在知道(由于定理)那里的所有项目都 > 5
还要注意,如果我们有一个排序序列,并且想要找到任何
满足不等式的元素,那么查看末尾元素就足够了。
推荐阅读
- tensorflow - 如何在 conda 环境中安装旧版本的 CUDA?
- reactjs - 最佳实践:只为渲染准备一次道具
- reactjs - SASS 7-1 架构模式中的字体系列
- linux - 使用 Linux 实用程序(例如 grep)在文件 0x1F(单元分隔符)中搜索
- c++ - 外部类声明使用 C++ 标准是否符合?
- typescript - 接受字符串化和普通数组
- spring-boot - 在 JPA 存储库中按属性名称查找仅返回第一行的值
- arrays - 我将如何表达 Last Row + 10?
- python - 如何在随机数字段中找到所有素数?
- postgresql - 我无法从 Intellij 连接到 Docker 上的 postgres 数据库