← Назад к вопросам
Отсутствующее число в файле
2.0 Middle🔥 161 комментариев
#Теория тестирования
Условие
У вас есть файл с 4 миллиардами 32-битных целых чисел. Как найти число, которое отсутствует в файле? У вас ограничено количество оперативной памяти.
Вопрос
Опишите алгоритм решения с учетом ограничений памяти.
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Анализ проблемы
Это классическая задача интервью на понимание ограничений памяти и оптимизации:
Дано:
- 4 миллиарда 32-битных целых чисел в файле
- Диапазон 0 до 2^32-1 (около 4.3 млрд значений)
- Одного числа не хватает
- Ограничена оперативная память
Решение 1: Побитовое XOR
def findMissing(filename):
result = 0
# XOR всех чисел 0..2^32-1
for i in range(2**32):
result ^= i
# XOR с числами в файле
with open(filename, 'rb') as f:
while True:
chunk = f.read(4)
if not chunk:
break
num = int.from_bytes(chunk, byteorder='little')
result ^= num
return result
Почему работает: a ^ a = 0, поэтому парные элементы исчезают, остаётся непарный.
Решение 2: Математическая сумма
def findMissing(filename):
n = 2**32 - 1
expected = n * (n + 1) // 2
actual = 0
with open(filename, 'rb') as f:
while True:
chunk = f.read(4)
if not chunk:
break
num = int.from_bytes(chunk, byteorder='little')
actual += num
return expected - actual
Решение 3: Битовый массив
def findMissing(filename, memory_mb=512):
bits = bytearray((2**32 + 7) // 8)
with open(filename, 'rb') as f:
while True:
chunk = f.read(4)
if not chunk:
break
num = int.from_bytes(chunk, byteorder='little')
bits[num // 8] |= (1 << (num % 8))
for i in range(2**32):
if not (bits[i // 8] & (1 << (i % 8))):
return i
return -1
Решение 4: Двухпроходный алгоритм
Если памяти совсем мало, разбиваем на части и обрабатываем каждую отдельно.
Сравнение
| Подход | Память | Время | Сложность |
|---|---|---|---|
| XOR | O(1) | O(n) | Просто |
| Сумма | O(1) | O(n) | Очень просто |
| Битовый массив | O(n/8) | O(n) | Средне |
| Двухпроходный | O(1) | O(n) | Сложно |
Рекомендация
На собеседовании:
- Обсудите ограничения - почему стандартные подходы не работают
- Предложите XOR решение - O(1) памяти, O(n) времени
- Объясните почему работает XOR
- Предложите альтернативы с trade-offs
- Обсудите тестирование на больших данных