从数组中查找你须要的数据,是一个很常见的需求,那么当你查找所需数据时,用什么方法查找速度最快?javascript
本文将经过图文形式,详细讲解线性查找与二分查找,并用JavaScript将其实现,欢迎各位感兴趣的前端开发者阅读本文。前端
线性查找是一种在数组中查找数据的算法,从数组的头部开始按顺序往下查找即为线性查找。java
如图所示,咱们查找数字6在数组中的位置算法
线性查找须要从头开始不断地按顺序检查数据,所以在数据量大且目标数据靠后,或者目标数据不存在时,比较的次数就会更多,也更为好使。若数据量为n,线性查找的时间复杂便为O(n)。数组
正如图解示例所述,咱们想要查找某个值在数组中的位置,须要遍历这个数组,判断当前遍历到的值是否与目标值相等。函数
接下来,咱们将上述实现思路转化为代码性能
/** * 线性查找函数 * @param arr 须要进行查找的数组 * @param target 须要查找的数据 * @returns {number} 返回值 */
const linearSearch = function (arr,target) {
// 目标元素位置
let position = -1;
for (let i = 0; i < arr.length; i++){
// 若是当前遍历到的值与目标值相等则返回目标元素的位置
if(arr[i] === target){
position = i;
return position;
}
}
return position;
}
复制代码
接下来,咱们测试下刚才编写的线性查找函数测试
const dataArr = [3,9,8,2,1,4,6,5,7];
const position = linearSearch(dataArr,6);
if(position !== -1){
console.log(`目标元素在数组中的位置:${position}`);
}else{
console.log("目标元素不在数组中");
}
复制代码
二分查找也是一种在数组中查找数据的算法,它只能查找已经排序好的数据。ui
二分查找经过比较数组中间的数据与目标数据的大小,能够得知目标数据是在数组的左边仍是右边。spa
所以,比较一次就能够把查找范围缩小一半。重复执行该操做接能够找到目标数据,或者得出目标数据不存在的结论。
如图所示,咱们查找数字6在数组中的位置
正如图解示例所述,二分查找只能查找已经排序好的数据,每一次查找均可以将查找范围减半,查找范围内只剩一个数据时查找结束。
咱们将上述思路转化为代码
/** * 二分查找 * @param arr 查找的数组 * @param target 查找的数据 * @param start 数组的开始位置 * @param end 数组的末尾位置 * @returns {number} */
const binarySearch = function (arr,target,start,end) {
let targetPosition = -1;
// 计算中间值
const median = Math.floor((start + end) / 2);
// 判断中间值与目标值是否相等
if(arr[median] === target){
targetPosition = median;
return targetPosition;
}
// 未找到
if(start >= end){
return targetPosition;
}
// 判断中间值是否大于目标值
if(arr[median] > target){
// 递归中间值左侧的数组
return binarySearch(arr,target,start,median - 1)
}else{
// 递归中间值右侧的数组
return binarySearch(arr,target, median + 1, end);
}
};
复制代码
接下来,咱们来测试下刚才编写的二分查找函数
const dataArr = [1,2,3,4,5,6,7,8,9];
const position = binarySearch(dataArr,6,0,dataArr.length - 1);
if(position !== -1){
console.log(`目标元素在数组中的位置:${position}`)
}else{
console.log("目标元素不在数组中");
}
复制代码
线性查找能够从乱序数组中找数据,而二分查找只能从已排序好的数组中查找数据。
二分查找利用已排序好的数组,每一次查找均可以将查找范围减半。若是将数量为n的数组,将其长度减半log2n次后,其中便只剩一个数据了,所以它的时间复杂度为O(logn)
线性查找须要从头开始不断地按顺序检查数据,所以在数量大且目标数据靠后,或者目标数据不存在时,比较的次数就会更多,也更为耗时。若是数组的数据量为n,线性查找的时间复杂度便为O(n)
从时间复杂度上分析,二分查找相比线性查找速度获得了指数倍的提高。
线性查找,数组中的数据能够是无序的,添加数据时无需顾虑位置,直接将其插入到数组的末尾便可,不须要耗费时间。
二分查找,数组中的数据必须是有序的,添加数据时就须要考虑位置,须要消耗必定的时间。
综合上述,若是你查找数据比较频繁的话二分查找更适合你,不然线性查找更适合你。