我正在寻找一种在我的C ++程序中计算和存储2D函数样本的有效方法。
为了具体起见,让我从一个维度开始,这个问题很简单,然后解释为什么我不能将它概括为2D:
1-D版本如下:我们按以下方式计算函数z = f(x)的样本。我们从输入中读取数据并对应于每个输入,我们计算x和z = g(x)的值。现在,我们有一个(x,z = g(x))对的表。如果对于任何给定的x,只存在一个条目,那么我们有f(x)= z。否则,f(x)= z1 + z2 + ...(其中z1,z2,...是特定x的对应z条目。)
上述程序只需使用std::multimap
即可实现。即在第一阶段,我们只将结果存储在地图中(以x
为键)。最后,我们可以遍历地图,如果两个相邻元素足够接近,我们只需通过添加相应的值来合并它们。假设计算x和z = g(x)的复杂度是常数,我们可以用O(N log N)时间复杂度计算N个样本。
现在,我想将算法推广为二维。即我们首先从输入计算(x,y,z = g(x,y))对然后设置f(x,y)= z1 + z2 + ...(其中对于任何固定(x,y)对) ,z1,z2,...是以(x,y)开头的表条目的对应z字段。
之前的解决方案无法推广,因为人们无法在2D平面上定义排序的原因很简单(事实上我们可以使用std::multimap<std::pair<double,double>,double>
但是没有有意义的比较来查看密钥x1,y1
在x2,y2
之前。但是,请注意在2D平面上存在 closeness 的概念:给定两个点(x1,y1)和(x2,y2),我们可以准确地判断它们是否应该在我们的输出中合并。
嗯,非常天真的解决方案是实现一个2D链表(在每个维度中分别排序),其中有一个更好的邻接表示法。但这至少是非常低效的插入和(除了许多其他困难)程序将花费O(M ^ 2)时间(其中M = N * N是我们想要计算的2D平面上的样本数)
我想知道是否有办法(更确切地说是数据结构)能让我更有效地解决问题?
我真的很抱歉非常多余而且含糊不清。