Сообщение Re[2]: [CodeJam] UpperBound/LowerBound - оно чего вообще дел от 20.07.2016 9:50
Изменено 20.07.2016 10:05 Lexey
Здравствуйте, Jack128, Вы писали:
А нужен? Он тривиально реализуется через LowerBound:
Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.
J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.
У меня другое ИМХО.
Но, если хочется, то нет проблем добавить и бинарный поиск в исходном стиле:
Твой Try... через него потом делается с полпинка:
И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.
А нужен? Он тривиально реализуется через LowerBound:
var comparer = (item, id) => item.ID - id;
var index = items.LowerBound(10, comparer);
if (index != items.Count && items[index].ID == 10)
{
// есть значение
}
else
{
// нет значения
}
Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.
J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.
У меня другое ИМХО.
Но, если хочется, то нет проблем добавить и бинарный поиск в исходном стиле:
public static int BinarySearch<T,TValue>(this IList<T> list, TValue value, Func<T, TValue, int> comparer);
Твой Try... через него потом делается с полпинка:
public static bool TryBinarySearch<T,TValue>(this IList<T> list, Func<T, TValue> projection, TValue value, out T result)
{
var comparer = (item, value) => projection(item) - value;
var index = list.BinarySearch(value, projection comparer);
if (index != list.Count)
{
result = list[index];
return true;
}
result = default(T);
return false;
}
И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.
Здравствуйте, Jack128, Вы писали:
А нужен? Он тривиально реализуется через LowerBound:
Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.
J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.
У меня другое ИМХО.
Но, если хочется, то нет проблем добавить и бинарный поиск в исходном стиле:
Твой Try... через него потом делается с полпинка:
И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.
А нужен? Он тривиально реализуется через LowerBound:
var comparer = (item, id) => item.ID - id;
var index = items.LowerBound(10, comparer);
if (index != items.Count && items[index].ID == 10)
{
// есть значение
}
else
{
// нет значения
}
Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.
J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.
У меня другое ИМХО.
Но, если хочется, то нет проблем добавить и бинарный поиск в исходном стиле:
public static int BinarySearch<T,TValue>(this IList<T> list, TValue value, Func<T, TValue, int> comparer);
Твой Try... через него потом делается с полпинка:
public static bool TryBinarySearch<T,TValue>(this IList<T> list, Func<T, TValue> projection, TValue value, out T result)
{
var comparer = (item, value) => projection(item) - value;
var index = list.BinarySearch(value, comparer);
if (index != list.Count)
{
result = list[index];
return true;
}
result = default(T);
return false;
}
И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.