【问题标题】:Data structure for "interpolated" table lookup“插值”表查找的数据结构
【发布时间】:2011-12-13 16:41:16
【问题描述】:

我有一组代表一元函数的二维点。 给定一个随机输入值,我必须选择最接近的值。 示例:

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

输入:3 输出:8

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

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

【问题讨论】:

    标签: performance language-agnostic data-structures


    【解决方案1】:

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

    如果是静态数据,简单的排序数组和二分查找就可以完成:搜索key,如果没有找到,检查上下索引,看哪个更接近搜索key,然后返回它的关联值。

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

    【讨论】:

      【解决方案2】:

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

      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 并使用它运行,这可能是有意义的。 这可能需要大约一秒钟的时间,然后你就有了高速。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-10
        • 2011-04-27
        • 2021-08-21
        • 2020-11-05
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        相关资源
        最近更新 更多