web-dev-qa-db-ja.com

D3:バイセクターとは何ですか?

D3でチャートを作成しようとしていますが、 d3.bisector を見つけました。しかし、私はそれが何であるか、ドキュメントから何をするのか理解していません。

私がウェブで見つけたほとんどすべての例は、公式ドキュメントの例に似た日付配列を使用しています。

var data = [
  {date: new Date(2011,  1, 1), value: 0.5},
  {date: new Date(2011,  2, 1), value: 0.6},
  {date: new Date(2011,  3, 1), value: 0.7},
  {date: new Date(2011,  4, 1), value: 0.8}
];

var bisect = d3.bisector(function(d) { return d.date; }).right;

配列要素から日付オブジェクトを選択する以外に、二等分線は何をしますか? *.rightは何を返しますか?

var data = [3, 6, 2, 7, 5, 4, 8]のような単純な1次元配列を持っている場合、それは役に立ちますか?

私を啓発してくれてありがとう。

43
Terry

bisectの背後にある基本的な考え方は次のとおりです。

あなたが言及した配列を考えてください-var data = [3, 6, 2, 7, 5, 4, 8]

新しい値を3.5data配列に挿入し、その「パーティション」がどのようになるかを知りたいとします。言い換えると、data配列がソートされているときに挿入された場合、3.5のインデックスが何であるかを知りたいということです。

   var data = [3, 6, 2, 7, 5, 4, 8]

   //Sorted data

  [2, 3, 4, 5, 6, 7, 8]

  //You want to insert 3.5


  The sorted array after insertion of 3.5 should look something like:

  [2, 3, 3.5, 4, 5, 6, 7, 8]


  So the index of 3.5 in sorted data array is "2".

その要素の挿入が配列を「二分」または「分割」する方法を知りたい場合があります。その場合、最初にその配列をソートし、 Binary Search と呼ぶものを実行して、その要素を挿入するための正しい位置を見つけたいでしょう。

bisectLeftbisectRightは、配列に既に存在する要素を入力する状況で異常を明確にするように注意してください。別の3を配列に入力するとします。次の2つの状況があります。

   3* -> The new element to be entered


   [2, 3*, 3, 4, 5, 6, 7, 8] -> entered at "1" (array is still sorted)


   [2, 3, 3*, 4, 5, 6, 7, 8] -> entered at "2" (array is still sorted)

したがって、このあいまいさをどのように処理するかに応じて、既存の要素の「左」または「右」にその要素を入力できます。 docs (強調にマーク)から:

返された挿入ポイントiは、配列を2つの半分に分割し、すべてのv<x for array.slice(lo、i)for left sideそして、すべてのv> =x for array.slice(i、hi)for the right side。

bisectLeftでは、適切なインデックスとして1を取得します。すべての重複エントリはそのインデックスの右側にあり、その状況はまさにbisecRightの反対。

bisectLeftbisectRightの仕組みがわかったので、bisectorを使用して、カスタムcomparatorまたはaccessor関数を定義することができます。オブジェクトの<および>の値または意味もあります。

したがって、このコードは次のとおりです。

  var bisect = d3.bisector(function(d) { return d.date; }).right;

  var bisect = d3.bisector(function(a, b) { return a.date - b.date; }).right;

bisectRightオプションを使用し、配列が(昇順で)ソートされていると仮定して、要素の挿入に適したインデックスを返すように指定するだけです。

したがって、あなたの例に基づいてビルドし、bisectorという名前のbisectを想定するとします。そしてあなたはやった:

 bisect(data, 3); //it would return 2.

それが物事を明確にし、あなたが正しい方向に出発することを願っています。

116
Vivek Pradhan

ドキュメントから(リンクしている):

配列内のxの挿入ポイントを見つけて、ソートされた順序を維持します。

それがそれです。それは、その後にソートされた配列を保持するために、新しい要素を挿入する場所を示します。配列は任意の種類の構造にすることができます。そのため、検索の目的でこの構造を「分解」できるようにするアクセサー関数があります。

左と右の二等分線の違いは、挿入ポイントがどこにあるか(最も近い要素の左または右)-配列が昇順または降順でソートされるかどうかです。

二等分線の使用例の1つは、グラフ上でマウスを動かしたときに最も近いデータポイントを強調表示する場合です。 この例

3
Lars Kotthoff