赞
踩
在SDSL库中构建的FM索引可以保存到磁盘上以便以后加载和重用。SDSL提供了一些方法来实现这一点。你可以使用serialize()
函数将FM索引对象序列化为二进制格式,并将其写入文件中。然后,你可以使用load()
函数来从文件中加载并重新构建FM索引对象。
- #include <iostream>
- #include <sdsl/suffix_arrays.hpp> // 包含SDSL库的头文件
-
- #include <filesystem>
- namespace fs = std::filesystem;
-
- using namespace sdsl;
-
- int main() {
- csa_wt<wt_huff<>> fm_index;
- std::string text = "atgctacg"; // 替换成你的文本
- construct_im(fm_index, text.c_str(), 1); // 构建FM索引
-
- //FM-index对象包含了后缀数组以及其他相关的压缩数据结构。
- // 打印FM索引对象的成员变量和相关信息
- std::cout << fm_index << std::endl; // 后缀树组
- std::cout << fm_index.size() << std::endl; // 后缀树组大小
- // 压缩数据结构的大小
- std::cout << size_in_mega_bytes(fm_index) << " MB" << std::endl;
-
- /*
- 字母表指的是构建索引所使用的字符集合。在构建FM-index时,
- 需要先确定文本数据的字母表,然后将每个字符映射到一个唯一的整数值,
- 通常使用ASCII码或者其他编码方式。这样做是为了将字符集合映射到一个有限的整数范围内,以便于构建后缀数组等数据结构。
- */
-
- // 字母表大小
- std::cout << "Alphabet size: " << fm_index.sigma << std::endl;
- // FM索引是否为空
- std::cout << (fm_index.empty() ? "Yes" : "No") << std::endl;
-
- // 保存FM索引到文件
- std::ofstream out("fm_index.sdsl");
- //serialize()函数将FM索引对象序列化为二进制格式,并将其写入文件中。
- fm_index.serialize(out);
- out.close();
-
- // 查看FM索引保存目录
- fs::path currentPath = fs::current_path();
- std::cout << "当前工作目录:" << currentPath << std::endl;
-
- // 加载FM索引
- std::ifstream in("fm_index.sdsl");
- csa_wt<wt_huff<>> loaded_fm_index;
-
- //使用load()函数来从文件中加载并重新构建FM索引对象。
- loaded_fm_index.load(in);
- in.close();
-
- // 现在 loaded_fm_index 包含了与 fm_index 相同的数据
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。