由于数组是排序的,所以二分查找是关键。
基本上,您正在搜索数组中的项目。
您将项目与数组的中间索引(长度/2)进行比较
如果两者相等,你就找到了。
如果项低于数组中间索引处的项,则将项与索引长度 / 4 -> ((0 + 长度 / 2) / 2) 的索引进行比较,如果低于,则在索引 ( (length / 2) + length) / 2(上半部分的中间)等等。
这样,如果在示例中您必须在 40 000 长度的数组中搜索项目,更糟糕的是,您会发现该项目不在经过 16 次比较的数组中:
我在一个有 40000 个索引的数组中搜索“某物”,我能找到它的最小索引是 0,最大值是 39999。
"something" > arr[20000]。让我们假设。我知道现在要搜索的最小索引是 20001,最大值是 39999。我现在正在搜索中间的 (20000 + 39999) / 2。
现在,"something" < arr[30000],它将搜索范围从索引 20001 限制到 29999。(20000 + 30000) / 2 = 25000。
"something" > arr[25000],我要从 25001 搜索到 29999。(25000 + 30000) / 2 = 27500
"something" < arr[27500],我要从 25001 搜索到 27499。(25000 + 27500) / 2 = 26250
"something" > arr[26250],我必须从 26251 搜索到 27499。(26250 + 27500) / 2 = 26875
"something" < arr[26875],我要从 26251 搜索到 26874。(26250 + 26875) / 2 = 26563
等等......当然,你必须四舍五入以避免浮动索引
var iteration = 1;
function bSearch(item, arr)
{
var minimumIndex = 0;
var maximumIndex = arr.length - 1;
var index = Math.round((minimumIndex + maximumIndex) / 2);
while (true)
{
++iteration;
if (item == arr[index])
{
arr.splice(0, minimumIndex);
return (true);
}
if (minimumIndex == maximumIndex)
{
arr.splice(0, minimumIndex);
return (false);
}
if (item < arr[index])
{
maximumIndex = index - 1;
index = Math.ceil((minimumIndex + maximumIndex) / 2);
}
else
{
minimumIndex = index + 1;
index = Math.floor((minimumIndex + maximumIndex) / 2);
}
}
}
var arrA;
var arrB;
for (var i = 0; i < arrA.length; ++i)
{
if (bSearch(arrA[i], arrB))
console.log(arrA[i]);
}
console.log("number of iterations : " + iteration);