¿Cuál es la mejor manera de reorganizar los datos en la lista para que dos elementos similares no estén uno al lado del otro?

Su escenario del “mundo real” describe una cola prioritaria. Mantenga sus pedidos en una cola, luego, si sirvió a un cliente y tiene otros pedidos en la cola, empuje todos hacia atrás, ya sea por una cantidad establecida o hasta el final.

Si mantiene los pedidos de la lista de Me gusta para cada cliente, y otra lista vinculada de todos los pedidos (como en, 2 punteros “siguientes” por pedido), puede hacer esto todo en tiempo lineal con respecto al número de pedidos por cliente.

El código es un poco retorcido ya que tiene que eliminar con mucho cuidado cada orden relevante de su lugar para poder moverlo.

Una alternativa es utilizar un montón binomial de pedidos, donde cada pedido tiene almacenado su índice en el montón. Esto es necesario para poder cambiar la prioridad de una orden arbitraria y moverla al montón. También mantenga una lista vinculada de todos los pedidos de un solo cliente para acceder a ellos rápidamente. Esto se ejecuta en [math] O (k * log_2 (n)) [/ math] donde [math] k [/ math] es el número de pedidos para el cliente y [math] n [/ math] es el número total de pedidos.

También se me ocurrió que esto es análogo a un inverso del algoritmo de desalojo de caché utilizado menos recientemente. Dado que los cachés son pequeños y necesitan, a veces, mantener diferentes rangos de datos, existen varias técnicas para encontrar la mejor línea de caché para desalojar. Puede adaptar dicho algoritmo a su problema de colas tomando lo que sería el cliente utilizado menos recientemente como la orden para servir a continuación, pero haciendo que todas sus órdenes se conviertan en “las más utilizadas actualmente”. De esta manera, solo serán atendidos cuando sus pedidos sean los últimos en la cola.

Perdón por divagar. Comencé con un código, pero se volvió bastante retorcido y no me molesté en depurarlo.

Aquí hay una solución simple “ingenua” en Python.

#!/usr/bin/env python def fair_queue_simple(queue): new_queue = [] while queue: inq = [] not_inq = [] for q in queue: if q in inq: not_inq.append(q) else: inq.append(q) new_queue.extend(inq) queue = not_inq return new_queue if __name__ == '__main__': assert(fair_queue_simple([3,2,1,8,0,9]) == [3,2,1,8,0,9]) assert(fair_queue_simple([9,3,3,3,6,6]) == [9,3,6,3,6,3]) assert(fair_queue_simple([8,8,8,8,8,2]) == [8,2,8,8,8,8]) assert(fair_queue_simple([7,3,3,2,2,2]) == [7,3,2,3,2,2]) 

El peor de los casos ocurre cuando la lista tiene todos los valores idénticos [3,3,3,3,3,3]. Puede mejorar el algoritmo manteniendo un recuento de cada elemento y luego insertándolo en la “subcola” apropiada.

 #!/usr/bin/env python def fair_queue(queue): new_queue = [] sub_queues = {} element_count = {} for q in queue: count = element_count.get(q, 0) + 1 element_count[q] = count sub_queues.setdefault(count, []).append(q) for i in range(1,len(sub_queues)+1): new_queue.extend(sub_queues[i]) return new_queue if __name__ == '__main__': assert(fair_queue([3,2,1,8,0,9]) == [3,2,1,8,0,9]) assert(fair_queue([9,3,3,3,6,6]) == [9,3,6,3,6,3]) assert(fair_queue([8,8,8,8,8,2]) == [8,2,8,8,8,8]) assert(fair_queue([7,3,3,2,2,2]) == [7,3,2,3,2,2]) 

Usar tablas hash: hash estos valores en cubos. Luego, itere a través de los cubos y saque un valor de cada cubo hasta que todos estén vacíos.

More Interesting

Dos jugadores juegan el siguiente juego: hay N piedras en la mesa, el jugador puede tomar 1 o 2 piedras (si N mod 3 = 0), 1 o 3 (si N mod 3 = 1) y 1, 2 o 3 ( si N mod 3 = 2). ¿Cómo determino al ganador en el juego?

Teoría de conjuntos: ¿un subconjunto es un tipo de intersección?

¿Funciona la siguiente implementación para encontrar la subcadena común más larga dentro de dos cadenas?

Mis ubicaciones están por venir, así que he estado implementando estructuras de datos y algoritmos en Python, pero llegué a saber que muchas empresas no tienen Python instalado en sus estaciones de trabajo. ¿Es verdad? Y si es así, ¿estaría bien cambiar de Python a Java, que no recuerdo mucho?

¿Es posible crear dos manos robóticas independientes?

¿Ha cambiado recientemente el algoritmo de Quora?

¿Cuáles son algunos diseños de clase mínima para el diseño de elevadores para la construcción de m pisos?

¿Cuál es una explicación simple del algoritmo del modelo oculto de Markov?

¿Cuál es el mejor algoritmo de sustracción automática de fondo para una sola imagen?

Un problema importante con los algoritmos de programación prioritarios es el bloqueo indefinido o la inanición. ¿Puede explicar el concepto de inanición y cómo a menudo se resuelve en la programación de prioridades?

Cómo definir una función para encontrar el producto de dígitos en Python usando recursividad

¿Es posible desarrollar un algoritmo que pueda hacer predicciones perfectas en el mercado de valores?

Cómo resolver http://www.spoj.com/problems/TRAFFICN/ de spoj

Cómo diseñar una estructura de datos que pueda almacenar 1-1000 números

¿Qué consejo le da Ashish Kedia al estudiante de ingeniería de software de último año que no es un buen programador para convertirse en un gran ingeniero? Aprobé las asignaturas, pero no tomé ninguna clase de algo, y mis habilidades para resolver problemas son bajas.