[英]Find closest nodes in binary search tree
這聽起來像您在二進制搜索之后。 我已經為數組開發了一個二進制的findIndex
方法,該方法當然可以在排序數組中工作。 它需要一個回調,借助它,還可以搜索排序的對象數組。 由於它是二進制搜索,因此它比標准的findIndex
或indexOf
方法要快得多。
默認回調是x => x
,如果沒有提供回調,則默認情況下使它處理排序的基元。 在當前狀態下,如果找到搜索到的對象,它將返回索引,否則將返回-1。 如果進行搜索,則可以輕松地對其進行修改以返回接近指數。 如果需要,我可以稍后再添加。
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 while (deli > 0 && cb(this[base + deli]) != val) { deli = ~~(deli/2); cb(this[base + deli]) < val && (base += deli); } return cb(this[base + deli]) === val ? base + deli : -1; }; 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"}], idx = arr.sortedFindIndex(4, o => oa); console.log(idx);
這是一個修改后的版本,可以更巧妙地處理故障案例。 如果找不到搜索到的項目,則以下代碼段將返回索引的取反值,該值應位於該位置。 棘手的部分。 如果應該在索引0處插入丟失的項目,它將返回負零(-0)。現在應該很容易找到不存在的項目的上下距離。
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 => oa); console.log(idx);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.