字典样式查找对应于一小组值的数百万个键?

时间:2014-02-21 06:30:38

标签: c++ objective-c c algorithm lookup

我有很多指数。

有一个特定的组对应于一系列索引

例如:

Range      Group

0-100        A
101-220      B
221-543      C
 ...        ...
3K-40K       DF

在给定特定索引的情况下,我需要一种方法来查找相应的组。 例如,我需要一个方法:

(Group)groupForIndex:(index)

因此,如果我致电groupForIndex:(115),结果将为B

我正在寻找一种方法来改善我现在拥有的东西。

我不会只使用NSDictionary(或地图),因为那将是每个id的条目,可能是数百万,并且会浪费空间,因为许多键具有相同的值

我决定使用数组和字典的组合。 对于每个“上限”,数组中将有一个条目

示例:

[0] = 100
[1] = 220
[2] = 543

对于每个上限,字典中都会有一个条目

Key           Value
100             A
220             B
543             C

这样,使用二进制搜索,给定索引我可以查找上限。一旦我有了上限,我就拥有了字典的密钥。

这是我能提出的最有效的查找方案。什么是更有效的方法呢?

1 个答案:

答案 0 :(得分:1)

在(有序)数组中进行二进制搜索非常快,所以如果组和索引是固定的,那么你的方法看起来不错,所以数组必须只构建一次(或者不经常,与查找次数相比) )。

如果组经常更改,则使用不同的数据结构(例如,一些 树)可能更适合而不是在每次更改时重建数组。

正如我在评论中所说,我会用另一个数组替换字典 (与第一个相同的大小)

[0] = "A"
[1] = "B"
[2] = "C"
...

然后只将第一个数组中找到的索引映射到相应的组 通过第二个阵列。

这可能稍微快一点,并且可能更容易维护,因为每组的“上限”不会存储在两个地方。