单个大BST与多个较小的BST?哪个更快?

时间:2014-03-03 10:17:25

标签: performance big-o time-complexity

我将10^9个密钥存储在BST中。 与让我们说有多个大小为10^6的BST包含更大树的大块相比?搜索所有并行执行的内容。

我说的只是搜索性能,因为处理能力不是瓶颈。

2 个答案:

答案 0 :(得分:0)

完全取决于您的密钥架构。

例如,假设你的钥匙是姓氏,平均分布在26个英文字母中。如果您正在寻找Pax Diablo,则可以立即删除25/26的搜索空间,仅查看D树(Diablo)。

使用平衡二叉树,您必须平均遍历4.7树级别(log226 关于 4.700439718)。

所以,是的,如果前期操作的复杂性最小,可以更高效。在给定的示例中,基于名称的第一个字符和查找树的数组查找,选择二十六个tress之一为O(1)


如果您的注释表明密钥实际上是从零到十亿的数字,您仍然可以具有相同的效率,具体取决于数据分布。如果它们是平均分布的(甚至是接近的),你可以根据数字的前三位数保持一千种不同的树(从你的声明中你想要一百万棵树),并将初始搜索减少一个因子1000(约十个树级)。

当然,分发很重要。如果你的所有数字都少于一百万,那么它们都将在第一棵树中,这个方案将为你节省一切(实际上它会增加一个无用的第一步)。

答案 1 :(得分:0)

考虑使用哈希表。查找这么大的键集应该明显更快。与BST的对数相反,散列映射具有恒定的摊销搜索复杂度。

另外,当你在谈论一棵巨大的树时,也许你应该看看b+ trees

我怀疑你尝试采取的方法比使用上述建议更有效。二叉树的深度增长非常缓慢(假设它是平衡的)。另一方面,当您生成输出时,您的方法同步将是麻烦的。