输入n个字符串字典序排序_FSST - 快速字符串压缩算法
VLDB: Fast Static Symbol Table (FSST): fast text compression that allows random access
这篇paper提出一种快速实现对“短字符串”进行压缩和解压缩的算法,并且可以提供“Random Access”的能力。
通过对比lz4(当前最优秀的通用压缩算法),发现LZ4在几k数据的情况下,压缩较好。而对于较短的字符串,处理并不好。一般都是将字符串列的多列数据放在一起组成一个block,然后交给lz4进行统一压缩。采用字典压缩。
此外,业界在int类型压缩上研究较为成熟,对于字符串的压缩,没有做到特别好。一般都是按照字典压缩,将字符串转换为int数据,然后可以对int数据再进一步压缩。但很少对字符串字典本身做压缩处理。并且也不支持能够随机访问,即,需要将整个block解压缩后进行访问,而对于非连续访问的情况,通常仅仅访问其中少量的数据,效率不高。
字符串压缩也有一些提出的方案,比如order-preserve的可以保证序,这在一篇2009年的论文中被提出,使用了tree,具体还没去读原论文。
这篇文章提到的方案是,对压缩的字符串进行采样抽取片段,然后对片段进行静态编码为一个1-255的byte,而这个片段也不长,最多8个字符串长度。这些小片段为编码单位。然后使用这个表对字符串集合进行逐个的编码,解码也一样,使用这个表去查表就能解码。从这个方案可以看到,得确具备随机访问的能力。
充分使用AVX-512指令,使压缩并行化进行,可以同时处理8个压缩:
压缩/解压分2步3个API:
/* Calibrate a FSST symboltable from a batch of strings (it is best to provide at least 16KB of data). */
fsst_encoder_t*
fsst_create(size_t n, /* IN: number of strings in batch to sample from. */size_t lenIn[], /* IN: byte-lengths of the inputs */unsigned char *strIn[], /* IN: string start pointers. */int zeroTerminated /* IN: whether input strings are zero-terminated. If so, encoded strings are as well (i.e. symbol[0]=""). */
);
这一步根据输入的采样字符串集合构造静态编码表,编码表的构造在论文中有大致的算法,在github上有完整的代码。
编码表结构如下:
/* Data structure needed for decompressing strings - read-only and thus can be shared between multiple decompressing threads. */
typedef struct {unsigned long long version; /* version id */unsigned char zeroTerminated; /* terminator is a single-byte code that does not appear in longer symbols */unsigned char len[255]; /* len[x] is the byte-length of the symbol x (1 < len[x] <= 8). */unsigned long long symbol[255]; /* symbol[x] contains in LITTLE_ENDIAN the bytesequence that code x represents (0 <= x < 255). */
} fsst_decoder_t;
然后可以进行压缩了:
/* Compress a batch of strings (on AVX512 machines best performance is obtained by compressing more than 32KB of string volume). */
/* The output buffer must be large; at least "conservative space" (7+2*inputlength) for the first string for something to happen. */
size_t /* OUT: the number of compressed strings (<=n) that fit the output buffer. */
fsst_compress(fsst_encoder_t *encoder, /* IN: encoder obtained from fsst_create(). */size_t nstrings, /* IN: number of strings in batch to compress. */size_t lenIn[], /* IN: byte-lengths of the inputs */unsigned char *strIn[], /* IN: input string start pointers. */size_t outsize, /* IN: byte-length of output buffer. */unsigned char *output, /* OUT: memory buffer to put the compressed strings in (one after the other). */size_t lenOut[], /* OUT: byte-lengths of the compressed strings. */unsigned char *strOut[] /* OUT: output string start pointers. Will all point into [output,output+size). */
);
解压缩一样,要传入静态编码表:
/* Decompress a single string, inlined for speed. */
inline size_t /* OUT: bytesize of the decompressed string. If > size, the decoded output is truncated to size. */
fsst_decompress(fsst_decoder_t *decoder, /* IN: use this symbol table for compression. */size_t lenIn, /* IN: byte-length of compressed string. */unsigned char *strIn, /* IN: compressed string. */size_t size, /* IN: byte-length of output buffer. */unsigned char *output /* OUT: memory buffer to put the decompressed string in. */
)
源代码链接
https://github.com/cwida/fsst
输入n个字符串字典序排序_FSST - 快速字符串压缩算法相关推荐
- python字符串去重排序_python实现字符串转数字排序-女性时尚流行美容健康娱乐mv-ida网...
女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python 取子 字符 串 ...
- 输入n个字符串字典序排序_30个Python奇淫技巧集
今天小编熬夜整理了一份,内容是基础篇覆盖了字符串,列表,字典和基础序列容器.不要小看青铜篇,这份资料里面收集了很多奇淫技巧,很多小编也是第一次遇到,非常值得收藏. 下面我挑选几个给大家看一下,小编觉得 ...
- java字符串字典排序_java实现对map的字典序排序操作示例
本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...
- Java字符串数组字典序排序
Java字典序排序 1. String[] 字符串数组 1) 正序排序 2)逆序排序 2. String 字符串 3. int[] 整数数组 4.int[]降序排序 5.int[]两个条件排序 1. ...
- java map字典序_java中对map的字典序排序
java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115& ...
- 字典序 java_java实现对map的字典序排序操作示例
本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...
- Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串
**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串.编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串 题目 题目描述 破题 代码 运行实例 题目 题目描 ...
- php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序
C++ 如何实现字典序排序法,自然排序 类似PHP的natcasesort函数,整了一天没有头绪. 数组是vector 排序前: [0] => IMG0.png [1] => IMG3.p ...
- 字符串的排序不一定要完全按照字典序(洛谷P1012题题解,Java语言描述)
题目要求 P1012题目链接 分析 直接按照字符串处理,可以按照字典序排序. 但这样存在问题: 比如32和321,我们按照字典序进行排序"321">"32" ...
最新文章
- Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)
- VMware / 三种联网方法及原理
- Android NDK调试定位错误
- python最常用的版本、也称为classic_2021年中国大学《创新思维与创业》单元测试答案...
- java 获取指定后缀名的文件
- 用Maven创建第一个web项目Struts2项目
- 使用pscp实现Windows 和 Linux服务器间远程拷贝文件
- 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层(转)...
- c 自定义实现string类 clear_JVM类加载器是否可以加载自定义的String
- office 2021安装教程+下载
- python中excel数据分组处理
- Vi下编辑和退出编辑方法
- OpenPLC61850: An IEC 61850 MMS compatible open source PLC for smart grid research
- 外企面试英文自我介绍【面试经验】
- 工业自动控制过程中最好用SCADA软件推荐
- 自考本科计算机专业英语作文,成人学位英语作文万能模板
- VUE监听页面刷新和关闭事件
- DeePin系统安装jdk以及eclipse
- 最近想到的一些事情。
- 某博搜索话题采集分析Python爬虫
热门文章
- python 字符串数组互转
- 线性代数的本质 - 02 - 线性组合、张成的空间与基
- sh ndk-build.cmd command not found
- matlab计时,暂停
- Windows server 2016 添加盘符为D盘的数据盘
- 计算机应用基础 黄国兴 研读,《计算机应用基础》大纲解读黄国兴
- oracle数据库可以存图片吗,如何往数据库(Oracle)里存储图片和文件
- java set和get原理_Java线程池的实现原理和使用
- idl linux运行效率,Linux性能优化实战 CPU篇 阅读笔记
- java打印版本兼容_打印class文件的Java编译器内部的版本号