Java最新面试题之二分法查找详解_二分法面试题,java初级开发工程师面试题

最后

金三银四到了,送上一个小福利!

image.png

image.png

专题+大厂.jpg

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

+ [举例加深概念](#_14)
+ - [非递归算法:](#_31)
	- * [C实现写法:](#C_32)
		* [js 实现写法:](#js__83)
	- [递归算法:](#_103)
	- * [C类语言实现](#C_104)
		* [js 语言实现](#js__157)

前言

回顾以往面试中,算法提到最多的就是二分法了,感觉简单,但是突然提到又难以入味,所以本文将整理总结出最简单的理论和程序实践,结合实际面试题来解答!

二分法概念

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。

二分法 查找的思路 如下:
1.首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
2、如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
3. 如果某一步数组为空,则表示找不到目标元素。

二分法查找的时间复杂度O(logn)。

举例加深概念

文字说明一下二分法究竟是怎样的: 给定的数组是有序的,给定一个key值,每次查找最中间的值,如果相等,就返回对应的下标;如果key 大于 最中间的值,则在数组的 右半边 继续查找;如果 小于,则在数组的 左半边 查找。那么最终存在两种结果:一种是找到了并返回对应的下标,第二种就是没有找到,返回-1。

举例说明:

存在一个数组arr[10],假设arr[10]={3,6,7,9,15,20,26,33,56,63},定义两个边界的下标low和high,以及中间下标mid, 记住,数组前提一定是排序好了的,排序方法可见我后面博文会涉及到

int low=0;
int high=10-1;
int mid=(low+high)/2;

在对每一步进行比较的时候,low<=high,如果要找key为56的值对应的下标,那么第一次我们先找到中间下标mid=4。因为arr[4]=15,比当前的key值要小,则按照要求在数组的右半部分查找,让low=mid+1,high值不变。接下来,我们继续找到右半部分的中间下标 mid = (5+9)/2=7arr[7]=33,比当前的key值还小,那么继续向右半边查找,且 low=mid+1,high值继续不变。接下来,找到中间下标mid=(8+9)/2=8。这个时候arr[8]key56,OK,找到目标值,停止查找,返回下标mid。

通过上面例子可以看出,在进行指定key查找的次数总共3次,通过根据中间值和目标key进行比较来判定目标key的位置。接下来给出相关处理代码:

非递归算法:
C实现写法:
int binarySearch(int arr[], int arrSize, int key)
{
    int low=0; //数组最小索引值

    int high=arrSize -1; //数组最大索引值
    while(low<=high){
        int mid=  floor((low+high)/2);
        if(key==arr[mid]){
            return mid;
        }else if(key>arr[mid]){
            low=mid+1;
        }else{
            high=mid-1;
        }
    }
    return -1; //low>high的情况,这种情况下key的值大于arr中最大的元素值或者key的值小于arr中最小的元素值
}


Main调用如下

int arr[10]={3,6,7,9,15,20,26,33,56,63};
for(auto arrayValue:arr){
    qInfo()<<"Array = "<<arrayValue;
}
QTime time;
time.start();
int key = binarySearch(arr, 10, 56);
qInfo()<<"find key = "<<key;
qInfo()<<"花费时间 :"<<time.elapsed()/1000.0<<"秒";

结果测试:

Array =  3
Array =  6
Array =  7
Array =  9
Array =  15
Array =  20
Array =  26
Array =  33
Array =  56
Array =  63
find key =  8
花费时间 : 0 秒

js 实现写法:
function binarySearch(arr,key){
	var low=0; //数组最小索引值
	var high=arr.length-1; //数组最大索引值
	while(low<=high){
		var mid=Math.floor((low+high)/2);
		if(key==arr[mid]){
			return mid;
		}else if(key>arr[mid]){
			low=mid+1;
		}else{
			high=mid-1;
		}
	}
	return -1; //low>high的情况,这种情况下key的值大于arr中最大的元素值或者key的值小于arr中最小的元素值
}

递归算法:
C类语言实现

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 24
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值