【问题标题】:Algorithm and data structure to store First name and last name存储名字和姓氏的算法和数据结构
【发布时间】:2012-01-25 15:31:47
【问题描述】:

有没有一种有效的方法将名字和姓氏存储在数据结构中,以便我们可以使用名字或姓氏进行查找?我会考虑一个带有名字的二叉搜索树。搜索名字会很有效。但是在尝试搜索姓氏时效率不高。我们还可以考虑另外一个带有姓氏的 BST。有什么想法可以有效地实施吗?

如果问题是什么

字符串名称[] = { "A B","C D"};

一个要求是能够在运行时动态扩展这个目录, 没有持久存储。该目录最终可以增长到数百或 数以千计的名字,并且必须可以按名字或姓氏搜索。

现在我们不能存储哈希表。有什么想法吗?

【问题讨论】:

  • 这个问题似乎有点模糊,你想给定一个字符串,搜索匹配的姓氏还是名字,你想分别按姓氏和姓氏搜索,还是做您想搜索名字/姓氏组合吗?对于前两种情况,我会使用单独的 BST,对于最后一种情况,您可以使用嵌套在 BST 中的 BST
  • 你可以想象成一个通讯录场景。我们得到了一个名称列表,例如 emp.setName("A","J"), emp.setName("B","C"),... 我需要在按名字搜索时获取 emp 详细信息或姓氏
  • 在上述情况下也可以吗?

标签: algorithm language-agnostic data-structures contacts binary-search-tree


【解决方案1】:

为什么不把名字和姓氏都放在一个trie中?

作为奖励,通过这种方式,您甚至可以通过遍历当前节点之后的所有叶子来获得关于部分名称的建议(可能在异步调用中)

【讨论】:

  • Trie 和哈希一样快,而且不会发生哈希冲突。
【解决方案2】:

如果您只需要按名字或姓氏搜索,那么是的,两个哈希图是最好的(请注意,您不是在复制数据,而是在对它进行分区)但是如果您不介意那么将名字和姓氏放在一个哈希图中,不要区分两者。

【讨论】:

    【解决方案3】:

    另外,请参阅Does Java have a HashMap with reverse lookup?...,它是 Java 特有的,但有关数据结构的讨论与任何语言都相关。

    请注意,双向排序映射等结构也允许范围搜索(双哈希表不允许)。

    【讨论】:

      【解决方案4】:

      你的想法很不错,但这里有另一个选择:如何实现哈希表?

      第一个哈希表将使用名字作为键,关联的值将是姓氏或指向 Name 对象的指针。第二个哈希表将使用姓氏作为键,使用名字或指向 Name 的指针作为值。

      就个人而言,为了选择值,我会选择指向 Name 对象的指针,因为如果您想存储更多信息(例如出生数据等),这种方法会更适用

      【讨论】:

        【解决方案5】:

        两个哈希表:一个从名字到人,一个从姓到人。

        简单就是最好的。

        【讨论】:

        • 是的,这个解决方案很简单,但您认为它有效吗?我需要两个哈希图来处理相同的数据?
        • 嗯,它很快:平均 O(1) 查找。插入和删除平均也是 O(1),空间是 O(n)。您不是存储相同的数据两次,而是存储查找表。我不认为你会渐近地比这更好。我不知道你会有多少联系人,但我看不出这是内存瓶颈。
        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        相关资源
        最近更新 更多