我需要从一个有超过200万行的文件构建一个二进制搜索树(每行会给我一对键/ val)。由于数据是有序的,如果我只读了一行,得到键和val并添加到我的树中,高度将是巨大的,因此树搜索效率低下。所以,我在想是否有一个很好的方法来构建这个搜索树,以便它没有很大的高度。 我的尝试是获得前100,000个键,随机播放,放在树上等等,但它看起来效率不高。有什么建议吗?
P.S:我必须使用不平衡的搜索树。
谢谢!
答案 0 :(得分:1)
如果您可以多次读取该文件,您可以在第一次读取该文件并在列表中读取1000个条目(即每2000行一个),然后进行第一次平衡插入,以便首先插入位置500处的元素然后两个在250和750位置,然后在位置125,375,625,975等位置4。 在第一遍之后,您可以读取整个文件(并管理重复项)并获得更平衡的树。
另一种方法是根本不使用BinarySearchTree,而是使用数组,因为数据是有序的,你可以使用二进制搜索(你检查数组中间的值,如果你获得的值更大,你重复使用列表的前半部分进行操作,它使用列表的后半部分的值较低);但我不知道使用列表是否符合您的要求。
答案 1 :(得分:0)
作为旁注,当你已经交出一个排序数组时创建一个BST是一件很疯狂的事情,但除此之外......
如果您已经获得了一个已排序的数组,它实际上为您提供了如何构建具有最小高度的平衡BST的答案。为简单起见,我们假设数组是:
[0,1,2,3,4,5,6,7,8,9,10]
在这种情况下,为根据平衡树存储的最佳元素是什么?自然答案是列表的中间部分5
。
那么我们留下了数组的两个子范围:
i<5: [0,1,2,3,4]
i>5: [6,7,8,9,10]
那么存放在左孩子身上的理想因素是什么?我们再次采用左子列表的中心(i<5
),那将是2
,我们有两个子范围:
i<2: [0,1]
i>2: [3,4]
我们可以递归地重复这个逻辑,直到我们在两个范围内留下一个子节点或者没有一个子节点,此时我们已经创建了一个叶子节点。
递归地应用于每个分支的两侧,向下钻到叶子,这将为您提供最佳的平衡树。