[问] 压缩一群字符串的算法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
ldm0
V2EX    奇思妙想

[问] 压缩一群字符串的算法

  •  
  •   ldm0 2021-09-24 01:21:59 +08:00 2722 次点击
    这是一个创建于 1478 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有比较不暴力的算法,可以把一群字符串["abcd", "bcde", "cdeab"] 压缩成(["abcdeab"], [(0, 4), (1, 5), (2, 7)])呢。

    13 条回复    2021-09-24 14:55:01 +08:00
    zagfai
        1
    zagfai  
       2021-09-24 01:34:19 +08:00
    条件没说清楚。
    另外,单顺序接龙的时间复杂度都是 O(nm)了,n 个字符串,每个 m 大小。
    然后接龙了再找自串,又是一个 O(nm)了。
    快不了吧?
    also24
        3
    also24  
       2021-09-24 01:35:31 +08:00
    可以看一下 LZ77
    nvkou
        4
    nvkou  
       2021-09-24 02:16:17 +08:00 via Android
    稍微想了下可以几个手段入手
    编码和字符集。压缩字符集使数据重新映射,每个字符少 2 个 bit ?
    词频字典重映射。就是看值不值得替换长词语

    以上都没有回答你问题,只是突然想到
    至于你的问题,是找子串吧
    ldm0
        5
    ldm0  
    OP
       2021-09-24 02:34:30 +08:00
    @zagfai 条件是把多个字符串结合成一个字符串,操作之后每一个原字符串都能在最后的大长字符串中以连续子串的形式找到。
    @also24 粗浅的看了一下,用了字典之后应该就无法满足连续子串的要求了。
    @nvkou 压缩的确有不少已知办法,字典什么的都很高效,但是某些情况就是需要尽可能的压缩字符串,同时也保证能够在内存里面连续出现(比如说如果不连续就经常不能被直接放进语言内置的字符串类型中了)。
    also24
        6
    also24  
       2021-09-24 02:53:02 +08:00
    @ldm0 #5
    你的样例用 LZ77 的思路可以得到几乎一致的结果(循环越界部分其实也很容易变通)。
    我觉得你选择的这个样例,很难完全表达出你的思想。

    根据你后面的回复,我的猜测是,你想通过一些手段,让 LZ77 的字典能覆盖到最多的子串?
    那这样,实际上就是 LZ77 + Huffman,也就是 DEFLATE 了。

    另:我不太能理解你说的 "在内存里面连续出现" 这一条,这似乎和压缩关联不大;
    elfive
        7
    elfive  
       2021-09-24 07:19:07 +08:00 via iPhone
    lzma 压缩算法
    Building
        8
    Building  
       2021-09-24 08:55:42 +08:00 via iPhone
    转成 Data 再 gzip 一下不就好了。
    zagfai
        9
    zagfai  
       2021-09-24 11:58:25 +08:00
    @ldm0 你这个条件。。直接把前面的字符串拼接起来就可以了,但那就算不上压缩了。这个压缩本质上是你要确认这些字串有多大比例的重叠,是大比例重叠才有有效的算法。
    2i2Re2PLMaDnghL
        10
    2i2Re2PLMaDnghL  
       2021-09-24 14:01:27 +08:00
    你是要压缩常量字符串到 .data ?
    其实还是正常压缩运行时解压方便

    你在寻求一种排列,使得其顺次合并后的字符串最短?
    朴素算法 O(n!) ,估计是 NP 问题
    你还是搞个退火算法吧(
    islandempty
        11
    islandempty  
       2021-09-24 14:29:54 +08:00
    lz77 或 lz78 吧,
    ldm0
        12
    ldm0  
    OP
       2021-09-24 14:39:45 +08:00
    @2i2Re2PLMaDnghL 完全是这样(
    @zagfai 是的,就是在认为这些字串有很大比例重叠的情况下考虑有没有这种压缩算法。
    zagfai
        13
    zagfai  
       2021-09-24 14:55:01 +08:00
    @ldm0 没有这种压缩算法。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1148 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:44 PVG 01:44 LAX 10:44 JFK 13:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86