Мы получаем поток из попарно различных чисел из множества .
Как я могу определить пропущенное число с помощью алгоритма, который читает поток один раз и использует память только бит?
источник
Мы получаем поток из попарно различных чисел из множества .
Как я могу определить пропущенное число с помощью алгоритма, который читает поток один раз и использует память только бит?
Вы знаете , и потому чтоS=n(n+1) может быть закодирована вO(журнал(п))биты это может быть сделано вO(журналN)памяти и в одном пути (просто найтиS-сутгентСум, это отсутствует число).
Но эту проблему можно решить в общем случае (для константы ): у нас есть k пропущенных чисел, выяснить их все. В этом случае вместо того, чтобы вычислять просто сумму y i , вычислите сумму j-й степени x i для всех 1 ≤ j ≤ k (я предположил, что x i - это пропущенные числа, а y i - входные числа):
Помните , что вы можете вычислить просто, потому что S 1 = S - Е у я , S 2 = Σ я 2 - Σ у 2 я , ...
Теперь, чтобы найти пропущенные числа, вы должны решить чтобы найти все x i .
Вы можете вычислить:
, P 2 = ∑ x i ⋅ x j , ..., P k = ∏ x i ( 2 ) .
Для этого помните, что , P 2 = S 2 1 - S 2 , ...
Но - это коэффициенты P = ( x - x 1 ) ⋅ ( x - x 2 ) ⋯ ( x - x k ), но P можно учесть однозначно, поэтому вы можете найти пропущенные числа.
Это не мои мысли; прочитайте это .
Из комментария выше:
Перед обработкой потока, выделение бит, в котором вы пишете х : = ⨁ п я = 1 б я п ( я ) ( б я п ( я ) является двоичным представлением I и ⊕ точечен исключающим или). Наивно, это занимает O ( N ) время.⌈log2n⌉ x:=⨁ni=1bin(i) bin(i) i ⊕ O (n)
После обработки потока, всякий раз , когда один считывает число , вычислить х : = х ⊕ б я п ( J ) . Пусть к будет одно число из { 1 , . , , n } это не входит в поток. Прочитав весь поток, мы имеем x = ( n ⨁ i = 1 b i n ( i ) ) ⊕ ( ⨁ i ≠ k bJ x : = x ⊕ b i n ( j ) К { 1 , . , , n }
получением желаемого результата.
Следовательно, мы использовали пространство и имели общее время выполнения O ( n ) .O(logn) O(n)
источник
value
Для тех, кто хочет псевдокод, используя простойскладка операция с эксклюзивом или (⊕ ):
Волнообразное доказательство: A⊕ никогда не требует большего количества бит, чем его вход, поэтому из вышесказанного не требуется, чтобы промежуточный результат, описанный выше, требовал больше, чем максимальные биты ввода (поэтому O ( журнал2н ) биты). ⊕ коммутативен, и x ⊕ x = 0 таким образом, если вы расширите вышеприведенное и объедините все данные, присутствующие в потоке, у вас останется только одно несоответствующее значение, отсутствующее число.
источник