Основная идея 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.
Надеюсь, это прояснит ситуацию и поможет вам начать работу в правильном направлении.
Блестящий ответ! Я так счастлив, что, наконец, понял! – Terry
Фантастический и очень четкий ответ –