包含来自给定集合的所有字符串的最佳字符串作为子字符串

我正在使用一些需要大(常量)位数组的代码.由于它包含大的常量跨度(全0或全1),我将其分解为两级表,允许重复跨度(常量或其他),如下所示:

bitn = table2[table1[n/256]+n%256/8]&1<<n%8

此时,table1的条目都是32(256位)的倍数,但我想知道通过允许table2中的跨距重叠可以实现显着的节省.所以我的问题是(以摘要形式陈述):

给定N个字符串{S_n:n = 1..N},每个长度为K,是否有一种有效的方法来找到最短长度的字符串S,使得每个S_n是S的子字符串?

(注意,因为我可能想让我的位数组保持8位对齐,所以我对该问题的特定应用可能会处理8位字节的字符串而不是字符串,但这个问题在任何字符意义上都有意义 – 位,字节或其他.)

最佳答案 首先,这个问题可以表述为TSP.我们有一组节点(每个字符串都是一个节点),我们需要找到访问所有节点的路径.字符串x和y之间的距离定义为len(xy)len(y)其中xy是具有x和y的最佳字符串,并且以x开头(例如,x = 000111,y = 011100,xy = 0001100,距离(x,y)= 8-6 = 2).

注意,这也服从三角不等式(距离(x,z)< =距离(x,y)距离(y,z)).距离是从1到k的整数.而且,距离是不对称的. 此版本的TSP称为(1,B)-ATSP.有关此类问题和近似解决方案的分析,请参见http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.20.3439.

点赞