Это вопрос интервью:
Есть 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 partition
1-битный файл в соответствии сsecondary leading-bit
и проверьте заданный номер рекурсивно; если 1-битный файлis full
, то данное число должно быть в файле, это займетO(logn)
время, правильно?