【问题标题】:Best way to implement partial key hashing实现部分密钥散列的最佳方法
【发布时间】: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


【解决方案1】:

将每个子字符串存储在哈希中,并注明它是否是最终的,以及可能的下一个字符和前一个字符。存储所有可以在中间有这个子字符串的单词的前一个字符,以及所有以这个子字符串作为开头的单词的下一个字符。

因此a 的条目不需要包含所有带有a 的单词。但是,如果您愿意,构建该列表很容易。同样在插入过程中,一旦您减小子字符串的大小并且发现您已经拥有当前延续的当前子字符串,您可以停止。

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

要删除,您可以遵循类似的过程,在包含其他子字符串的任何子字符串处停止删除。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2011-09-21
    • 2014-01-15
    • 1970-01-01
    • 2013-09-26
    • 2011-05-01
    • 2021-05-21
    • 2012-07-22
    相关资源
    最近更新 更多