У меня есть список подписок для букв, где количество букв в каждом под-списке может меняться. Список и под-списки упорядочены. Эта структура может использоваться для создания слов, выбирая число X, беря букву из позиции X в каждом под-списке и конкатенируя их по порядку. Если число X больше длины суб-списка, оно будет обернуто.
Учитывая набор слов, мне нужно найти способ упаковать их в наименьшую возможную структуру такого типа (т.е. с самыми короткими подписями). Разумеется, должно быть так много подписок, как число букв в самом длинном слове, а более короткие слова будут заполнены пробелами/пробелами.
Я не выпускник CS, поэтому прошу прощения, если описание проблемы не совсем ясно. Чтобы дать простой пример: предположим, что у меня есть слова [ 'a ', 'an', 'if', 'is', 'in', 'on', 'of', 'i ']
Мне нужно упаковать, я мог бы использовать следующую структуру:
[
[ 'i', 'o', 'a' ],
[ 's', 'n', 'f', ' ' ]
]
Это позволило бы мне написать следующие слова:
0: is
1: on
2: af*
3: i
4: os*
5: an
6: if
7: o *
8: as*
9: in
10: of
11: a
Если вы занимаете позицию 10, например, слово "of" генерируется путем объединения буквы в индексе 10% 3 (= 1) из первого под-списка, с буквой в индексе 10% 4 (= 2 ) из второго под-списка.
Моя лучшая попытка до сих пор заключается в использовании матрицы расстояний для помех, чтобы сначала помещать наиболее "связанные" слова, а затем их ближайших соседей с целью минимизации изменений при каждой вставке. Это была совершенно интуитивная попытка, и я чувствую, что должен быть лучший/более умный способ решить эту проблему.
Разъяснение
Это практическая проблема, которую я пытаюсь решить, и ограничения (примерно) следующие:
1. Количество символов для каждого под-списка должно быть в пределах 100 или менее.
2. Ключевое пространство должно быть как можно меньше (т.е. Количество ложных слов должно быть минимальным). Грубо говоря, пространство ключей в миллионах вариантов является пограничным.
Я не знаю, что для этого возможно хорошее решение. С алгоритмом, который я имею прямо сейчас, например, я могу вставить около 200 слов (просто случайные английские слова) в ключевом пространстве с 1,5 миллионами опций. Я бы хотел сделать лучше.