Я ищу алгоритм для объединения двух отсортированных списков, , но им не хватает оператора сравнения между элементами одного списка и элементами другого. Результирующий объединенный список может быть не уникальным, но любой результат, который удовлетворяет относительному порядку сортировки каждого списка, будет выполнен. Точнее:Алгоритм объединения двух списков, не имеющих сравнения между ними
Дано:
- Списки A =
{a_1, ..., a_m}
, и B ={b_1, ..., b_n}
. (Они также могут считаться множествами). - Оператор Приоритет
<
определен среди элементов каждого списка таким образом, чтоa_i < a_{i+1}
иb_j < b_{j+1}
для1 <= i <= m
и1 <= j <= n
. - Оператор приоритета не определен между элементами A и B:
a_i < b_j
не определен для любых действительных иj
. - Оператор равенства
=
, определенный среди всех элементов A или B (он определяется между элементом из A и элементом из B). - Нет двух элементов из списка А не равны, и то же самое справедливо и для списка В.
Продукция: список С = {c_1, ..., c_r}
таким образом, что:
C = union(A, B)
; элементы С представляют собой объединение элементов из А и В.- Если
c_p = a_i
,c_q = a_j
иa_i < a_j
, затемc_p < c_q
. (Порядок элементов из подсписков из С соответствующих множеств А и В должны быть сохранены. - Там не существует никаких
i
иj
таким образом, чтоc_i = c_j
. (все дублирующие элементы между А и В, удаляются).
Я надеюсь, что этот вопрос имеет смысл, и что я не спрашиваю что-то либо очень очевидно, или что-то, для которого нет никакого решения
Контекст.
Построенное число может быть представлено точно в конечном числе квадратичных расширений в поле рациональных чисел (с использованием бинарного дерева высоты, равного числу расширений поля). Поэтому представление конструктивного числа должно «знать» поле, в котором оно представлено. Списки A и B представляют собой последовательные квадратичные расширения рациональных чисел. Элементы A и B сами по себе являются конструктивными числами, которые определены в контексте предыдущих меньших полей (отсюда и оператор приоритета).При добавлении/умножении конструктивных чисел квадратично расширенные поля должны быть сначала объединены, чтобы можно было выполнить двоичную арифметику ; результирующий список C является квадратично расширенным полем, которое может представлять числа, представляемые обоими полями A и B. (Если у кого-то есть лучшее представление о том, как программно работать с конструктивными числами, дайте мне знать. Вопрос о конструктивных номерах имеет arisen before , а также около interesting responses об их представлении.)
Прежде чем кто-нибудь спросит, нет, этот вопрос не относится к mathoverflow; они ненавидят алгоритм (и, как правило, неграмотный уровень математики).
На практике списки A и B являются связанными списками (фактически сохраненными в обратном порядке). Мне также нужно будет отслеживать, какие элементы C соответствуют тому, что в A и B, но это небольшая деталь. Алгоритм, который я ищу, не является операцией слияния в mergesort, , потому что оператор приоритета не определен между элементами объединенного списка. Все будет реализовано в C++ (я просто хочу перегрузить оператор). Это не домашнее задание, и в конечном итоге оно будет открытым, FWIW.
«# Оператор приоритета не определен между элементами A и B: a_i
@ Justin: Чувство приоритетности здесь больше связано с зависимостью; если a_i