当前位置:   article > 正文

FM索引的保存和加载

fm索引

在SDSL库中构建的FM索引可以保存到磁盘上以便以后加载和重用。SDSL提供了一些方法来实现这一点。你可以使用serialize()函数将FM索引对象序列化为二进制格式,并将其写入文件中。然后,你可以使用load()函数来从文件中加载并重新构建FM索引对象。

  1. #include <iostream>
  2. #include <sdsl/suffix_arrays.hpp> // 包含SDSL库的头文件
  3. #include <filesystem>
  4. namespace fs = std::filesystem;
  5. using namespace sdsl;
  6. int main() {
  7. csa_wt<wt_huff<>> fm_index;
  8. std::string text = "atgctacg"; // 替换成你的文本
  9. construct_im(fm_index, text.c_str(), 1); // 构建FM索引
  10. //FM-index对象包含了后缀数组以及其他相关的压缩数据结构。
  11. // 打印FM索引对象的成员变量和相关信息
  12. std::cout << fm_index << std::endl; // 后缀树组
  13. std::cout << fm_index.size() << std::endl; // 后缀树组大小
  14. // 压缩数据结构的大小
  15. std::cout << size_in_mega_bytes(fm_index) << " MB" << std::endl;
  16. /*
  17. 字母表指的是构建索引所使用的字符集合。在构建FM-index时,
  18. 需要先确定文本数据的字母表,然后将每个字符映射到一个唯一的整数值,
  19. 通常使用ASCII码或者其他编码方式。这样做是为了将字符集合映射到一个有限的整数范围内,以便于构建后缀数组等数据结构。
  20. */
  21. // 字母表大小
  22. std::cout << "Alphabet size: " << fm_index.sigma << std::endl;
  23. // FM索引是否为空
  24. std::cout << (fm_index.empty() ? "Yes" : "No") << std::endl;
  25. // 保存FM索引到文件
  26. std::ofstream out("fm_index.sdsl");
  27. //serialize()函数将FM索引对象序列化为二进制格式,并将其写入文件中。
  28. fm_index.serialize(out);
  29. out.close();
  30. // 查看FM索引保存目录
  31. fs::path currentPath = fs::current_path();
  32. std::cout << "当前工作目录:" << currentPath << std::endl;
  33. // 加载FM索引
  34. std::ifstream in("fm_index.sdsl");
  35. csa_wt<wt_huff<>> loaded_fm_index;
  36. //使用load()函数来从文件中加载并重新构建FM索引对象。
  37. loaded_fm_index.load(in);
  38. in.close();
  39. // 现在 loaded_fm_index 包含了与 fm_index 相同的数据
  40. return 0;
  41. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1007364
推荐阅读
相关标签
  

闽ICP备14008679号