2014-05-10 57 views
0

我有一个散列表,字符串键和值。减少查找数量的有效方法?

钥匙必须根据某些参数构造。 例如,param1:param2:param3:param4:param5:param6。如果整个键的值(最优先的值)在散列中不可用,我将通过构造键“:param2:param3:param4:param5:param6”来查找下一个首选值。

如果没有它的价值,我会通过删除一个或多个参数来构造具有特定组合参数的键。所以,基本上有一个基于某种偏好的关键查找层次结构。

我目前的做法是构造一个键,查找,然后是如果在哈希中没有找到它,在层次结构中构造下一个键,等等......但是这可能导致许多查找,然后我找到一些或没有值。请注意,可能有多个键返回值,例如“参数1:参数2:参数3:参数4:参数5:参数6”和“:参数2:参数3:参数4:参数5:参数6”可能具有该值,但我更喜欢第一个键的值,甚至不会查找第二个键。

我怀疑可能有更有效的方法来解决这个问题。做这种查找最有效的方法是什么?

+0

你可以自定义你自己的散列函数吗? –

+0

我不希望自定义哈希函数,因为我正在使用现有的库。我只能自定义键和值。但是,如果我可以定制,它会如何帮助? – Nura

+0

另外,你是否喜欢用解决这个问题的语言? –

回答

0

这不是生成好的散列键的最好方法。但这是主意。

假设您有n个可供选择的字符串。您可以为每个字符串生成哈希。所以,你会有h1,h2,h3,... hn。

然后,当您生成密钥时,密钥可能是hi^hj^... hk的组合,其中k将是密钥中的参数个数。

现在,查找p1p2p3 ... pk,你可以做H = h(p1)^ h(p2)....^h(pk)。如果查找失败,只需做H = H^h(p1)^ h(p_k + 1)。

我不确定在执行此类自定义时,如果性能碰到散列冲突,则通过连接字符串并散列它们来覆盖密钥生成。

另一种方法:

创建一个字符数组,其中所有的PARAMS连接成一个字符串。您可以有另一个数组,用于跟踪每个参数结束的位置。然后,它很容易从param1提取数组到param_k来为每次迭代生成哈希。这样你就可以避免创建连接字符串,如果有性能影响的地方。