Хотя я думаю, что @larsmans является правильным, поскольку понимание логики и математики - это быстрый способ понять, как выбрать полезные ADT для решения данной проблемы, изучение существующих решений может быть более поучительным для тех из нас, кто борется с этими темами. В частности, обзор кода установленного программного обеспечения (OSS), который решает проблему, аналогичную той, которая вас интересует.
Я считаю, что особенно хорошим методом для этого метода изучения является проверка юнит-тестов такого проекта. Apache Lucene , например, имеет репозиторий управления исходным кодом, содержащий множество примеров. Хотя он не раскрывает основные алгоритмы, он помогает проследить конкретную функциональность, которая решает определенную проблему. Это приводит к возможности изучения его внутренних особенностей - то есть интересного алгоритма. В случае Lucene на ум приходят перевернутые индексы .
Хотя это не гарантирует, что алгоритм, который вы обнаружите, является наилучшим, он, вероятно, подвергся тщательному анализу и, вероятно, поступил из проекта с активной рассылкой, которая может ответить на ваши вопросы. Так что это хороший ресурс для поиска решения, которое, вероятно, лучше, чем то, что большинство из нас придумали бы самостоятельно.