2010-10-28 18 views
7

Duplicar posibles:
Quickest way to find missing number in an array of numberspregunta algoritmo Tricky

de entrada: array sin clasificar A [1, .., n], que contiene todos menos uno de los números enteros en el rango de 0, .., n

El problema es determinar el entero faltante en el tiempo O (n). Cada elemento de A es representado en binario, y la única operación disponible es el bit de función (i, j), que devuelve el valor del j-ésimo bit de A [i] y toma un tiempo constante.

¿Alguna idea? Creo que algún tipo de algoritmo de dividir y vencer sería apropiado, pero no puedo pensar qué debería hacer exactamente. ¡Gracias por adelantado!

+5

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

+0

Si el bit (i, j) es la ÚNICA operación disponible, ¿cómo propone implementar un algoritmo de dividir y conquistar? –

+0

@A. Rex: el posible imbécil que vinculaste no tiene la misma restricción en las instrucciones, así que no creo que sea necesariamente una tontería. –

Respuesta

9

Es una propiedad matemática de que la suma de los números entre 1 y n donde n es n(n+1)/2. Esto se puede ver por 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 

Así, por extensión, es la suma de los números 0-n ya que apenas está añadiendo 0 a él. Entonces, lo que debes hacer es sumar todos los números y mantener un conteo, luego usa esa fórmula para descubrir el que falta.

Por lo tanto, algo así como:

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

Conseguir el número con bit(i,j) es complicado por lo que tendrá que extraer los bits de forma individual y convertirlas en números reales para sumar.

+0

Esto lee todos los n log n bits de A, por lo que toma n log n time. –

+1

@Reid: no, no es n log n en absoluto. No puede usar n para el número de bits _y_ la cantidad de enteros. El número de bits en un entero es _constant_ por lo que es efectivamente 'O (32n)' (para un número de 32 bits) que es exactamente lo mismo que 'O (n)'. – paxdiablo

+0

Estoy bastante seguro de que cuando el OP escribe "entero", significa "entero", no "entero menor que 2^32". De lo contrario, solo hay un número finito de entradas posibles, por lo que no tiene sentido hablar de tiempo de ejecución asintótico. Obviamente, la longitud de un entero matemático real en bits no es constante. –

0

Es una pregunta trampa, ya que usar el método de bit solo requeriría que ciclo cada bit para cada número, lo que significa que automáticamente se convertiría en O (n * j) donde j es el número de bits que representa n.

Creo que paxdiablo lo tiene, suponiendo que se te permite una solución que no utiliza el método de bits.

+3

Neil, eso todavía sería técnicamente 'O (n)' ya que 'j' es una constante. – paxdiablo

+0

j es constante en la práctica porque la longitud de un número entero o largo es siempre el mismo, sin embargo los dígitos significativos de incrementos j por uno con n * 2 donde n> 0. Más como O (log n). – Neil

6

Puede utilizar el operador XOR porque es más rápido que la suma. Como tienes acceso a cada bit, estarás haciendo un XOR bit a bit aquí. El principio para ser utilizado aquí es (A XOR B XOR A) = B

por ejemplo: (1 XOR 2 XOR 3) XOR (1 XOR 2) = 3

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

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

En realidad, eso es bastante ingenioso, +1. No puede estar seguro de que XOR sea más rápido que la suma, pero es una modificación clara de la variación de dos de la mayoría (por ejemplo, '91 91 82 82 73 64 64 55 55') que usa XOR para encontrar el singleton. – paxdiablo

+1

Xor nunca será más lenta que la adición ... qué: Además hay un poco de arrastre que requiere un sumador completo la adición de un paso ... Se elimina el uso de sumadores paralelos en la arquitectura moderna, que tiene casi el mismo rendimiento (usos xor 1 puerta menos en esta operación) – Mulki

+0

Hay una fórmula O (1) para XOR de 1 an. http://stackoverflow.com/questions/3932346/direct-formula-for-summing-xor. XOR también evita problemas de desbordamiento. –