我有一个由字母子列表组成的列表,每个子列表中的字母数量可能不同。该列表和子列表都是有序的。可以使用此结构通过选择数字X,在每个子列表中的位置X取一个字母,并按顺序连接它们来生成单词。如果数字X大于子列表的长度,则会循环回到开头。
给定一组单词,我需要找到一种方式将它们打包成此类最小可能的结构(即具有最短的子列表)。当然,必须有与最长单词中的字母数相同的子列表,并且较短的单词将用空格填充。
如果描述问题不是非常清楚,我不是计算机科学专业毕业生,敬请谅解。为了举一个简单的例子:假设我需要打包下面这些单词
到目前为止,我最好的尝试涉及使用汉明距离矩阵来首先放置最“连接”的单词,然后是它们最近的邻居,以达到在每次插入时最小化更改的目标。这是一次完全直觉的尝试,我觉得肯定有更好/更智能的方法来解决这个问题。
澄清: 这是我正在尝试解决的实际问题,约束条件如下: 1. 每个子列表的字符数应该在100或更少的范围内。 2. 键空间应尽可能小(即,误导性单词的数量应最少)。大约以百万级别的键空间是边缘的。
我不知道是否可能有一个好的解决方案。例如,对于我现在拥有的算法,我可以在150万个选项的键空间中插入大约200个单词(只是随机的英文单词)。我想做得比那更好。
给定一组单词,我需要找到一种方式将它们打包成此类最小可能的结构(即具有最短的子列表)。当然,必须有与最长单词中的字母数相同的子列表,并且较短的单词将用空格填充。
如果描述问题不是非常清楚,我不是计算机科学专业毕业生,敬请谅解。为了举一个简单的例子:假设我需要打包下面这些单词
[ '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. 键空间应尽可能小(即,误导性单词的数量应最少)。大约以百万级别的键空间是边缘的。
我不知道是否可能有一个好的解决方案。例如,对于我现在拥有的算法,我可以在150万个选项的键空间中插入大约200个单词(只是随机的英文单词)。我想做得比那更好。