簡體   English   中英

在二分搜索樹中查找最近的節點

[英]Find closest nodes in binary search tree

我想要一個對象集合,按一些數字屬性val排序。 我希望能夠檢索val匹配某個值(例如x所有匹配對象,或者如果不存在具有val匹配x val屬性的對象,請在x上下分別找到具有最接近val的對象。 (多個對象可能具有相同的val值)

dsjslib是我發現的少數BST庫之一 它具有所謂的TreeMultiMap ,它為單個鍵保存多個值。 問題是,如果沒有精確匹配,我看不到如何檢索最接近x節點。

我該怎么辦? 瀏覽器對ES6的支持似乎還有很長的路要走,所以也許我可以為此使用它的Map

這聽起來像您在二進制搜索之后。 我已經為數組開發了一個二進制的findIndex方法,該方法當然可以在排序數組中工作。 它需要一個回調,借助它,還可以搜索排序的對象數組。 由於它是二進制搜索,因此它比標准的findIndexindexOf方法要快得多。

默認回調是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM