“插值”表查找的数据结构

时间:2011-12-13 16:41:17

标签: performance language-agnostic data-structures

我有一组代表1变量函数的2-D点。 给定一个随机输入值,我必须选择最接近的值。 例如:

曲线: (1,5) (2,8) (5,9)

输入:3输出:8

我主要担心的是速度,空间并不重要。 哪种数据结构最好?

编辑:表格是静态的,在运行时不会改变

2 个答案:

答案 0 :(得分:3)

这取决于表格是静态的还是动态的。

如果它是静态数据,简单的排序数组和二进制搜索将完成工作:搜索密钥,如果找不到,检查上面和下面的索引,看看哪个更靠近搜索键,然后返回它的相关价值。

如果数据是动态的,我会使用B + Tree变体(尽管任何平衡的树结构都应该有效)。本质上是相同的算法,但你要检查兄弟节点,而不是只检查相邻的数组单元。

答案 1 :(得分:1)

您说该表是静态的,并且在运行时不会更改。 然后,如果你需要超强的性能,如果表不是太大,那么很难击败硬编码的二进制搜索。 对于您提供的表格,它看起来像这样:

result = (x < 3.5
            ? (x < 1.5
                ? 5
                : 8
              )
            : 9
         );

您可能需要编写一个小程序来将表作为输入,并将代码生成为输出,以便将其包含在主程序中。

如果您不介意使用宏,可能会让它更容易编写,如下所示:

#define M(a,middle,b) (x < (middle) ? (a) : (b))

result = M( M(5, 1.5, 8), 3.5, 9);

唯一的方法是使用硬编码哈希搜索(使用switch语句)。

如果表可以在运行之间进行更改,则可能有意义的是,无论何时程序启动,它都会生成代码,编译并将其链接到dll,加载dll,然后运行。 这可能需要大约一秒钟,然后你就拥有了高速。