二分查找以及时间、空间复杂度
package com.wei.demo.Annotation;/*** 二分查找算法Java:循环方法和递归方法* 思想:我们查找的数组范围是low(0)~high(len-1)。每次查找中间的元素,我们猜测的数字是guess=(low+high)/2;* 实际数字为item,如果猜测数字guess小于item,那范围变为:guess+1~high,low=guess+1位置开始;* 如果猜测数字guess大于item,那就范围变为low~guess-1* 数组:必须是有序的* 结果:返回想要数字的位置*/
public class binary_search {public static void main(String[] args) {int[] array = {1, 2, 33, 55, 66, 88, 99, 567, 789, 999,1000,10001,100002};// index(array,item);System.out.println("循环方法猜测数字的位置为:"+index(array,33));System.out.println("递归方法猜测数字的位置为:"+binarySearch(array,0,array.length-1,33));}/*** 循环的方法* @param array* @param key* @return*/public static int index(int array[],int key){int low = 0;int high = array.length - 1;int middle = 0;// int guess = array[middle];//猜测的数字if (key < array[low] || key > array[high] || low >high){return -1;}while (low <=high){ //循环结束的条件是左边等于右边,那就是中间要找的数字middle = (low + high)/2;int guess = array[middle];//猜测的数字if (guess < key){ //如果猜测的数字小于实际数字,low就要从middle+1开始low = middle + 1;}else if (guess > key){//如果猜测的数字大于实际数字,那么high就要从middle-1开始high = middle - 1;}else{return middle;}}return -1;}/****递归的方式*/public static int binarySearch(int[] arrays,int low,int high,int key){if (key < arrays[low] || key > arrays[high] || low >high){return -1;}int middle = (low + high) / 2;if (arrays[middle] > key){return binarySearch(arrays, low, middle - 1, key);}else if (arrays[middle] < key){return binarySearch(arrays, middle + 1, high, key);}else{return middle;}}
}
1.时间复杂度分析:
最坏的情况下两种方式时间复杂度一样:O(log2 N)
最好情况下为O(1)
2.空间复杂度分析:
算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数
循环方式:
由于辅助空间是常数级别的所以:
空间复杂度是O(1);
递归方式:
递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
空间复杂度:O(log2N )
二分查找以及时间、空间复杂度相关推荐
- 递归二分查找时间复杂度、空间复杂度和稳定性
递归 递归条件 自己调用自己 有结束条件 二分查找 二分查找对1~100乱序数字查找 l = list(range(1,101)) def bin_search(data_set,val):low = ...
- 二分查找法的实现和应用汇总
此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...
- 算法(一):二分查找法
算法基础: 一.大O表示法: 指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度): O(1)表示常数阶时间复杂度 O(log n),也叫对数时间复杂 ...
- 顺序查找与二分查找时间复杂度的比较
注意要点:通过System.currentTimeMills();来获取当前时间,来计算该算法运行运算时间 顺序查找的时间复杂度为O(n) 二分查找的时间复杂度为O(log(n)) 但两 ...
- 常用的十种算法:二分查找,分治,动态规划,KMP
常用的十种算法 一.二分查找算法(非递归) 1.1 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行 ...
- 二分查找算法(非递归)
1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
- 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。
十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
最新文章
- PHP守护进程常用方法
- bash、dash(/bin/bash和/bin/sh)
- Input类,Vector3实例
- 对测试人员或开发人员来说相互沟通有多重要?
- PerfDog-移动端性能测试-基本使用
- java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
- 继小米之后,360 也官宣造车!互联网企业造车到底哪家强?
- 一种多功能语音识别技术和音乐播放器相结合的方法
- 五一快乐假期每天都在上课qaq
- javascript异步编程之回调函数
- 网络抓取ts文件转mp4_TS格式的视频文件怎么转换成mp4文件。
- LUAT游戏第一弹---贪吃蛇
- tensorflow常用数据函数总结(tf.tile()、tf.expand_dims())
- Windows下vc开发chrome浏览器工程的一点粗浅理解和封装
- 解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题
- 自然语言处理(NLP)—分词-—word2vec
- html+css响应式旅游主题网站模板,旅游网站,企业文化新闻类网站,简单web假期课程作业
- 基于JSP仓储物资管理系统
- Linux终端自定义命令(超实用技巧)
- SSM+美食论坛系统 毕业设计-附源码191023