【问题标题】:How to store contact information如何存储联系信息
【发布时间】:2012-06-16 18:20:46
【问题描述】:

存储联系信息[姓名、电话号码]的最佳数据结构是什么?

Trie 可用于在给出姓名时搜索电话号码。
如果我想根据他的电话号码找到一个人的名字怎么办。即当我知道电话号码时如何找到姓名?
trie 对此类搜索有效吗?

【问题讨论】:

  • 搜索是您唯一需要支持的操作吗?
  • 不,除了搜索,我还想要轻松插入记录。

标签: c data-structures trie


【解决方案1】:

是的,尝试一下很好。您可以使用电话号码中的位(如果您将它们存储为整数),而不是使用字符串中的字符作为每个级别的键。出于速度原因,您可能决定一次使用 3 或 4 位。

这可以通过拥有一个存储当前身份信息的 trie 结构和一个指向子 trie 结构的指针数组来实现。

struct phone_number_trie {
   struct contact_info *info;
   struct phone_number_trie *children[4]; //  or 2, 8 or 16 etc.
};

例如将电话号码'83'(二进制为1100011)存储在根为root的树中,您可能会屏蔽低2位(例如& 3),即11,因此您可以使用电话号码11000 的剩余位向下递归到root->children[3](即右移2)。下一个索引是0,然后是10,然后是1(所以你会指向root->children[3]->children[0]->children[2]->children[1])。此时,您的电话号码中已没有设置位,因此您找到了正确的插入位置。

(您也可以考虑使用Patricia trie,但这明显更难实现。)

【讨论】:

  • 我读过帕特里夏树。但这并不能解决我的问题。我的问题是当用户想通过电话号码搜索并按姓名搜索时该怎么办。
  • (Patricia trie 仅适用于您想要非常快速的查找(它比普通 trie 更难实现)。)您应该只有一个将名称映射到 contact_infos 的 trie 和一个将电话号码映射到contact_infos(即两次尝试),因此当您插入时,您分配您的contact_info 结构并在每个尝试中设置适当的指针以指向该结构,然后您可以搜索在适当的尝试中。 (这能回答你的问题吗?)
  • 是的。当然..但是你不认为我们最终会存储两次相同的数据吗?我们有办法减少空间吗?
  • 不是很明显,至少不是以保持快速查找和插入的方式。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2016-08-07
  • 2021-04-19
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多