Важно понимать, что из-за сортировки, о которой вы уже упоминали, инвертированные списки можно искать для любого данного идентификатора документа очень эффективно (обычно в логарифмическом времени), например, используя бинарный поиск.
Чтобы увидеть эффект от этого, предположим запрос caesar AND brutus
и предположим, что есть страницы Цезарь для caesar
и brutus страницы для brutus
( то есть occ X обозначает длину списка страниц для термина X). Теперь предположим, для примера, что в контенте встречается * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, т.е. * 10 * * *, то есть caesar
* встречается в содержании чаще, чем brutus
.
.
Затем вы должны повторить по всем страницам для brutus
сначала и найти для каждой из них в списке страниц для caesar
. Если в действительности списки можно искать в логарифмическом времени, это означает, что вам нужно
occ brutus * log (occ caesar )
вычислительные шаги для идентификации всех страниц, которые содержат оба термина.
Если вы сделали это в обратном порядке (т. Е. Итерация по списку caesar
и поиск каждой из его страниц в списке brutus
), меньшее число окажется в логарифме, и большее число станет фактором, поэтому общее время, затрачиваемое на оценку, будет больше.
Сказав это, также важно понимать, что на практике все сложнее, чем это, потому что (а) списки не только сортируются, но и сжимаются, что затрудняет поиск, и (б) части списков могут храниться на диске, а не в памяти, что означает, что общее количество обращений к диску в подавляющем большинстве более важно, чем общее количество вычислительных шагов. Следовательно, алгоритм, описанный выше, может не применяться в чистом виде, но принцип такой, как описано.