Array.prototype.sortedFindIndex = function(val, cb = x => x) { // default callback for primitive arrays
var deli = this.length-1, // delta index
base = 0, // base to add the delta index
calculatedValue = cb(this[base + deli]), // use callback and get the value
expectedAt = i => { while (this[i] !== void 0 && cb(this[i]) < val) ++i;
return -i};
while (deli > 0 && calculatedValue != val) {
deli = ~~(deli/2);
(calculatedValue = cb(this[base + deli])) < val && (base += deli);
}
return calculatedValue === val ? base + deli : expectedAt(base + deli);
};
arr = [{a:0,b:"foo"},{a:1,b:"bar"},{a:2,b:"baz"},{a:3,b:"qux"},{a:4,b:"fox"},{a:5,b:"pun"},{a:6,b:"alf"},{a:7,b:"alf"},{a:8,b:"alf"},{a:9,b:"alf"},{a:10,b:"alf"},{a:11,b:"alf"},{a:13,b:"alf"}],
idx = arr.sortedFindIndex(12, o => o.a);
console.log(idx);
「最近的上方和下方」 上面和下面是什麼?數字x不等於? – jessh
最近的是你檢查並阻止的最後一個節點 - 因爲你不能再繼續下去,因爲它可能缺少一個必需的孩子,或者是一片葉子 - 也可能是父母。我可以在今天晚些時候給出一個更好的解釋,但這一切都歸結於可以對BSTs做出的觀察 –
我修改了我的答案,以便在未找到時返回缺失項的預期索引的否定值。這有助於您輕鬆找出最近的上層和下層鄰居。 – Redu