Помощь по программированию "Программирование жемчуга"

Я просто не могу понять, как это будет работать.

Вопрос:
Учитывая последовательный файл, содержащий не более четырех миллиардов 32-битных целых чисел в случайном порядке, найдите 32-разрядное целое число, которое не находится в файле (и должно быть хотя бы одно отсутствующее)

Ответ:
полезно просмотреть этот бинарный поиск в терминах 32 битов, которые представляют каждое целое число. В первом проходе алгоритма мы читаем (не более) четыре миллиарда целых чисел и записываем те, у которых ведущий нулевой бит в один последовательный файл, и те, у которых один ведущий один бит в другой файл.

Один из этих файлов содержит не более двух миллиардов целых чисел, поэтому мы будем использовать этот файл в качестве текущего ввода и повторить пробный процесс, но на этот раз второй бит.

Итак, разделив файл снова и снова (двоичный поиск), как это могло бы привести меня к отсутствующему 32-битовому целому?

Ответ 1

После каждого прохода ваш следующий проход будет на меньшем из двух списков, которые вы скомпилировали.

В какой-то момент вы ДОЛЖНЫ встречаться с пустым списком, и это определит ваш номер. Например, просто используйте 3-битные номера.

000
001
110
100
111

после первого прохода имеем

000
001

110
100
111

Затем мы рассмотрим 2-й бит в первом списке, потому что он меньше (или равен) второй. Мы разделили бы их на

000
001

empty list

Обратите внимание, что файл, начинающийся с 01, пуст, это означает, что нет чисел, начинающихся с 01, поэтому 010 и 011 отсутствуют.

Причина, по которой мы должны иметь недостающий список, состоит в том, что мы каждый раз выбираем меньший список для нашего следующего прохода.

Ответ 2

В конце концов, если вы продолжаете разделение, у вас будет (самое большее) 4 миллиарда файлов, каждый из которых имеет одно целое. Теоретически вы "знаете", чего не хватает, потому что для него не будет файла.

Возможно, вы также столкнетесь с ситуацией, когда у вас есть нечетное число целых чисел. В этом случае меньшая половина будет отсутствовать. Это облегчает работу с отсутствующим номером.

В случае, когда у вас есть четное число, вы знаете, что отсутствуют два. В этом случае вы должны найти части, которые меньше их соответствующих половин, а затем продолжить решение выше.