Однажды профессор сказал:

Чтобы стать старшим инженером, вам необходимо изучить структурное программирование, функциональное программирование, полиморфизм, множество архитектур, шаблоны проектирования, тестирование, TDD, BDD, гибкое и экстремальное программирование. Вам нужно много пар. Здесь много движущихся частей!
Но чтобы выйти за рамки и стать игроком мирового класса, вам нужно владеть одной вещью и только одной: алгоритмами!

Некоторые говорят, что Вселенная и жизнь описываются функциями. Действительно, они есть. Совершенные математические уравнения, которые управляют расширением Вселенной, галактиками, черными дырами, светом и электромагнитными волнами, путешествующими по космосу.
От атомов, крошечных взаимодействий кварков и более мелких частиц до темной материи. От эндорфина в нашем мозгу до самых глубоких неизведанных чувств и эмоций человека и животных.

Действительно, все может быть функцией… Мне нравится думать, что это означает, что Бог/Создатели (или то, что породило Вселенную) были чертовски хороши в построении алгоритмов!

Итак, после многих лет поисков этого алгоритма, испробования стольких разных подходов и использования стольких разных алгоритмов, в какой-то момент показалось, что он оказался на 1 шаг вперед и на 2 шага назад. Но, наконец, недавно я это сделал! Я его еще нигде не видел, не с такой целью.

УНИКАЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫБОРА КОГО СОХРАНИТЬ 🔥🚀

Причина: вы хотите объединить две коллекции и предположить, что последняя из них действительна (иногда алгоритм позволяет вам решить).

Использование: Каждый раз, когда возникает необходимость объединить или очистить последовательности, сохраняя порядок.

(allExistingItems + newItems).unique(keepLast: true)
sequenceWithDuplications.unique()

Алгоритм: Красота этого подхода заключается в его простоте: почти незаметно, что он использует рекурсию. (Доступно в GIST)

Контроль качества:

  • Почему не Set или OrderedSet? — Опробовано 4 года назад. Наборы — это конкретные объекты, поэтому требуют выделения памяти, преобразования, создания и т. д. Хотя «Sequence» — это один из протоколов, лежащих в основе последовательностей. , поэтому он работает с любым массивом, подмассивом, срезом, разделением или даже строками, которые также являются коллекциями. Разница между созданием расширения для Sequence и использованием Set буквально подобна Night и Day. Set — очень мощный инструмент, но его использование внутри функции великолепно.
  • Почему 2 перевернуты? — Хотя они сами по себе являются O(n), они используются последовательно, и в большинстве языков, которые я тестирую, производительность вообще не влияет на сохранение последним или нет. случаи. Прелесть этой временной сложности в том, что она равна O(n) + O(n) + O(n), что означает, что она снижается до O(n). Но ключевой момент в решении об обратном: что бы мы ни пытались, любая попытка отказаться от них обязательно приведет к худшему алгоритму. Чтобы отбросить обратное, нам нужно использовать какой-то индекс для перемещения указателя, что неизбежно требует использования кода, который компилятор не будет оптимизировать, и, следовательно, худшей производительности во время выполнения. Но я думаю, что смогу продолжать попытки преодолеть этот последний барьер.
  • Какова цель? —Основное преимущество, которое я получил от этого алгоритма, — это при работе с обновлениями коллекций с сервера, особенно в случаях с разбивкой на страницы. Каждое приложение включает в себя какой-то список, загружаемый с серверов. Например, история пользователя, список продуктов или любой динамический список. Итак, как в приведенном выше примере, в фоновом потоке (обычно таком же, как ответ сети) мы можем буквально просто объединить существующие локальные результаты с новыми результатами, объединяя локальные данные с новыми данными. Для случаев с разбиением на страницы, независимо от типа стратегии разбиения на страницы, которую использует ваш сервер (либо по индексу начала, либо по дате, либо по хешу), если список является динамическим, всегда возможно, что количество элементов может измениться на сервере из-за Добавляет и/или удаляет, и теперь проблема будет в дублированных элементах. Поэтому, чтобы решить эту проблему изящно, на помощь придет «unique(keepLast:)».