C++ - 在没有循环的情况下查找稀疏矩阵值

标签 c++ hashtable sparse-matrix

我有一个 C++ 程序,需要以下格式的输入文件:

X    Y    Z
1    1    .642
1.1  1    .482
1.2  1    .394
1.3  1    .420
1.4  1    .948

文本文件非常长 - 大约 20,000 行左右。我现在需要将其读入我的 C++ 程序中,以便对任何 (X,Y) 对进行 Z 查找。如果 (X,Y) 对与输入文件中的任何对不完全相同,我需要使用最接近的 X 和最接近的 Y 值。如果我有一个完整的矩阵而不仅仅是非零值,则 X 和 Y 坐标将均匀分布。

我的问题是确定最快的方法来做到这一点。我想避免实际在 vector 中搜索最近的 X,然后在 vector 中搜索最近的 Y。有没有一种方法可以在不循环和搜索的情况下完成此操作?某种哈希表可以用来查找值吗?

我是一个脚本人员和一个 C++ 新手,所以如果这看起来微不足道,我深表歉意。因此,作为引用,我需要快速的方法:

lookup(1.1,1)
    >>> .482

lookup(1.112, 1)
    >>> .482 // value corresponding to closest x and closest y

lookup(0,0)
    >>> .642 // value corresponding to closest x and closest y

如果我有完整的矩阵,这可以直接实现,例如:

    1.1  1.2  1.3  1.4  1.5
1.1
1.3
1.5      (Z values)
1.7
1.9

为了找到与 (1.5, 1.2) 相关的 Z 值,我可以简单地返回在索引 [1.5/(x_spacing), 1.2/(y_spacing)] 处找到的 Z 值。

当然,我还需要将查找值减去此间距,如果不存在精确的 (X,Y) 对,则进行舍入。然而,最重要的是,它允许我在不进行任何搜索的情况下获得适当的 Z 值。我想完成同样的事情,除了不占用巨大的完整矩阵所需的所有空间。这就是为什么文本文件仅包含与非零 Z 值相对应的对。

如果您能提供任何帮助,我们将不胜感激。

最佳答案

我建议将其存储在结构化树中。以四叉树为例。它将是稀疏存储以节省空间,并且也很容易搜索最近点。

关于 C++ 四叉树的教程是 here .

关于C++ - 在没有循环的情况下查找稀疏矩阵值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374675/

相关文章:

c++ - 如何在 Eclipse CDT 中配置索引器以防止索引器阻塞整个 Eclipse?

c++ - 数组缓冲区溢出

javascript - 按字母顺序对 JavaScript 中的哈希表进行排序

python - 如何在 Python 中对稀疏矩阵中的整列进行加法运算

c++ - C++ 中的英特尔 MKL 稀疏 QR 求解返回未初始化错误

c++ - 段错误 - 大小 8 的读取无效

C++,学习链表

java - 如何在java中对Hashtable进行洗牌

.net - 哈希表并发

c++ - Eigen 稀疏矩阵乘法的内存泄漏