Информация об изменениях

Сообщение [CodeJam] UpperBound/LowerBound - оно чего вообще делает? от 18.04.2016 8:07

Изменено 18.04.2016 8:20 Sinix

Можно пример реального юз-кейза для этой штуки?

Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?

Тогда:
0. Комментарии

// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] > value — Upper
// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] >= value — Lower

Вот фиг из них поймёшь, что имеется в виду. IndexOfFirstGreaterBy/IndexOfFirstGreaterByOrEqual тогда уж

1. Проблема с именем, будет путаница с Array.GetUpperBound()

2. Путаница с параметром to. В дотнете принято делать пару startIndex + count (сколько элементов просматривать). Аля BinarySearch() / CopyTo() / Substring().
Ок, допустим неудобно настолько, что мы забиваем на least surprise. Зачем тогда to может быть равен count? это ж индекс типа. Я вот про это:

        private static void ValidateIndicesRange(int from, int to, int count)
        {
            ...
            Code.AssertArgument(to <= count, nameof(to),
                "The {0} index should not exceed the {1}", nameof(to), nameof(count));
            ...
        }



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

4. Выдаёт рандом на неотсортированных списках. Вот это для меня самый главный WTF.


И собственно вопрос: чем плох стандартный BinarySearch? С учётом стандартного трюка
var index = Array.BinarySearch(data.BinarySearch(2);
if (index < 0)
{
  var insertIndex = ~index;
  ...
}



UPD и тот же вопрос — для EqualRange. Как часто нам нужен диапазон с-по для одного значения, не для valueFrom-valueTo?
[CodeJam] UpperBound/LowerBound - оно чего вообще делает?
Можно пример реального юз-кейза для этой штуки?

Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?

Тогда:
0. Комментарии

// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] > value — Upper
// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] >= value — Lower

Вот фиг из них поймёшь, что имеется в виду. IndexOfFirstGreaterBy/IndexOfFirstGreaterByOrEqual тогда уж

1. Проблема с именем, будет путаница с Array.GetUpperBound()

2. Путаница с параметром to. В дотнете принято делать пару startIndex + count (сколько элементов просматривать). Аля BinarySearch() / CopyTo() / Substring().
Ок, допустим неудобно настолько, что мы забиваем на least surprise. Зачем тогда to может быть равен count? это ж индекс типа. Я вот про это:

        private static void ValidateIndicesRange(int from, int to, int count)
        {
            ...
            Code.AssertArgument(to <= count, nameof(to),
                "The {0} index should not exceed the {1}", nameof(to), nameof(count));
            ...
        }



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

4. Выдаёт рандом на неотсортированных списках. Вот это для меня самый главный WTF.


И собственно вопрос: чем плох стандартный BinarySearch? С учётом стандартного трюка
var index = Array.BinarySearch(data.BinarySearch(2);
if (index < 0)
{
  var insertIndex = ~index;
  ...
}



UPD и тот же вопрос — для EqualRange. Как часто нам нужен диапазон с-по для одного значения, не для valueFrom-valueTo?
UPD2 и для PartitionPoint — тож. Очень неочевидно, что у нас 4 метода по сути делают одно и то же, только с слегка разным поведением при сравнении.