我有一个基于位置的积分算法。 (也就是说,算法的输出基于曲线位置,并且每个结果都受到先前结果的值的影响)。
为了避免每次重新计算,我想以给定的采样率预先计算,然后执行查找并返回预先计算的结果(如果我直接落在一个上),或者在两个相邻结果之间进行插值
对于我来说,这对F#或C#来说是微不足道的,但我的C ++非常生疏,(甚至没有那么好)。
地图是否使用正确的构造?你能不能给我一个如何进行查询的例子呢? (我想在milimetres中预先计算,这意味着键可能是一个int,值将是一个双倍)。
更新好的,也许我需要的是一个排序字典。 (卷起袖子),伪代码:
//Initialisation
fun MyFunction(int position, double previousresult) returns double {/*etc*/};
double lastresult = 0.0;
for(int s = startposition to endposition by sampledist)
{
lastresult = MyFunction(s, lastresult);
MapOrWhatever.Add(s, lastresult);
}
//Using for lookup
fun GetValueAtPosition(int position) returns double
{
CheckPositionIsInRangeElseException(position);
if(MapOrWhatever.ContainsKey(position))
return MapOrWhatever[position];
else
{
int i = 0;
//or possibly something clever with position % sampledist...
while(MapOrWhatever.Keys[i] < position) i+=sampledist;
return Interpolate(MapOrWhatever, i, i+sampledist, position);
}
}
想想......也许如果我保持一个恒定的采样员,我可以使用一个数组并将其编入索引......
答案 0 :(得分:4)
如果保证您的值不是连续的,那么std :: map对于memoization来说听起来很合理。
#include <map>
// ...
std::map<int, double> memo;
memo.insert(std::make_pair(5, 0.5));
double x = memo[5]; // x == 0.5
答案 1 :(得分:2)
如果你考虑一张地图,也要考虑一个矢量。对于在应用程序运行期间未发生太大变化(甚至根本没有变化)的值,预先排序的std::vector< std::pair<Key,Value> >
(具有O(N)
查找)通常比查找{std::map<key,Value>
查找更快1}}(使用O(log N)
查找) - 尽管有所有理论。
你需要尝试和衡量。
答案 2 :(得分:1)
std :: map可能就好了。如果查找速度很关键,你可以尝试上面提到的向量,直接找到你需要的元素(不要使用二进制搜索,因为你可以从位置计算索引)。类似的东西:
vector<double> stored;
// store the values in the vector
double lastresult = 0.0;
for(int s = startposition, index = 0; s <= endposition; s+=sampledist, ++index)
{
lastresult = MyFunction(s, lastresult);
stored[index] = lastresult;
}
//then to lookup
double GetValueAtPosition(int position) returns double
{
int index = (position - startposition) / sampledist;
lower = stored[index];
upper = stored[index+1];
return interpolate(lower, upper, position);
}
答案 3 :(得分:0)
请参阅我的评论,但这里是地图文档
http://www.cplusplus.com/reference/stl/map/
和另一张海报没有提及的重要说明是,如果你使用[]来搜索地图中不存在的关键字,地图会创建一个对象,以便那里有东西。
编辑:请参阅此处的文档以获取此信息http://msdn.microsoft.com/en-us/library/fe72hft9%28VS.80%29.aspx
而是使用find(),它返回一个迭代器。然后针对map.end()测试这个迭代器,如果它相等则没有匹配。
答案 4 :(得分:0)
参考:http://www.cplusplus.com/reference/stl/map/
您可以使用地图,
typedef std::map<int,const double> mapType;
地图的表现如下:
map :: find 复杂 对数大小。
谨防地图中的Operator []
如果x匹配容器中元素的键,则该函数返回对其映射值的引用。
如果x与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也会始终将映射大小增加1。
答案 5 :(得分:-1)
HASH_MAP是用于快速查找的最佳STL算法,而不是任何其他算法。但是,填充比map或vector需要更多的时间,并且它没有排序。任何值搜索都需要一段时间。
std::hash_map<int, double,> memo;
memo.insert(std::make_pair(5, 0.5));
memo.insert(std::make_pair(7,0.8));
.
.
.
hash_map<int,double>::iterator cur = memo.find(5);
hash_map<int,double>::iterator prev = cur;
hash_map<int,double>::iterator next = cur;
++next;
--prev;
用(* next).second(),(* prev).second()值插值当前值..