【发布时间】:2012-05-04 09:14:35
【问题描述】:
我正在处理一些需要大型(恒定)位数组的代码。由于它包含较大的常量跨度(全为 0 或全为 1),因此我将其分解为一个允许省略重复跨度(常量或其他)的两级表,如下所示:
bitn = table2[table1[n/256]+n%256/8]&1<<n%8
此时,table1 的条目都是 32 的倍数(256 位),但我想知道是否可以通过允许 table2 中的跨度重叠来实现显着节省。所以我的问题是(以抽象形式陈述):
给定 N 个长度为 K 的字符串 { S_n : n=1..N },是否有一种有效的方法可以找到最短长度的字符串 S 使得每个 S_n 都是 S 的子字符串?
(请注意,由于我可能希望保持我的位数组 8 位对齐,我对问题的特定应用可能是处理 8 位字节的字符串而不是位的字符串,但是这个问题在任何情况下都是有意义的字符的意义——位、字节或其他。)
【问题讨论】:
-
我怀疑这是 NP 难的,因为没有办法建立处理这些可能导致类似 DP 的解决方案的顺序,但我没有知识来证明它。您可能会在理论或数学溢出方面得到更好的答案
标签: c string algorithm optimization