Это вопрос интервью:
Есть 1 миллиард номеров сотовых телефонов, которые имеют 11 цифр, они хранятся случайным образом в файле, для пример 12345678910, первая цифра должна быть 1. Пройдите через эти цифры, чтобы увидеть, есть ли один с дубликатом, просто посмотрите, существует ли дубликат, если дубликат найден, return True или return False. Разрешено использовать только 10 МБ памяти.
Вот мое решение:
Хэш всех этих чисел в 1000 файлов с помощью hash(num)%1000, тогда дубликаты должны попадать в один и тот же файл.
После хэширования я получил 1000 маленьких файлов, каждый из которых содержит 1 million numbers at most, правильно? Я не уверен в этом, я просто делаю это 1 billion / 1000 = 1 million.
Затем для каждого файла создайте хеш-таблицу для хранения каждого числа и flag, представляющих ее появление.
Полагаю, для представления числа 5 B будет 4 B для нижнего 8 digits и 1 B для верхнего 3 digits; и на самом деле 1 bit хватит flag, потому что мне просто нужно выяснить, существует ли дубликат, только сколько раз. Но как я могу применить флаг 1 bit к каждому номеру? Я споткнулся, поэтому я выбираю bool как флаг, 1 B.
Итак, каждый номер в хэш-таблице будет принимать 5B<for number> + 1B<for flag> + 4B<for the next-pointer> = 10B, тогда каждый файл примет 10M для хеш-таблицы.
Это мое глупое решение, пожалуйста, дайте мне лучшее.
Спасибо.
ПОСЛЕДУЮЩИЙ:
Если в этих 1 миллиардах телефонных номеров есть
no duplicates, данный один номер телефона, как узнать данныйis or is not inэти 1 миллиард номеров? Используйте как можно меньше памяти.
Я придумал 2 решения,
-
Номер телефона может быть представлен с использованием 5B, как я сказал выше, просмотром файла, чтением одного номера за раз и
xor the given number with the one read from the file, если результат0, тогда указанный номер находится в файла, это займет времяO(n), правильно? -
Partitionэти числа в2 small filesв соответствии сleading bit, что означает, что числа с aleading 1-bitидут в файл,leading 0-bitидут в другой файл, тем временем подсчитывают, сколько чисел в каждом файле, если указанное число попадает в 1-битный файл, а 1-битный файлcount-not full, затемagain partition1-битный файл в соответствии сsecondary leading-bitи проверьте заданный номер рекурсивно; если 1-битный файлis full, то данное число должно быть в файле, это займетO(logn)время, правильно?