SDSL非常成熟,在 C++ 中实现了后缀树、后缀数组、小波树和许多其他结构。
“简洁数据结构库(SDSL) 是一个功能强大且灵活的 C++11 库,实现了简洁的数据结构。该库总共包含 40 篇研究出版物的亮点。简洁的数据结构可以表示一个对象(例如位向量或一棵树)在接近对象的信息论下界的空间中,同时有效地支持原始对象的操作。对经典数据结构和等效简洁数据结构执行的操作的理论时间复杂度是(大部分时间) 完全相同的。”
可以在此处找到在 SDSL 中实现的结构列表。
平均 LCP 的示例 - 使用后缀树的最长公共前缀搜索(来自 SDSL 源的示例,文件text-statistics.cpp
):
#include <sdsl/suffix_trees.hpp>
#include <iostream>
using namespace std;
using namespace sdsl;
typedef cst_sct3<> cst_t;
typedef cst_t::char_type char_type;
int main(int argc, char* argv[])
{
if (argc < 2) {
cout << "Usage: "<< argv[0] << " file" << endl;
cout << "(1) Generates the CST of file." << endl;
cout << "(2) Calculates the avg LCP value and the runs in the BWT." << endl;
return 1;
}
cst_t cst;
construct(cst, argv[1], 1);
long double runs = 1;
long double avg_lcp = 0;
if (cst.csa.size()) {
char_type prev_bwt = cst.csa.bwt[0];
for (uint64_t i=1; i<cst.csa.size(); ++i) {
char_type bwt = cst.csa.bwt[i];
if (prev_bwt != bwt) {
runs += 1.0;
}
prev_bwt = bwt;
avg_lcp += cst.lcp[i];
}
avg_lcp /= cst.csa.size();
for (size_t k=0; k<=5; k++) {
cout << "H_" << k << ": " << Hk(cst,k).first << endl;
}
cout << "avg LCP: " << avg_lcp << endl;
cout << "runs in BWT: " << runs << endl;
}
}