Performance “的数据结构”;内插“;查表

Performance “的数据结构”;内插“;查表,performance,language-agnostic,data-structures,Performance,Language Agnostic,Data Structures,我有一个代表一个单变量函数的二维点集合。 给定一个随机输入值,我必须选择最接近的值。 例如: 曲线: (1,5) (2,8) (5,9) 输入:3输出:8 我主要关心的是速度,空间没有那么重要。 哪种数据结构最好 编辑:表格是静态的,它在运行时不会更改这取决于表格是静态的还是动态的 如果是静态数据,简单的排序数组和二进制搜索将完成任务:搜索键,如果找不到,检查上面和下面的索引,查看哪个更接近搜索键,并返回其关联值 如果数据是动态的,我会选择B+树变量(尽管任何平衡的树结构都可以)。基本上是相同的

我有一个代表一个单变量函数的二维点集合。 给定一个随机输入值,我必须选择最接近的值。 例如:

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

输入:3输出:8

我主要关心的是速度,空间没有那么重要。 哪种数据结构最好


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

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

如果是静态数据,简单的排序数组和二进制搜索将完成任务:搜索键,如果找不到,检查上面和下面的索引,查看哪个更接近搜索键,并返回其关联值


如果数据是动态的,我会选择B+树变量(尽管任何平衡的树结构都可以)。基本上是相同的算法,但您将检查同级节点,而不仅仅是检查相邻的数组单元。

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

如果是静态数据,简单的排序数组和二进制搜索将完成任务:搜索键,如果找不到,检查上面和下面的索引,查看哪个更接近搜索键,并返回其关联值


如果数据是动态的,我会选择B+树变量(尽管任何平衡的树结构都可以)。基本上是相同的算法,但您要检查同级节点,而不是只检查相邻的数组单元格。

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

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);
result=(x<3.5
?(x<1.5
5.
: 8
)
: 9
);
您可能需要编写一个小程序,将表作为输入,并生成代码作为输出,以便将其包含在主程序中

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

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);
定义M(a,中间,b)(x<(中间)?(a):(b)) 结果=M(M(5,1.5,8),3.5,9); 唯一的方法是使用硬编码哈希搜索(使用switch语句)

如果表可以在两次运行之间更改,那么每当程序启动时,它都会生成代码,编译并将其链接到dll中,加载dll并使用该dll运行,这可能是有意义的。
这可能需要大约一秒钟的时间,然后你就有了高速。

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

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);
result=(x<3.5
?(x<1.5
5.
: 8
)
: 9
);
您可能需要编写一个小程序,将表作为输入,并生成代码作为输出,以便将其包含在主程序中

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

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);
定义M(a,中间,b)(x<(中间)?(a):(b)) 结果=M(M(5,1.5,8),3.5,9); 唯一的方法是使用硬编码哈希搜索(使用switch语句)

如果表可以在两次运行之间更改,那么每当程序启动时,它都会生成代码,编译并将其链接到dll中,加载dll并使用该dll运行,这可能是有意义的。 这可能需要一秒钟的时间,然后你就有了高速