将输入值映射到O(1)时间范围内的表

时间:2018-12-27 09:25:56

标签: data-structures

我有一个范围和各自值的表格。该表是在运行时生成的,可以很小,也可以很大。范围的大小可以不同。例如:

git pull

我想编写一个函数,该函数将返回与给定值的范围相关联的值。它将检查表中适合的位置,然后返回与其关联的函数。所以基本上:

[0 - 5]: a
[5 - 7]: b
[7 - 10]: c
[10 - 20]: d

我能想到的唯一方法是线性搜索表以找到适合输入值的位置。在最坏的情况下,这将花费O(n)时间,其中n是表中的条目数。但是我觉得我可以做得更好,特别是因为我希望使用数百或数千个值来评估此函数,并且我不希望它一直在搜索。

在O(1)时间内是否有一种很好的方法?

我正在使用python 3,但是这个问题可能适用于任何编程语言。但我希望python可能有一些非常不错的语法糖或数据结构,我希望可以使用

此外,此示例使用整数。但是如果我使用实数,解决方案会改变吗?

2 个答案:

答案 0 :(得分:2)

这将需要o(n)个空间复杂度。 在生成结果时,将“ a或b或c或d”存储在表的索引范围内(例如0-5或5 -7)

arr=[a,a,a,a,a,a,b,b,c,c,c.....]
//if we print arr[2] we will get a and if we print arr[6] we will get b.
//intially storing will take o(n) once it is stored after that accessing will take o(1)

或者您可以选择二进制搜索,该搜索将花费o(logn)。

答案 1 :(得分:0)

从我所见,最适合此问题的数据结构是“间隔树”

https://en.wikipedia.org/wiki/Interval_tree

不幸的是,对于实数,似乎没有办法执行O(1)搜索,但是O(log n + m)可能就足够了,在这种情况下m可以有效地等于1,因为没有重叠的间隔。与此同时使用高速缓存来多次调用同一时间间隔也是一个好主意。

在pypi中可以找到一个intervaltree包,在这里:

https://pypi.org/project/intervaltree/

对于非实数,使用here之类的数据结构,您可以以存储空间为代价进行O(1)搜索。