根据指定的间隔将浮点值映射到函数
Mapping float value to function depending on specified intervals
目标
给定一个主区间,例如[0,1]
,将该区间分解为任意数量的子区间,例如[0,0.2) , [0.2,0.5) , [0.5,1]
。
现在将不同的函数映射到生成的每个子区间:
[0,0.2) ~> a( float x )
[0.2,0.5) ~> b( float x )
[0.5,1] ~> c( float x )
调用该映射函数map
。设计了map
映射函数获取主间隔上的浮点值,并调用相应的映射函数。也就是说,给定输入值x = 0.3
, map
调用b(0.3)
:
map(0.3); //Should call b(0.3)
我的问题是:什么是正确的/最好的方式来实现这在c++上?
<标题>尝试解决方案:我已经尝试了一个解决方案,其中包括将间隔表示为一对浮点值,即using interval = std::pair<float,float>;
,并使用该间隔类型作为(无序)映射的键:
void map_function( float x )
{
std::map<interval,std::function<void(float)>> map;
map[{0.0,0.2}] = [](float){ ... }; //a
map[{0.2,0.5}] = [](float){ ... }; //b
map[{0.5,1.0}] = [](float){ ... }; //c
auto it = std::find_if( std::begin( map ) ,
std::end( map ) ,
[x]( const interval& interval )
{
return x >= interval.first && x < interval.second;
});
if( it != std::end( map ) )
*it( x );
else
throw "x out of bounds or subintervals ill-formed";
}
这个解决方案似乎有效,但我认为有一些小问题:
- 给定n个子区间,复杂度为O(n) 。有没有办法在0(1)中实现这种函数?
-
std::map
是适合这项工作的容器吗?:关联容器的目的是从键映射到值,但这里映射的键不是输入本身,而是输入的处理形式(输入值所属的区间)。
我也尝试过c++ 11的std::unordered_map
,但似乎没有浮点对的标准哈希函数。这让我很惊讶,但又引出了另一个问题。Keep on topic:P
您可以使用二分查找O(lgn)复杂度。具体来说,下界形式#算法库。如果你有一个tuple <double, ptr_function>
的向量,你可以使用二进制搜索它。如果range是特定的const长度或长度是某个数字的倍数,则可以在O(1)时间内完成。例如:
multiple of 0.1
Ranges: [0;0.4) = a, [0.4;0.5) = b, [0.5;1) = c
table = {a,a,a,b,c,c,c,c,c}
Getting for x : table[floor(x*10)]
编辑:如果你想保留map,你可以使用map的下界
如果你的间隔彼此相邻,那么使用起点作为键,而不是使用find()
,使用lower_bound()
。一般情况下,你不能使它比log2(N)
快。如果您知道最大十进制精度是多少,我建议您使用int64_t作为键。转换为int64_t ikey = 10eX * dkey
,其中X
为最大精度。
相关文章:
- 将函数类成员映射到类本身内部
- 使用std::函数映射对象方法
- 内联映射初始化的动态atexit析构函数崩溃
- 从函数角度看ID到文件路径的内部与外部映射
- C++ 已停止工作静态映射函数
- C++中的映射函数
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 如何将值传递给MFC消息映射函数on_command
- 创建高阶映射函数时,应该使用指针、引用或值
- 什么是 C++ 中的映射函数
- 使用变量参数映射函数并通过字符串 c++ 调用
- OpenCV 3.1 重映射函数类型值错误
- std::映射函数指针
- 在一个简单的映射函数中避免IF
- 相当于使用lambda的python映射函数
- 更好的数据结构映射函数与多个参数(键)
- 使用 c++11 构造映射函数
- 反向映射函数关系(c++)
- 类C++中的映射函数
- c++映射函数中的向量相等