【发布时间】:2012-05-26 17:22:04
【问题描述】:
我参加了一次面试,我被要求编写一个用于部分密钥散列的算法,即;如果将 ABCBC 插入哈希中,则搜索任何子字符串都应返回存储的值。 我的答案是创建给定键的所有可能子字符串的集合,并维护每个子字符串与其一个或多个父字符串之间的映射。然后维护所有子字符串的集合的 BST。每个节点将指向该子字符串可能匹配的实际值的集合。 例如。 A, AB, ABC, ABCB, ABCBC, B, BC, BCB, BCBC, C, CB, CBC 是这个字符串的可能子串。可能还有其他字符串也像 BAB 一样,其中 AB 和 B 是子字符串。 所以给定 AB,它将映射到两个字符串 BAB 和 ABCBC。
还有其他更有效的方法吗? 谢谢
【问题讨论】:
-
您可以将子字符串节点存储在哈希表中(显然,对子字符串值进行哈希处理)。这会将您的搜索从 O(log n) 减少到 O(1)。空间复杂度将相当或稍差(由于表中的空槽)。
-
似乎为每个子字符串创建哈希变得不可行......也许这里有不同的技巧?任何可用于前缀树的东西?
-
后缀树 (en.wikipedia.org/wiki/Suffix_tree) 也许,虽然它不是真正的“散列”。我不太了解整个集合是如何工作的:假设我插入值为 4 的 ABCBC。然后搜索 ABC 返回 4,这很公平。如果我还插入值为 5 的 CDABC 会怎样。现在搜索 ABC 会返回什么?你不能说“应该返回存储的值”,也不能说“它会映射到两个字符串”,因为它不能两者都做。
-
子字符串可以出现在字符串的中间,因此您可以同时添加后缀和前缀。
标签: algorithm