例如
H: [0, 20] -> "a"
H: [21: 25] -> "y"
H: [26: 132] -> "z"
无论我放入多少个范围,我如何制作H以使该函数占用恒定时间(以及插入的恒定时间)?这甚至可能吗?
答案 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是范围数。