algorithm - 使用 BST 搜索多个字段

标签 algorithm data-structures binary-search-tree

假设我们需要创建一个地址簿,它可以提供多个字段的搜索功能,并且包含大量记录。结构非常简单——姓名、电话号码和城市名称。

我可以输入“以 Ron 开头...”或“以 202 开头...”或“以 Arling 开头...”

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

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

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

提前致谢。

最佳答案

你可以用一个 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 中有多少项,每次搜索单个树都需要大约两个额外的探针。

关于algorithm - 使用 BST 搜索多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21563398/

相关文章:

python - 循环填充Python中的矩阵

Java 通用类测试

algorithm - 旅行推销员 - 城市预算

algorithm - 查找给定源和一组目的地之间的最短路径

c - 数据结构C

c++ - BST 的 C++ 回调函数和函数指针问题

c++ - 二叉搜索树(BST)

algorithm - 我如何直观地解释 S 形神经网络模型?

c++ - 使用二进制搜索查找 n*m 乘法表中的第 k 个最大数

algorithm - 哪种数据结构可以在 O(logn) 时间内找到给定附加条件的最大对象?