使用BST搜索多个字段

时间:2014-02-04 21:05:26

标签: algorithm data-structures binary-search-tree

假设我们需要创建一个地址簿,该地址簿可以在多个字段上提供具有大量记录的搜索功能。结构非常简单 - 姓名,电话号码和城市名称。

我可以输入“以罗恩开头......”或“从202开始......”或“从阿灵开始......”

然后它会给我预期的结果。

我想到的第一个解决方案是,创建三个BST,一个基于电话号码,一个基于名称,第三个基于城市。

现在我在想,是否有办法创建一个BST(或任何其他方法),但仍然可以使搜索工作,而不是每次都进行排序?

提前致谢。

1 个答案:

答案 0 :(得分:5)

你可以用一个BST来做。 BST节点将是:

class BSTNode
{
    string Key;
    byte KeyType; // 0=Name, 1=City, 2=Phone
    AddressRec Record;
}

AddressRec当然是对实际地址记录的引用。

您最终在每个记录的BST中都有三个条目。所以给出一个地址记录:

rec0 = { Name = "Jim", City = "Austin", Phone="512-555-1212" }

您可以添加记录:

BST.Add(rec0.Name, 0, rec0);
BST.Add(rec0.City, 1, rec0);
BST.Add(rec0.Phone, 2, rec0);

您的搜索会将记录类型作为参数。

这更容易管理,因为你只有一个BST,但搜索速度会慢一点,但是会有一个常数因素。在BST中搜索是O(log n),并且您的组合BST将具有三个特殊目的树的三倍的节点。它仍然没有线性变慢。也就是说,如果您有1,024个地址条目,那么每个特殊用途树将具有1024个节点。 log2(1024)是10.您的单个树将有3,072个节点。 log2(3,072)是11.58。因此,单个搜索稍微较慢。

但请注意,它因常数因素而略微变慢。考虑一下这个表:

   n   log2(n)   log2(3n)
  16      4        5.58
 128      7        8.58
1024     10       11.58
2^20     20       21.58

平均而言,无论BST中有多少项目,每个搜索都需要大约两个额外的探测。