web的查找算法
顺序查找
数据的存储方式是顺序存储,查找时从第一个开始往后查找。
说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。
顺序查找的时间复杂度为O(n)。
/**
*
* @param {被查找数组} arr
* @param {查找的关键值} value
*/
function SequenceSearch(arr, value){
for(let i = 0; i < arr.length; i++){
if (arr[i] == value){
return i;
}
}
return - 1;
}
二分查找
二分查找 也为折半查找
二分查找的前提是数据的排序时顺序的,一般时从小到大。
数据的存储时顺序存储。
// 递归
function binarySearch(data, dest, start, end){ if (start > end){ // 新增否则找不到进入死循环了 return false; }
var end = end || data.length - 1;
var start = start || 0;
var m = Math.floor((start + end) / 2);
//直接命中
if (data[m] == dest){
return m;
}
if (data[m] > dest){ // 放左
end = m - 1;
return binarySearch(data, dest, start, end);
}else{ // 放右
start = m + 1;
return binarySearch(data, dest, start, end);
}
return false;
}
// 非递归 用while
//代码中的判断条件必须是while (left <= right),
//否则的话判断条件不完整,比如:array[3] = {1, 3, 5};
//待查找的键为5,此时在(low < high)条件下就会找不到,因为low和high相等时,指向元素5,但是此时条件不成立,没有进入while()中
function binarySearch2(data, dest){
var end = data.length - 1;
var start = 0;
while(start <= end){
var m = Math.floor((end + 1) / 2);
if(data[m] == dest){
return m;
}
if (data[m] > dest){
end = m - 1;
}else{
start = m + 1;
}
}
return false
}
以上两种算法只适合静态表的查找。如果想要实现动态表的查找,我们要采用二叉搜索树的结构。这种结构适用于动态表的增删查改等操作。