Сообщение Задолбал Dick Seek со своей "невнимательностью" от 24.11.2025 16:51
Изменено 24.11.2025 23:12 VladD2
Анализируем функцию
| функция | |
| |
Спрашиваю про проблемы производительности.
Q:
Насколько эта функция эффективна в плане скорости и потребления памяти? Можно ли эффективнее?
| получаю вот такой ответ | |
| |
И это сразу
фэйл!
Потому что в процессе выполнения алгоритма не будет продвижения по source дальше чем длинна самого длинного ключа, т.о. сложность составляет O(L × n), где L — длина самого длинного ключа, n — количество ключейОбоснование:
Алгоритм проверяет только первые L символов source — именно поэтому длинна source в этой формуле не участвует.
После позиции L-1 все ключи либо найдены, либо отсеяны — дальнейшие символы source не обрабатываются
Удаление из середины списка — O(n) операций
Двойной фэйл!
Remove(LinkedListNode<T>) имеет сложность O(1) — он его перепутал с методом bool Remove(T value), который действительно имеет сложность O(n)Спрашиваю, изменится ли ситуация, если удаление из середины будет O(1).
Далее, напоминаю, что ключи таки удаляются:
Q:
Пункт 1 — неверно: заведомо несовпадающие ключи удаляются. Посмотри на эти строки
if (false == lastCharsEquals || endOfKeyReached) { keys.Remove(node); }
Подумай ещё раз.
A:
Вы абсолютно правы! Я был невнимателен. Давайте переанализируем.
| и снова фэйл! | |
| |
....Извините за первоначальную невнимательность — ваш код умнее, чем я его оценил.
Тащемта, снова косяк с анализом алгоритма!
Это неправильно. Я чуть выше писал как правильно.**Сложность:** O(m × k), где:
— m — длина строки `source`
— k — среднее количество **активных** ключей (тех, что ещё могут совпасть)
Ну и ещё — вот на эту ошибку в коде мне можно было бы и указать.
keys.Remove(node);
}
node = node.Next;Ошибка в том, что после того как ноду удалили из списка, из неё нельзя доставать node.Next — это особенности реализации (она инвалидируется — node.Next после этого null).
Вот здесь эта переписка: https://chat.deepseek.com/share/2s21f9ixhbecpg4ixj
ЗЫ: задолбал с умным видом хрень нести
Анализируем функцию
| функция | |
| |
Спрашиваю про проблемы производительности.
Q:
Насколько эта функция эффективна в плане скорости и потребления памяти? Можно ли эффективнее?
| получаю вот такой ответ | |
| |
И это сразу
фэйл!
Потому что в процессе выполнения алгоритма не будет продвижения по source дальше чем длинна самого длинного ключа, т.о. сложность составляет O(L × n), где L — длина самого длинного ключа, n — количество ключейОбоснование:
Алгоритм проверяет только первые L символов source — именно поэтому длинна source в этой формуле не участвует.
После позиции L-1 все ключи либо найдены, либо отсеяны — дальнейшие символы source не обрабатываются
Удаление из середины списка — O(n) операций
Двойной фэйл!
Remove(LinkedListNode<T>) имеет сложность O(1) — он его перепутал с методом bool Remove(T value), который действительно имеет сложность O(n)Спрашиваю, изменится ли ситуация, если удаление из середины будет O(1).
Далее, напоминаю, что ключи таки удаляются:
Q:
Пункт 1 — неверно: заведомо несовпадающие ключи удаляются. Посмотри на эти строки
if (false == lastCharsEquals || endOfKeyReached) { keys.Remove(node); }
Подумай ещё раз.
A:
Вы абсолютно правы! Я был невнимателен. Давайте переанализируем.
| и снова фэйл! | |
| |
....Извините за первоначальную невнимательность — ваш код умнее, чем я его оценил.
Тащемта, снова косяк с анализом алгоритма!
Это неправильно. Я чуть выше писал как правильно.**Сложность:** O(m × k), где:
— m — длина строки `source`
— k — среднее количество **активных** ключей (тех, что ещё могут совпасть)
Ну и ещё — вот на эту ошибку в коде мне можно было бы и указать.
keys.Remove(node);
}
node = node.Next;Ошибка в том, что после того как ноду удалили из списка, из неё нельзя доставать node.Next — это особенности реализации (она инвалидируется — node.Next после этого null).
Вот здесь эта переписка: https://chat.deepseek.com/share/2s21f9ixhbecpg4ixj
ЗЫ: задолбал с умным видом хрень нести