データの二分探索
二分探索、またはバイナリサーチは、ソート済み配列内の指定された値をすばやく見つけます。ソート順を維持しながら配列に新しい値を挿入する位置を見つけるためによく使用されます。
bisector(accessor)
例 · ソース · 指定された *accessor* 関数を使用して、新しい二分探索器を返します。
const bisector = d3.bisector((d) => d.Date);
指定された *accessor* が2つの引数を取る場合、データ内の要素 *d* と検索値 *x* を比較するための比較関数として解釈されます。値を自然順序とは異なる順序(昇順ではなく降順など)でソートする場合は、アクセサーではなく比較関数を使用します。上記は以下と同等です
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と同様ですが、この二分探索器のアクセサーを使用します。上記のコードは、 *aapl* サンプルデータセットで2014年1月2日の直後の行のインデックスを見つけます。
bisector.left(array, x, lo, hi)
d3.bisector((d) => d.Date).left(aapl, new Date("2014-01-02")) // 162
bisectLeftと同様ですが、この二分探索器のアクセサーを使用します。上記のコードは、 *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* に最も近い値のインデックスを返します。これは、二分探索器のアクセサーが量的値を返すか、二分探索器の比較関数が符号付き距離を返すことを想定しています。そうでない場合、このメソッドは *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* を2つの半分に分割し、左側の *array*.slice(*lo*, *i*) 内のすべての *v* は *v* <= *x*、右側の *array*.slice(*i*, *hi*) 内のすべての *v* は *v* > *x* となります。 *bisector*.rightも参照してください。
bisectLeft(array, x, lo, hi)
d3.bisectLeft(aapl.map((d) => d.Date), new Date("2014-01-02")) // 162
ソート順を維持するために、*array* 内の *x* の挿入点を返します。引数 *lo* と *hi* を使用して、考慮すべき配列のサブセットを指定できます。デフォルトでは、配列全体が使用されます。*x* が *array* に既に存在する場合、挿入点は既存のエントリの前に(左側)になります。戻り値は、*array* が既にソートされていると仮定して、 *array*.splice の最初の引数として使用できます。返された挿入点 *i* は、*array* を2つの半分に分割し、左側の *array*.slice(*lo*, *i*) 内のすべての *v* は *v* < *x*、右側の *array*.slice(*i*, *hi*) 内のすべての *v* は *v* >= *x* となります。 *bisector*.leftも参照してください。
bisectCenter(array, x, lo, hi)
d3.bisectCenter(aapl.map((d) => d.Date), new Date("2013-12-31")) // 161
指定された数値の *array* 内の *x* に最も近い値のインデックスを返します。引数 *lo*(包含)と *hi*(排他)を使用して、考慮すべき配列のサブセットを指定できます。デフォルトでは、配列全体が使用されます。 *bisector*.centerも参照してください。