Адитья Бхаргава – Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих (страница 29)
MapReduce использует эти две простые концепции для выполнения запросов на нескольких машинах. При использовании большого набора данных (миллиарды записей) MapReduce выдаст ответ за минуты, тогда как традиционной базе данных на это потребуются многие часы.
Фильтры Блума и HyperLogLog
Представьте себя на месте сайта Reddit. Когда пользователь публикует ссылку, нужно проверить, публиковалась ли эта ссылка ранее. Истории, которые еще не публиковались, считаются более ценными.
Или представьте себя на месте поискового бота Google. Обрабатывать веб-страницу нужно только в том случае, если она еще не обрабатывалась ранее. Итак, нужно проверить, обрабатывалась ли страница ранее.
Или представьте себя на месте
Во всех этих примерах возникает одна проблема. Имеется очень большой набор данных.
Появляется новый объект, и вы хотите узнать, содержится ли он в существующем наборе. Эта задача быстро решается при помощи хеша. Например, представьте, что Google создает большой хеш, ключами которого являются все обработанные страницы.
Как узнать, обрабатывался ли сайт
У
Вот только этот хеш получится просто
Фильтры Блума
Для решения проблемы можно воспользоваться
• возможны ложно-положительные срабатывания. Фильтр скажет: «Этот сайт уже обрабатывался», хотя этого не было;
• ложно-отрицательные срабатывания исключены. Если фильтр утверждает, что сайт не обрабатывался, вы можете быть в этом уверены.
Фильтры Блума хороши тем, что занимают очень мало места. Хеш-таблице пришлось бы хранить все URL-адреса, обрабатываемые Google, а фильтру Блума это не нужно. Фильтры Блума очень удобны тогда, когда не нужно хранить точный ответ (как во всех приведенных примерах). Например,
HyperLogLog
Примерно так же действует другой алгоритм, который называется HyperLogLog. Предположим, Google хочет подсчитать количество
HyperLogLog аппроксимирует количество уникальных элементов в множестве. Как и фильтры Блума, он не дает точного ответа, но выдает достаточно близкий результат с использованием малой части памяти, которую обычно занимает такая задача.
Если вы используете большие объемы данных и вас устраивают приближенные ответы — воспользуйтесь вероятностными алгоритмами!
Алгоритмы SHA
Помните процедуру хеширования из главы 5? На всякий случай освежу вашу память: имеется ключ, вы хотите поместить связанное с ним значение в массив.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Элемент, в котором размещается значение, определяется хеш-функцией.
Значение сохраняется в соответствующей позиции массива.
Хеширование позволяет выполнять поиск с постоянным временем. Когда вам потребуется узнать значение, связанное с ключом, вы снова применяете хеш-функцию, и она за время
Хеш-функция должна обеспечивать достаточно равномерное распределение. Итак, хеш-функция получает строку и возвращает номер ячейки, соответствующий этой строке.
Сравнение файлов
Одну из разновидностей хеш-функций составляет алгоритм SHA (Secure Hash Algorithm). Он получает строку и возвращает хеш-код этой строки.
Возможно, терминология не настолько проста, насколько хотелось бы. Алгоритм SHA — хеш-функция; эта функция генерирует хеш-код, который представляет собой короткую строку. Хеш-функция для хеш-таблиц преобразует строку в индекс массива, тогда как SHA преобразует строку в другую строку.
Для каждой строки алгоритм SHA генерирует свой уникальный хеш-код.
примечание
Хеш-коды SHA достаточно длинные. Здесь приводится только начало.
Алгоритм SHA позволяет определить, совпадают ли два файла. Такая возможность особенно полезна для очень больших файлов. Допустим, у вас имеется 4-гигабайтный файл и вы хотите проверить, хранится ли у вашего друга точно такой же файл. Вам не придется пересылать большой файл по электронной почте; вместо этого можно вычислить хеш-коды SHA двух файлов и сравнить их.