此二分搜索適用于數字,但不適用于字串
function binary_search(Array, key) {
var middleIndex = Math.floor(Array.length / 2)
var middleValue = numberArray[middleIndex]
//base case key = middle element
if (middleValue === key) return true
else if (middleValue < key && Array.length > 1) {
return binary_search(Array.splice(middleIndex, Array.length), key)
}
else if (middleValue > key && Array.length > 1) {
return binary_search(Array.splice(0, middleIndex), key)
}
else return false
}
如果我給它數字,它會起作用:
console.log(binary_search([5,7,12,16,36,39,42,56,71], 36))
output: true
但不是字串:
console.log(binary_search(['cat', 'dog', 'bird', 'fish'], 'dog'))
result : flase
我知道必須對陣列進行預排序才能使其正常作業,但是如何使用字串來做到這一點?
uj5u.com熱心網友回復:
正如你所說
我了解必須對陣列進行預排序才能使其正常作業
您傳入的字串陣列未排序,因此無法進行二進制搜索。如果你先排序
['bird', 'cat', 'dog', 'fish']
那么您當前的方法大部分已經可以作業了,因為可以===正確比較字串,并且<也>可以按字典序比較字串(它適用于數字和字串),但有一些注意事項:
- 用于
slice提取陣列的一部分, notsplice,這將從陣列中洗掉元素(突變!)并回傳這些回傳元素的陣列(不是很直觀) - 您在范圍內沒有
numberArray變數,也不應該影響全域Array. 使用不同的變數名,并在函式中的任何地方使用相同的名稱
function binary_search(arr, key) {
const middleIndex = Math.floor(arr.length / 2)
const middleValue = arr[middleIndex]
if (middleValue === key) return true
if (arr.length <= 1) return false;
if (middleValue < key) {
return binary_search(arr.slice(middleIndex), key)
} else if (middleValue > key) {
return binary_search(arr.slice(0, middleIndex), key)
}
return false
}
console.log(binary_search(['bird', 'cat', 'dog', 'fish'], 'dog'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482967.html
標籤:javascript 算法
上一篇:更改下拉串列中箭頭的狀態
