Я сформулирую проблему в точной форме, которую я хочу ниже:
С учетом :
Два списка с плавающей запятой N
и D
одинаковой длины k
(k
кратно 2).
Известно, что для всех i=0,...,k-1
существует j != i
такое, что D[j]*D[i] == N[i]*N[j]
. (Я использую индексацию с нуля)
Возвращение :
(Длина k/2
) список пар (i,j)
такой, что D[j]*D[i] == N[i]*N[j]
.
Возвращаемые пары могут быть не уникальными (допустим любой допустимый список пар)
Применение этого алгоритма заключается в нахождении обратных пар собственных значений обобщенной задачи о собственных значениях палиндромов.
Условие равенства эквивалентно N[i]/D[i] == D[j]/N[j]
, но также работает, когда знаменатели равны нулю (что является определенной возможностью). Вырождения в задаче на собственные значения приводят к тому, что пары не являются уникальными.
В более общем смысле алгоритм эквивалентен:
С учетом :
Список X
длиной k
(k
кратен 2).
Известно, что для всех i=0,...,k-1
существует j != i
, такое, что IsMatch(X[i],X[j])
возвращает true, где IsMatch
- логическая функция сопоставления, которая гарантированно возвращает true по крайней мере для одного j != i
для всех i
. .
Возвращение :
(Длина k/2
) список пар (i,j)
такой, что IsMatch(i,j) == true
для всех пар в списке.
Возвращаемые пары могут не быть уникальными (допустим любой допустимый список пар)
Очевидно, моя первая проблема может быть сформулирована в терминах второй с IsMatch(u,v) := { (u - 1/v) == 0 }
. Теперь из-за ограничений точности с плавающей точкой никогда не будет точного равенства, поэтому я хочу решение, которое минимизирует ошибку соответствия. Другими словами, предположим, что IsMatch(u,v)
возвращает значение u - 1/v
, и я хочу, чтобы алгоритм возвращал список, для которого IsMatch возвращает минимальный набор ошибок. Это комбинаторная задача оптимизации. Я думал, что смогу сначала наивно вычислить ошибку совпадения между всеми возможными парами индексов i
и j
, но затем мне нужно будет выбрать набор минимальных ошибок, и я не знаю, как я это сделаю.
Разъяснение
Функция IsMatch
является рефлексивной (IsMatch(a,b)
подразумевает IsMatch(b,a)
), но не транзитивной. Это, однако, 3-транзитивный: IsMatch(a,b) && IsMatch(b,c) && IsMatch(c,d)
подразумевает IsMatch(a,d)
.
Добавление
Эта проблема, по-видимому, идентична проблеме идеального соответствия минимального веса в теории графов. Однако в моем случае я знаю, что должно быть «хорошее» идеальное соответствие, поэтому распределение весов ребер не является полностью случайным. Я чувствую, что эту информацию нужно как-то использовать. Теперь вопрос в том, есть ли хорошая реализация проблемы соответствия минимального веса, которая использует мои предыдущие знания, чтобы найти решение на ранних этапах поиска. Я также открыт для указаний на простую реализацию любого такого алгоритма.