改写二分搜索算法

来源:互联网 发布:网络意识形态实施方案 编辑:程序博客网 时间:2024/05/16 15:17

1. 实践题目

7-2 改写二分搜索算法


2. 问题描述

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值


3. 算法描述(不能粘贴程序)

在基本的二分查找里面做改进,满足题目要求。一开始我是对越底界,越高界,直接找得到,以及在两者之间四个情况分开来写,但是觉得这种方法不好。后来改进的话就直接对low和high两个指针进行操作。在二分循环while(low <= high ),当low==high 的时候,此时为直接找得到。当low>=high时,此时就是剩下来的三种情况(越底界,越高界,在两者之间):

当越底界时,low>high,此时不满足循环条件,low=-1,high=0,直接输出

当越高界时,low>high,此时不满足循环条件,low=arr.length+1,high = arr.length,直接输出


4. 算法时间及空间复杂度分析(要有分析过程)

二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。时间复杂度就是while循环的次数。所以时间复杂度可以表示O()=O(logn)。

空间复杂度O(1)。中间借用辅助空间来保存数据,表示所需空间为常量,并且与n无关。


5. 程序运行截图





6.心得体会(对本次实践收获及疑惑进行总结)

收获:觉得二分查找可以充分利用好头指针尾指针这两个要素,可以使代码变得更加精炼。不明白的点可以画图自己推下。此次用的是迭代的二分法,找相邻两个点的这个修改也可以重新调用一次二分法,充分利用好迭代的本质。


源代码地址:https://github.com/TFknight/PythonStudy/blob/master/algorithm/erfen.java