資料二分
二分法,或二元搜尋,可以在已排序陣列中快速找到指定值。它通常用於在維持排序順序的同時,找到將新值插入陣列的位置。
bisector(accessor)
範例 · 原始碼 · 使用指定的 accessor 函式傳回新的二分器。
const bisector = d3.bisector((d) => d.Date);
如果給定的accessor 接受兩個參數,則它會被解釋為一個比較器函數,用於比較資料中的元素 d 與搜尋值 x。如果你想要以不同於自然順序(例如以遞減而非遞增順序)的方式對值進行排序,則使用比較器而非 accessor。以上等於
const bisector = d3.bisector((d, x) => d.Date - x);
二分器可被用於二分已排序的物件陣列(與 bisect 相反,後者用於二分基本型別)。
bisector.right(array, x, lo, hi)
d3.bisector((d) => d.Date).right(aapl, new Date("2014-01-02")) // 163
與 bisectRight 相同,但使用此二分器的 accessor。以上程式碼會在 aapl 範例資料集 中找出緊接在 2014 年 1 月 2 日之後的那一列的索引值。
bisector.left(array, x, lo, hi)
d3.bisector((d) => d.Date).left(aapl, new Date("2014-01-02")) // 162
與 bisectLeft 相同,但使用此二分器的 accessor。以上程式碼會在 aapl 範例資料集 中找出 2014 年 1 月 2 日那一列的索引值。
bisector.center(array, x, lo, hi)
d3.bisector((d) => d.Date).center(aapl, new Date("2013-12-31")) // 161
傳回給定已排序 array 中最接近 x 的值的索引值。這預期二分器的 accessor 會傳回一個量化值,或二分器的比較器會傳回一個有符號距離;否則,此方法等於 bisector.left。參數 lo(包含)和 hi(不包含)可用於指定應考慮的陣列子集;預設使用整個陣列。
bisect(array, x, lo, hi)
d3.bisect(aapl.map((d) => d.Date), new Date("2014-01-02")) // 163
別名為 bisectRight。
bisectRight(array, x, lo, hi)
d3.bisectRight(aapl.map((d) => d.Date), new Date("2014-01-02")) // 163
與 bisectLeft 相同,但傳回一個插入點,該插入點會出現在 array 中任何等於 x 的現有條目的後面(右側)。傳回的插入點 i 將 array 分割成兩半,使得對 array.slice(lo, i) 中的 v 而言,所有 v <= x,而對 array.slice(i, hi) 中的 v 而言,所有 v > x。另請參閱 bisector.right。
bisectLeft(陣列, x, lo, hi)
d3.bisectLeft(aapl.map((d) => d.Date), new Date("2014-01-02")) // 162
傳回 陣列 中 x 的插入點,以維持排序順序。參數 lo 和 hi 可用來指定應考慮的陣列子集;預設使用整個陣列。如果 x 已存在於 陣列 中,插入點會在任何現有項目之前(左方)。傳回值適合用作 陣列.splice 的第一個參數,假設 陣列 已排序。傳回的插入點 i 將 陣列 分割成兩半,使得 陣列.slice(lo, i) 中所有 v < x,而 陣列.slice(i, hi) 中所有 v >= x。另請參閱 bisector.left。
bisectCenter(陣列, x, lo, hi)
d3.bisectCenter(aapl.map((d) => d.Date), new Date("2013-12-31")) // 161
傳回數字 陣列 中最接近 x 的值之索引。參數 lo(包含)和 hi(不包含)可指定應考慮的陣列子集;預設使用整個陣列。另請參閱 bisector.center。