gpt4 book ai didi

c++ - 如何有效地将稀疏数组保存在 C++ 文件中?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:38 24 4
gpt4 key购买 nike

我有一个包含 6 个索引的 double 组,其中大部分填充了 0。我还不知道我应该用什么类型来将它存储在内存中。

但是,最重要的是:我想将它保存到一个文件中(二进制文件?)。最有效的保存方法是什么?一个要求是我可以遍历所有非零条目而不经过零。如果我运行 6 个嵌套的 for,我将需要太多的生命。

此外,我不知道如何实际保存它:我是否需要两个文件,一个用作索引,另一个包含所有值?

谢谢!

最佳答案

这可能是一个已解决的问题;可能有一些稀疏矩阵库也可以为您提供高效的内存表示。 (例如,每一行都是 index:value 的列表,存储在 std::vector、链表、散列或其他数据结构中,具体取决于是否插入单个非- 中间的零值是有值(value)的或任何其他重要的操作)。


二进制格式的存储/加载速度会更快,但是对于某些表示稀疏数组的方式来说,是二进制格式还是文本格式并不重要。如果你写一个二进制格式,endian-agnostic code是确保它是可移植的并且没有只出现在某些架构上的错误的好方法。

选项:

  • 简单但有点丑陋:gzip/lz4/lzma 保存多维数组的缓冲区,将结果写入磁盘。在保存/加载时即时转换为小端,或在格式中存储字节序标志。

  • 相同的想法,但将所有 6 个索引与每个值一起存储。如果许多最里面的数组没有非零值,那很好,这可能很好。每个非零值都有一个单独的记录(行,基于文本的格式)。样例行(为了可读性的三重嵌套示例,扩展到 6 就好了):

dimensions on the first line or something
a b c val
...
3 2 5 -3.1416

表示:矩阵[3][2][5] = -3.1416

  • 使用嵌套的稀疏数组表示:每一行都是索引:值的列表。不存在的索引为零。文本格式可以使用空格和换行符来分隔事物;二进制格式可以在每行的开头使用长度字段或在末尾使用标记值。

    您可以将多维数组展平为一个线性索引以便使用 32 位整数索引进行存储,或者您可以以某种方式表示嵌套。我不会尝试为此编写文本格式,因为当我开始考虑它时它变得很难看。

关于c++ - 如何有效地将稀疏数组保存在 C++ 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33337813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com