2014-11-12 3 views
30

Я ищу диаграммы с D3 и наткнулся на d3.bisector. Однако я не понимаю, что это такое или делает из документации.D3: Что такое биссектриса?

Почти все примеры, которые я нахожу в Интернете использовать массив Date, подобно тому, например, в официальной документации:

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]?

Спасибо, что просветили меня.

ответ

72

Основная идея bisect заключается в следующем:

Рассмотрим массив, который вы упоминаете - var data = [3, 6, 2, 7, 5, 4, 8]

Вы хотите вставить новое значение, скажем 3.5 в data массив и хотите знать, как будет, что «раздел ' Это. Другими словами, вы хотите знать, что будет индексом 3.5, если он был вставлен при сортировке массива data.

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, чтобы узнать правильную позицию для вставки этого элемента.

bisectLeft и bisectRight позаботьтесь об уточнении аномалии в ситуации, когда вы хотите ввести элемент, который уже существует в массиве. Предположим, вы хотите ввести еще один 3 в массив. Есть две ситуации:

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 (Марка акцент):

Возвращенная точка вставки я разбивает массив на две половины, так что все против < х для V в array.slice (вот, я) для левой стороны и all v > = x для v в array.slice (i, hi) для правой стороны.

В bisectLeft мы получаем 1 в качестве подходящего индекса, все повторяющиеся записи будут быть справа от этого индекса и ситуация с точностью до наоборот в bisecRight.

Теперь, когда вы знаете, как bisectLeft и bisectRight работы, bisector только позволяет определить пользовательские comparator или accessor функцию parition значения или иметь смысл < и > на объектах, а также.

Так что этот кусок кода:

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. 

Надеюсь, это прояснит ситуацию и поможет вам начать работу в правильном направлении.

+4

Блестящий ответ! Я так счастлив, что, наконец, понял! – Terry

+0

Фантастический и очень четкий ответ –

3

Из документации (что вы связаны с):

Найдите точку вставки для й в массиве, чтобы сохранить порядок сортировки.

Это он. Он сообщает вам, где новый элемент должен быть вставлен, чтобы после этого отсортировать массив. Массив может быть любой структурой, поэтому есть функция доступа, которая позволяет вам «разложить» эту структуру для целей поиска.

Разница между левым и правым биссектрисами заключается в том, где находится точка вставки (слева или справа от ближайшего элемента) - отсортирован ли массив по возрастанию или по убыванию.

Один из вариантов использования для биссектрисов - это то, где вы хотите выделить ближайшую точку данных при перемещении мыши над графиком, см., Например, this example.

Смежные вопросы