根据一组完全不相关的值中的其他值获取相应值的快速方式(在C中)是什么?
示例:
值{0xFE,0x84,0x35}对应于值{0,1,2},它们用于索引函数数组。
void doStuff(int weirdValue)
{
int correspondingIndex = getIndexFromWeirdValue(weirdValue);
doMoreStuff[correspondingIndex]();
}
我知道我可以使用值{0,1,2}索引数组并通过它访问{0xFE,0x84,0x35},但有没有办法进行反向操作而不必遍历集合如果要将这些值静态关联,则比较值?
答案 0 :(得分:1)
关联数组,也称为地图或哈希地图或红黑树将是正确的大量的解决方案。谷歌'std:map'了解更多细节(即C ++,但你可以使用这个概念,当然你必须自己实现它)
对于少量(可能高达20或30),一个简单的循环甚至更快,因为没有散列开销。
答案 1 :(得分:1)
在上面的示例中,值域为8位,因此您可以拥有256个值的数组。同样,如果你有一组数千个值,你可以简单地得到一个这样大小的数组。虽然,这种方法在内存上会很粗糙,但它会给O(1)时间复杂度。
如果域和值范围未知,则可以实现哈希表/哈希映射。虽然这很难实现,但它会给O(1)时间复杂度。
迭代很容易实现,但O(n)时间复杂度就会存在。
答案 2 :(得分:0)
只有3个可能的输入值映射到3个连续值。
int getIndexFromWeirdValue(int x) {
static const int x[3] = {0xFE, 0x84, 0x35};
static const int y[3] = {0,1,2};
return (x==x[0])*y[0] + (x==x[1])*y[1] + (x==x[2])*y[2];
}
存在以类似非分支方式执行的其他方法。
使用4字节数学运算将1字节映射到1字节并且x[]
是不同的,如果int
除法是快YMMV,总是可以得到下面表格的答案。 C0,C1,C2,D基于映射。如果映射是常量,则可以在编译时确定这些值。
y = (((C0*x + C1)*x + C2)/D + y[0];