如何为O(1)中的一系列数字创建一个返回相同值的函数?

时间:2013-03-30 18:53:27

标签: algorithm

例如

H: [0, 20] -> "a"
H: [21: 25] -> "y"
H: [26: 132] -> "z"

无论我放入多少个范围,我如何制作H以使该函数占用恒定时间(以及插入的恒定时间)?这甚至可能吗?

2 个答案:

答案 0 :(得分:1)

是的,只需使用查找表。使用您希望由范围表示的值初始化每个范围的表,然后返回索引处的值。像这样:

const char *lookup(int index)
{
    static const char *table[] = {
        "foo",
        "foo",
        "foo",
        "foo",
        "bar",
        "bar",
        "quirk",
        "quirk",
        "quirk"
    };
    return table[index];
}

这会返回"foo"范围[0, 3]"bar"范围[4, 5]"quirk"范围[6, 8]

答案 1 :(得分:1)

您可以使用一个简单的数组:

[0] -> "a"
[1] -> "a"
[2] -> "a"
[3] -> "a"
[4] -> "a"
[5] -> "a"
...
[20] -> "a"
[21] -> "y"
[22] -> "y"
[23] -> "y"
[24] -> "y"
[25] -> "y"
[26] -> "z"
...
[132] -> "z"

这为您提供O(1)查找。您可以使用哈希表执行相同的操作,其中键是索引,但性能会更差。这种方法有多种变体(例如通过使用哈希表或一些延迟加载的构造),但它们都处理一对一的映射。

如果由于内存限制而无法进行一对一映射,则无法使用O(1)执行此操作,因为您始终必须通过已注册的范围,因此最好这可以是O(log(n))其中n是范围数。