Estoy buscando un algoritmo para unir dos listas ordenadas, pero les falta un operador de comparación entre los elementos de una lista y los elementos de la otra. La lista combinada resultante puede no ser única, pero cualquier resultado que satisfaga el orden de clasificación relativo de cada lista servirá. Más precisamente:Algoritmo para fusionar dos listas que carecen de comparación entre ellas
Dado:
- Listas A =
{a_1, ..., a_m}
, y B ={b_1, ..., b_n}
. (También pueden considerarse conjuntos). - Un operador de precedencia
<
definido entre los elementos de cada lista de tal manera quea_i < a_{i+1}
, yb_j < b_{j+1}
para1 <= i <= m
y1 <= j <= n
. - El operador de precedencia no está definido entre los elementos de A y B:
a_i < b_j
no está definido para ningúni
válido yj
. - Un operador de igualdad
=
definido entre todos los elementos de A o B (se define entre un elemento de A y un elemento de B). - No hay dos elementos de la lista A son iguales, y lo mismo vale para la lista B.
Produce: Una lista C = {c_1, ..., c_r}
tal que:
C = union(A, B)
; los elementos de C son la unión de elementos de A y B.- Si
c_p = a_i
,c_q = a_j
ya_i < a_j
, entoncesc_p < c_q
. (El orden de los elementos de las sublistas de C correspondientes a los conjuntos A y B debe ser preservada. - no existen
i
yj
tal quec_i = c_j
. (todos los elementos duplicados entre A y B se eliminan).
espero que esta pregunta tiene sentido y que no estoy pidiendo algo, ya sea terriblemente obvio, o algo para lo que no existe una solución
Contexto:.
Un número realizable se puede representar exactamente en finitas muchas extensiones cuadráticas en el campo de números racionales (utilizando un árbol binario de altura igual al número de extensiones de campo). Por lo tanto, una representación de un número que se puede construir debe "conocer" el campo en el que se representa. Las listas A y B representan sucesiones cuadráticas sucesivas de los números racionales. Los elementos de A y B en sí mismos son números que se pueden construir, que se definen en el contexto de campos más pequeños anteriores (de ahí el operador de precedencia).Al agregar/multiplicar números que se pueden construir, , los campos extendidos cuadráticamente deben fusionarse primero para que se puedan realizar las operaciones aritméticas binarias ; la lista resultante C es el campo cuadráticamente extendido que puede representar números representables por ambos campos A y B. (Si alguien tiene una mejor idea de cómo trabajar programáticamente con números que se pueden construir, hágamelo saber. Una pregunta sobre números constructivos tiene arisen before , y también aquí hay algunos interesting responses sobre su representación.)
Antes de que nadie pregunte, no, esta pregunta no pertenece a mathoverflow; odian las preguntas de algoritmo (y generalmente no de nivel de postgrado).
En la práctica, las listas A y B son listas vinculadas (en realidad, almacenadas en orden inverso). También necesitaré hacer un seguimiento de los elementos de C que corresponden a A y B, pero ese es un detalle menor. El algoritmo que busco no es la operación de combinación en mergesort, porque el operador de precedencia no está definido entre los elementos de las dos listas que se fusionan. Todo finalmente se implementará en C++ (solo quiero que el operador se sobrecargue). Esto no es tarea, y eventualmente será de fuente abierta, FWIW.
"# El operador de precedencia no está definido entre los elementos de A y B: a_i
@Justin: El sentido de prioridad aquí es más de uno de dependencia; si a_i