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.
- Cómo generar una clave privada en el algoritmo RSA
- ¿Cómo podría seleccionar aleatoriamente los bordes en un gráfico para conectar cada nodo [C]?
- Dado un gráfico no dirigido y dos conjuntos de nodos, ¿cuál es el mejor algoritmo para verificar que cada elemento del primer conjunto sea adyacente a cada elemento del segundo conjunto?
- ¿Cuáles son las ventajas de usar la notación (0,1) en el sistema binario?
- ¿Qué pasos debo seguir para comenzar el desarrollo de software? Tengo poco conocimiento de C / C ++ / C # y algoritmos y estructuras de datos.
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.