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

Сообщение Re[7]: BinarySearch со значением поля на входе от 31.03.2025 11:02

Изменено 01.04.2025 11:27 VladD2

Re[7]: BinarySearch со значением поля на входе
Здравствуйте, m2user, Вы писали:

M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.

M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)

Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:

public static int BinarySearch<T>(this IList<T> list, Func<T, int> comparer)
{
var left = 0;
var right = list.Count — 1;

while (left <= right)
{
var mid = left + (right — left) / 2;
var cmp = comparer(list[mid]);

if (cmp == 0)
return mid;

if (cmp < 0)
right = mid — 1;
else
left = mid + 1;
}

return ~left; // индекс вставки с битовым дополнением
}

M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").


Думать немножко надо.
Re[7]: BinarySearch со значением поля на входе
Здравствуйте, m2user, Вы писали:

M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.

M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)

Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:

public static int BinarySearch<T>(this IList<T> list, Func<T, int> comparer)
{
    var left = 0;
    var right = list.Count - 1;

    while (left <= right)
    {
        var mid = left + (right - left) / 2;
        var cmp = comparer(list[mid]);

        if (cmp == 0)
            return mid;

        if (cmp < 0)
            right = mid - 1;
        else
            left = mid + 1;
    }

    return ~left; // индекс вставки с битовым дополнением
}


M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").


Думать немножко надо.