2010-10-28 2 views
7

Можно создать дубликат:
Quickest way to find missing number in an array of numbersХитрый алгоритм вопрос

Входной сигнал: несортированная массив А [1, .., N], который содержит все, кроме одного из целых чисел в диапазоне от 0, .., n

Проблема заключается в том, чтобы определить недостающее целое число в O (n) времени. Каждый элемент A равен , представленному в двоичном формате, и единственной доступной операцией является бит функции (i, j), который возвращает значение j-го бита A [i] и принимает постоянное время.

Любые идеи? Я думаю, что какой-то алгоритм разделения и покоя был бы правильным, но я не могу придумать, что именно я должен делать. Заранее спасибо!

+5

п (п + 1)/2 - sum;) – AraK

+0

Если бит (i, j) является единственной доступной операцией, как вы предлагаете реализовать алгоритм разделения и покоя? –

+0

@A. Рекс: возможный обман, который вы связали, не имеет такого же ограничения по инструкциям, поэтому я не думаю, что это обязательно обман. –

ответ

9

Это математическое свойство, что сумма чисел между 1 и n где n является n(n+1)/2. Вы можете увидеть это 10:

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 
= (1+10) + (2+9) + (3+8) +(4+7) + (5+6) 
= 11 + 11 + 11 + 11 + 11 
= 55 

Так, расширением, это сумма чисел от 0 через n, так как вы просто добавить 0 к нему. Итак, что вы делаете, это добавить все числа и сохранить счет, а затем использовать эту формулу для определения недостающего.

Так, что-то вроде:

count = 0 
sum = 0 
foreach num in list: 
    sum = sum + num 
    count = count + 1 
missing = count * (count+1)/2 - sum 

Получение номера с bit(i,j) сложно, поэтому вам придется извлечь биты по отдельности и превратить их в реальные цифры для суммирования.

+0

Это считывает все n log n бит A, поэтому требуется n log n time. –

+1

@Reid: нет, это вообще не n log n. Вы не можете использовать n для числа бит _and_ числа целых чисел. Число битов в целых числах является _constant_, поэтому оно эффективно «O (32n)» (для 32-разрядного номера), которое точно совпадает с «O (n)». – paxdiablo

+0

Я уверен, что когда OP пишет «integer», они означают «integer», а не «integer less than 2^32». В противном случае существует только конечное число возможных входов, поэтому не имеет смысла говорить об асимптотической среде исполнения вообще. Очевидно, что длина фактического математического целого в битах не является постоянной. –

0

Это вопрос трюка, так как использование битового метода потребовало бы всего цикла каждого бита для каждого числа, что означает, что он автоматически станет O (n * j), где j - количество бит, представляющих n.

Я думаю, что paxdiablo получил его, предполагая, что вам разрешено решение, которое не использует бит-метод.

+3

Нейл, который по-прежнему будет технически «O (n)», поскольку 'j' является константой. – paxdiablo

+0

j постоянна на практике, потому что длина целого или длинного всегда одна и та же, однако значащие цифры j приращений на единицу с n * 2, где n> 0. Более похоже на O (log n). – Neil

6

Вы можете использовать оператор XOR быстрее, чем добавление. Поскольку у вас есть доступ к каждому биту, вы будете делать побитовое XOR здесь. принцип будет использоваться здесь (А исключающее ИЛИ В XOR A) = В

например: (1 XOR 2 ИСКЛЮЧАЮЩЕЕ 3) исключающее ИЛИ (1 XOR 2) = 3

for i=0 to n 
{ 
Total=Total XOR i 
} 

foreach element in A 
{ 
Total=Total XOR element 
} 
+0

На самом деле, это довольно изящно, +1. Вы не можете быть _sure_, что XOR будет быстрее, чем добавление, но он является опрятной модификацией для двух или более одного (например, «91 91 82 82 73 64 64 55 55»), который использует XOR найти синглтон. – paxdiablo

+1

Xor никогда не будет медленнее, чем дополнение ... Зачем: Кроме того, есть бит переноса, который требует полного сумматора, добавляя один шаг ... Он устраняется с использованием параллельных сумматоров в современной архитектуре, который имеет почти такую ​​же производительность (xor использует 1 литр на этой операции) – Mulki

+0

Существует формула O (1) для XOR от 1 до n. http://stackoverflow.com/questions/3932346/direct-formula-for-summing-xor. XOR также избегает проблем с переполнением. –

Смежные вопросы