博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法-学习笔记(12)
阅读量:6778 次
发布时间:2019-06-26

本文共 1873 字,大约阅读时间需要 6 分钟。

二分查找变形

代码1:

function binarySearch(array, value) {    var low = 0;    var high = array.length-1;    while (low <= high) {        let mid = low+((high-low)>>1);        if (array[mid] < value) {            low = mid + 1;        } else if (array[mid] > value) {            high = mid - 1;        } else {            if (mid==0||array[mid-1]!=value) return mid;            high = mid - 1;        }    }        return -1;}复制代码

前提:array是从小到大排序的 第一个等于给定值,在前面,因此high = mid -1,出口是mid==0||array[mid-1]!=value找到了第一个。

同理最后一个mid==n-1||array[mid+1]!=value, low = mid + 1;

代码3:

function binarySearch(array, value) {    var low = 0;    var high = array.length-1;    while (low <= high) {        let mid = low+((high-low)>>1);        if (array[mid] < value) {            low = mid + 1;        } else if (array[mid] >= value) {            if (mid==0||array[mid-1]

同理第4个问题:

if (array[mid] <= value) {    if (mid == array.length-1 || array[mid+1] > value) return mid;    low = mid + 1;}复制代码

总结

综上,以上二分查找变形可以解决查找数据区间,或近似值的各种问题。

如:如何快速定位出一个IP地址的归属地?(IP地址可转化为32位整数,找到最后一个小于等于指定IP的区间)

在循环有序数组中查找给定值。 如 5、7、9、10、23、1、3、4 观察该类数组的结构,可以分为两部分1,2。都是有序数组,1整体大于2.

利用二分查找思想,根据中间值判断目标值范围,再不断缩小。

function binarySearch(array, value) {    var low = 0;    var high = array.length-1;    while (low <= high) {        let mid = low+((high-low)>>1);        if (array[mid] == value) return mid;        if (array[mid] >= array[low]) { // 中点在左半部分            if (array[mid] > value && array[low] <= value) {                high = mid - 1;            } else {                low = mid + 1;            }                    } else if (array[mid] <= array[high]) { // 中点在右半部分            if (array[mid] < value && value <= array[high]) {                low =  mid + 1;            } else {                high = mid - 1;            }        }    }        return -1;    }复制代码

转载于:https://juejin.im/post/5bee3fd7f265da615d7239ba

你可能感兴趣的文章
DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS
查看>>
Apache Commons
查看>>
Hibernate---->生命周期
查看>>
WinInet Tutorial for Beginners and WinINet vs WinHTTP
查看>>
统计程序运行时间的C++源代码
查看>>
生活常用电器的功率测量
查看>>
coreos中更改docker镜像地址
查看>>
js控制只能输入数字和小数点
查看>>
Java泛型的好处
查看>>
Linux概述
查看>>
linux 命令:chmod权限设置命令
查看>>
四种MySQL存储引擎
查看>>
SpringCloud负载均衡笔记
查看>>
官方下载:Windows8开发者预览版
查看>>
海量数据库查询
查看>>
记住密码"功能的正确设计
查看>>
SQL SERVER 参数化查询后不走筛选索引
查看>>
平面设计技巧(翻译教程)
查看>>
专访微软战略安全官裔云天:做好网站安全的纵深防御
查看>>
分享40套非常精美的免费 PSD 网页图标素材
查看>>