Мы начнем с примера.
У меня есть два списка:
segments = [16, 19, 22, 26]
labels = [horse, cow, mule]
Эти два списка имеют предпочтение (по порядку) некоторых элементов в другом списке, как показано в таблицах ниже. Обратите внимание, что сегмент может думать, что он должен иметь определенную метку, в то время как соответствующая метка не думает, что она должна иметь этот сегмент.
| Preferred Label | Preferred Segment
| (in order, L -> R) | (in order, L -> R)
---+------------------- ------+-------------------
16 | horse, cow, mule horse | 26, 19, 22, 16
19 | horse, mule cow | 16, 22, 19
22 | mule, cow, horse mule | 26, 22, 19
26 | mule
который может быть выражен в виде двух индексных списков:
// We have 4 segments, each have a ranked list (length 0-3) of preferred label
labelIndicesForSegments = [[0, 1, 2], [0, 2], [2, 1, 0], [2]]
// We have 3 labels, each have a ranked list (length 0-4) of preferred segment
segmentIndicesForLabels = [[3, 1, 2, 0], [0, 2, 1], [3, 2, 1]]
Теперь, как мне создать «оптимальное сопоставление 1 к 1» между сегментами и метками? То есть сегмент получает метку как можно левее в своей таблице, и наоборот. Алгоритм должен создавать пары, даже если сегмент и метка не имеют друг друга в списке предпочтений (однако этого следует избегать, насколько это возможно).
Я не знаю, что было бы лучшим ответом на пример выше. Некоторые ответы могут быть
1: [(16, horse), (19, mule), (22, cow)]
2: [(16, cow), (19, horse), (26, mule)]
3: [(19, horse), (22, cow), (26, mule)]
Но как мне выбрать, какой сегмент будет без соответствующей метки? И как мне вычислить, какой из них наиболее оптимален?
Как видите, практически все может варьироваться. Сегменты и метки не обязательно должны быть одинаковой длины, а список индексов не обязательно должен быть одинаковой длины. Хотя скорость алгоритма всегда имеет значение, могу сказать, что в этом случае я не буду работать с более чем 10-20 элементами ни в сегментах, ни в метках.
Моя проблема в том, что у меня нет точки входа, как решить эту проблему. Скорее всего, есть алгоритм для решения этой проблемы, но я не знаю его названия. Я также реализую это на Java, если вы хотите сделать конкретный пример без псевдокода;)