python – 需要帮助一个单词打包算法 - 代码日志

python – 需要帮助一个单词打包算法

我有一个字母子列表,每个子列表中的字母数可以有所不同。列表和子列表被排序。该结构可用于通过选择数字X来产生单词,从每个子列表中的位置X中取出一个字母并按顺序连接。如果数字X大于子列表的长度,它将会包围。

给定一组单词,我需要找到一种将它们打包成这种最小可能的结构(即具有最短子列表)的方法。当然,最长的单词中的字母数量必须与子列表一样多,并且较短的单词将被空格/空格填充。

我不是CS毕业生,所以如果问题的描述不完全清楚,我很抱歉。给出一个简单的例子:假设我有”””””””””””””””’我需要包装,我可以使用以下结构:

[  
    [ '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位,则通过将索引10%3(= 1)和第一个子列表中的字母连接在一起,生成索引为10%4(= 2)的字母。第二个子列表。

到目前为止,我最好的尝试是使用汉明距离矩阵首先放置最“连接”的单词,然后是最接近的邻居,目的是最小化每一次插入的变化。这是一个完全直观的尝试,我觉得有必要更好/更智能地解决这个问题。

澄清

这是一个我试图解决的实际问题,约束(大致)如下:
每个子列表的字符数应在100以下的范围内。
键空间应尽可能小(即杂散字的数量应该是最小的)。大致来说,数百万个选项的关键领域是边界。

我不知道这是一个很好的解决方案。使用我现在的算法,例如,我可以在150万个选项的关键字空间中插入大约200个字(只是随机的英文单词)。我想做的更好。

那么你说你对次优解决方案感兴趣,所以我给你一个。它取决于字母大小。例如,对于26个数组大小将小于100(不管要编码的单词的数量)。

众所周知,如果您有两个不同的素数a和b以及非负整数k和l(k 例如,对于(a = 7,a = 13,k = 6,l = 3),您可以取n = 7 * 13 7 * 3 13 * 6. n%7 == 6和n%13 == 3

同样适用于任意数量的整数。

您可以初始化这样的数组。

['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 29
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 31
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 37
['a', 'b', 'c', ... 'z', 'z', 'z', 'z', ...]   # array size = 41
...

现在,假设你的话是“极客”。对于它,你需要X号,所以X%29 == 6,X%31 == 4,X%37 == 4,X%41 == 10.你可以随时找到这样的X,如上图所示。

所以,如果你有26个字母的字母,你可以创建宽度为149的矩阵(参见素数列表),并用它编码任何单词。

http://stackoverflow.com/questions/3498275/need-help-with-a-word-packing-algorithm

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – 需要帮助一个单词打包算法