Esta es una pregunta de la entrevista que enfrenté recientemente.Cómo particionar los bits en una matriz de bits con un tiempo inferior al lineal
Dado un conjunto de 1 y 0, encontrar una manera de dividir los bits in place
de manera que 0 de se agrupan, y 1'S están agrupados juntos. No importa si los 1 están por delante de los 0 o los 0 están por delante de los 1.
Una entrada ejemplo es 101010101
, y la salida es o bien 111110000
o 000011111
.
Resuelve el problema en menos de tiempo lineal.
Simplifique el problema. La entrada es una matriz entera, con cada elemento ya sea 1 o 0. La salida es la misma matriz entera con enteros bien particionados.
Para mí, esta es una pregunta fácil si se puede resolver de O (N). Mi enfoque es usar dos punteros, comenzando desde ambos extremos de la matriz. Aumenta y disminuye cada puntero; si no apunta al entero correcto, intercambia los dos.
int * start = array; int * end = array + length - 1; while (start < end) { // Assume 0 always at the end if (*end == 0) { --end; continue; } // Assume 1 always at the beginning if (*start == 1) { ++start; continue; } swap(*start, *end); }
Sin embargo, la entrevista insiste en que hay una solución sub-lineal. Esto me hace pensar mucho pero aún no obtener una respuesta.
¿Alguien puede ayudar en esta pregunta de la entrevista?
ACTUALIZACIÓN: Al ver las respuestas en SO que indican que el problema no se puede resolver en tiempo sub-lineal, puedo confirmar mi idea original de que no puede haber una solución de sub-lineal.
¿Es posible que el entrevistador juegue un truco?
Es posible que el entrevistador quiere aquí algo en la línea de "no puedo conocer todos los bits se dividen sin mirar a cada bit de una vez, por lo tanto, que es lineal." Un razonamiento para tu respuesta. Para aclarar, aunque mi respuesta solo "mira" los bits establecidos, realmente comprueba todos los bits cuando se compara con 0. – GManNickG
"¿Es posible que el entrevistador haga un truco?" - Tal vez fue una prueba para ver cómo manejaste la administración haciendo comentarios estúpidos :-) – paxdiablo
El entrevistador dijo "no importa si 1's están por delante de 0's o 0's están por delante de 1's". ¿Puede este hecho tener algún efecto inesperado en el algoritmo (la intuición dice que no, aún tienes que visitar cada elemento)? –