Сообщение [CodeJam] UpperBound/LowerBound - оно чего вообще делает? от 18.04.2016 8:07
Изменено 18.04.2016 8:20 Sinix
Можно пример реального юз-кейза для этой штуки?
Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?
Тогда:
0. Комментарии
1. Проблема с именем, будет путаница с Array.GetUpperBound()
2. Путаница с параметром to. В дотнете принято делать пару startIndex + count (сколько элементов просматривать). Аля BinarySearch() / CopyTo() / Substring().
Ок, допустим неудобно настолько, что мы забиваем на least surprise. Зачем тогда to может быть равен count? это ж индекс типа. Я вот про это:
3. Проблема с возвращаемым значением. Непонятно, найдено ли точное совпадение, или просто все предыдущие оказались меньше.
4. Выдаёт рандом на неотсортированных списках. Вот это для меня самый главный WTF.
И собственно вопрос: чем плох стандартный BinarySearch? С учётом стандартного трюка
UPD и тот же вопрос — для EqualRange. Как часто нам нужен диапазон с-по для одного значения, не для valueFrom-valueTo?
Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?
Тогда:
0. Комментарии
Вот фиг из них поймёшь, что имеется в виду. IndexOfFirstGreaterBy/IndexOfFirstGreaterByOrEqual тогда уж// 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
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. Комментарии
1. Проблема с именем, будет путаница с Array.GetUpperBound()
2. Путаница с параметром to. В дотнете принято делать пару startIndex + count (сколько элементов просматривать). Аля BinarySearch() / CopyTo() / Substring().
Ок, допустим неудобно настолько, что мы забиваем на least surprise. Зачем тогда to может быть равен count? это ж индекс типа. Я вот про это:
3. Проблема с возвращаемым значением. Непонятно, найдено ли точное совпадение, или просто все предыдущие оказались меньше.
4. Выдаёт рандом на неотсортированных списках. Вот это для меня самый главный WTF.
И собственно вопрос: чем плох стандартный BinarySearch? С учётом стандартного трюка
UPD и тот же вопрос — для EqualRange. Как часто нам нужен диапазон с-по для одного значения, не для valueFrom-valueTo?
UPD2 и для PartitionPoint — тож. Очень неочевидно, что у нас 4 метода по сути делают одно и то же, только с слегка разным поведением при сравнении.
Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?
Тогда:
0. Комментарии
Вот фиг из них поймёшь, что имеется в виду. IndexOfFirstGreaterBy/IndexOfFirstGreaterByOrEqual тогда уж// 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
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 метода по сути делают одно и то же, только с слегка разным поведением при сравнении.