区间分支
Interval branching
我正在处理的一个项目 (C++11) 涉及一个代码块,该代码块将 运行 数万亿次。我在 [1,N] 中有一个整数参数 B 和点 1 = b1 < b2 < ... < bk = N 代码根据哪个区间 [bi, b(i+1) ) B 在于。在整个执行过程中唯一变化的值是 B。然而,虽然 bi 的值是固定的,但它们仅在 运行 时间确定。
天真的做法是写一堆 if 和 else if 语句,最坏的情况是涉及 k 次比较。然而,可以在常数时间内完成此操作:构造一个大小为 N 的向量 myGotos 并在每个区间 [bi, b(i+1)) 上存储相应代码块的位置。然后你只需执行 goto myGotos[B].
在我看来,上面的解决方案平均来说会更快,但代码会很丑陋。我想知道是否有更好的方法来做到这一点。
执行此操作的常用方法是使用 switch 语句
switch(B){
case b1:..//
break;
}
如果您可以将这些代码部分声明为 lambda 或 std::function,前提是它们采用相同的 arguments.Even 模板函数可能没问题。在不知道 运行 这些功能实际需要什么的情况下很难回答。
map<int,decltype(yourLambda)>
好像也可以。
初始化一个N
个槽数组,让K
,其中每个槽包含包含区间的索引。
然后
switch (K[B])
{
case 1: // [B1,B2)
...
}
我正在处理的一个项目 (C++11) 涉及一个代码块,该代码块将 运行 数万亿次。我在 [1,N] 中有一个整数参数 B 和点 1 = b1 < b2 < ... < bk = N 代码根据哪个区间 [bi, b(i+1) ) B 在于。在整个执行过程中唯一变化的值是 B。然而,虽然 bi 的值是固定的,但它们仅在 运行 时间确定。
天真的做法是写一堆 if 和 else if 语句,最坏的情况是涉及 k 次比较。然而,可以在常数时间内完成此操作:构造一个大小为 N 的向量 myGotos 并在每个区间 [bi, b(i+1)) 上存储相应代码块的位置。然后你只需执行 goto myGotos[B].
在我看来,上面的解决方案平均来说会更快,但代码会很丑陋。我想知道是否有更好的方法来做到这一点。
执行此操作的常用方法是使用 switch 语句
switch(B){
case b1:..//
break;
}
如果您可以将这些代码部分声明为 lambda 或 std::function,前提是它们采用相同的 arguments.Even 模板函数可能没问题。在不知道 运行 这些功能实际需要什么的情况下很难回答。
map<int,decltype(yourLambda)>
好像也可以。
初始化一个N
个槽数组,让K
,其中每个槽包含包含区间的索引。
然后
switch (K[B])
{
case 1: // [B1,B2)
...
}