JavaScript中的二进制数组搜索
我似乎无法让这个代码正常工作。如果它们的键在数组中,则代码应警告True,如果它不在数组中,则应警告false。我似乎做得不对。谢谢JavaScript中的二进制数组搜索,javascript,arrays,loops,Javascript,Arrays,Loops,我似乎无法让这个代码正常工作。如果它们的键在数组中,则代码应警告True,如果它不在数组中,则应警告false。我似乎做得不对。谢谢 <!DOCTYPE HTML> <html lang="en-us"> <head> <meta charset="utf-8"> <title>Search</title> <script type="text/javascript"> function testFun
<!DOCTYPE HTML>
<html lang="en-us">
<head>
<meta charset="utf-8">
<title>Search</title>
<script type="text/javascript">
function testFunction() {
var list = [ 1, 2, 3, 4, 5, 6, 7 ];
var key = 9;
var result1 = 0;
//var result2 = 0;
result1 = search(list, key);
}
function search(list, key) {
var left = 0;
var right = list.length - 1;
while (left <= right) {
var mid = left + ((right - left) >>> 1);
var cmp = key - list[mid];
if (cmp > 0 ){
left = alert("True");
} else if (cmp < 0){
alert("False");
}else {
return mid;
}
return mid;
}
}
</script>
</head>
<h1>Search:</h1>
<button type="button" onclick="testFunction()">Volume</button>
<div id="outputDiv"></div>
</html>
搜寻
函数testFunction(){
var列表=[1,2,3,4,5,6,7];
var-key=9;
var结果1=0;
//var result2=0;
结果1=搜索(列表、键);
}
功能搜索(列表、键){
左向量=0;
var right=list.length-1;
而(左>>1);
var cmp=键列表[mid];
如果(cmp>0){
左=警报(“真”);
}否则如果(cmp<0){
警告(“假”);
}否则{
中途返回;
}
中途返回;
}
}
搜索:
卷
如果您满足这两个条件,您很少会看到这样做而不是.indexOf
的好处
function search(haystack, needle, i, j) {
var k;
if (i !== 0 && !i) i = 0;
if (j !== 0 && !j) j = haystack.length - 1;
if (needle < haystack[i] || haystack[j] < needle) return false;
if (i === j) return haystack[i] === needle;
while (i < j) {
k = Math.floor(i + (j - i) / 2);
if (haystack[k] === needle) return true;
if (haystack[k] < needle) i = k + 1;
else j = k - 1;
}
return (i === j) && (haystack[i] === needle);
}
编写一个名为search的JavaScript函数,它接受两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定密钥是否存储在列表中。如果数字存储在数组中,则代码应返回true,否则应返回false 在ECMAScript 6环境中,您可以使用
也许你可以试试这个二进制搜索功能
function binarySearch(array, key) {
var lo = 0,
hi = array.length - 1,
mid,
element;
while (lo <= hi) {
mid = ((lo + hi) >> 1);
element = array[mid];
if (element < key) {
lo = mid + 1;
} else if (element > key) {
hi = mid - 1;
} else {
return mid;
}
}
return -1;
}
函数二进制搜索(数组,键){
var lo=0,
hi=数组长度-1,
中间,
元素;
而(lo>1);
元素=数组[mid];
if(元素<键){
lo=中间+1;
}else if(元素>键){
hi=mid-1;
}否则{
中途返回;
}
}
返回-1;
}
我很确定>>
是不正确的…只需使用
为什么不直接执行列表。索引(键)
?是的,这对于您尝试执行的操作来说似乎太复杂了。只需执行returnlist.indexOf(key)==-搜索功能中的1
,无任何内容else@SpencerWieczorek…因为一次搜索很无聊。(但可能是为了一个非常大的数组,或者可能是为了学校作业,或者只是为了学习……)无论如何,我建议找到一个现有的二进制搜索实现(其中有很多,请参阅维基百科),并与当前的实现相比较,慢慢分析它。使用调试器检查边界更改和比较值。@user2864740您是对的,只是太排他性了。我已经重新措辞了谢谢!编辑以将i===j
测试移出循环,测试已完成2*次迭代
(=
在循环和中,正如您所看到的,我是一个noob,我正在尝试理解您的代码。以下是我正在做的工作:编写一个名为search的JavaScript函数,它包含两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定key是否存储在list中。如果存储了数字,则代码应返回true在数组中,否则应返回false。将此函数头用于函数:函数搜索(列表,键){@user5500799我在函数中编辑了一个函数,以满足您刚才描述的要求。我原始答案中的函数与此类似(i
和j参数是可选的,您可以将它们作为参数删除,然后将前3行重新写入var)。我只需调用listhaystack
和keyneedle
(key对于这里的含义来说是一个非常糟糕的标识符名称)。它首先进行测试“是端点之间的针吗i..j
?”,然后测试“是中点(k
)针?”?",如果没有,它会将相关的端点移到我们刚刚测试过的中点旁边,并重复,直到我们的测试位置用完为止。我真的需要在这方面更加努力,与我尝试的方式相比,您使代码看起来非常简单。谢谢!您的代码看起来与我尝试的代码类似,我如何才能让它发出正确或错误的警报?如果找到了键,则为True;如果未找到,则为false?var result=binarySearch(数组,键);if(result>=0){alert(“True”);}否则{alert(“false”);}
function search(list, key) {
return list.indexOf(key) !== -1;
}
function search(list, key) {
return list.findIndex(e => e === key) !== -1;
}
function binarySearch(array, key) {
var lo = 0,
hi = array.length - 1,
mid,
element;
while (lo <= hi) {
mid = ((lo + hi) >> 1);
element = array[mid];
if (element < key) {
lo = mid + 1;
} else if (element > key) {
hi = mid - 1;
} else {
return mid;
}
}
return -1;
}