实现部分密钥散列的最佳方法

时间:2012-05-26 17:22:04

标签: algorithm

我出现在接受采访时,我被要求编写一个部分密钥散列的算法,即;如果在散列中插入ABCBC,则搜索任何子字符串应该返回存储的值。 我的答案是创建给定键的所有可能子串的集合,并维护每个子字符串与其一个或多个父字符串之间的映射。然后维护所有子串的集合的BST。每个节点都将指向子字符串可能匹配的实际值的集合。 例如。 A,AB,ABC,ABCB,ABCBC,B,BC,BCB,BCBC,C,CB,CBC是该字符串的可能子串。可能还有其他字符串,如BAB,AB和B是子串。 所以给定AB,它将映射到两个字符串BAB和ABCBC。

还有其他更有效的方法吗? 感谢

1 个答案:

答案 0 :(得分:3)

将每个子字符串存储在哈希中,并附上是否为final的注释,以及可能的下一个字符和前一个字符。存储所有可能在中间包含此子字符的单词的前一个字符,以及将此子字符串作为其开头的所有单词的下一个字符。

因此,a的条目不需要包含a的所有单词。但是如果你愿意的话,很容易建立这个列表。同样在插入过程中,只要你在子串上缩小尺寸并且发现你已经拥有当前子串的当前子串,就可以停止。

假设您有许多具有相同字母的单词,这将节省一些空间和插入,但代价是实际生成列表的速度较慢。对于O(n*n)字母字符串,最坏情况仍为n

要删除,您可以按照类似的步骤,在任何包含其他子串的子字符串处停止删除。