Python-如何找到标准二叉搜索树的高度?

时间:2014-01-04 17:10:52

标签: python json binary-search-tree

我有一个[{"score": 68},{"score": 78}]

类型的json文件

我需要找到使用所有对象的分数制作的标准二叉搜索树的高度。我该怎么办?

这就是我正在做的事情。我首先获得所有分数并存储在json文件中,然后应用公式。

import ijson 
import math

f = open ('data_large')
content = ijson.items(f, 'item')
n = len(list(i['score'] for i in content))

height = math.ceil(math.log((n+1),2)-1)

print height

嗯,这确实给了我正确答案,但想知道两件事?

1)如果列表中有重复项,此公式是否也有效,因为我需要开发一个可以重复的BST?

2)我认为n = len(list(i['score'] for i in content))没用,因为我不需要节点值来计算BST的高度,而只需要列表的长度。有什么方法可以计算条目数,这样我就可以省略这一行并计算json文件中条目的总数,这将用于n的目的吗?

另一件事是我也想计算出来自文件的独特分数。所以,这就是我正在做的print set(i['score'] for i in content),但由于文件太大(201secs所以需要执行256MB,因此对于快速使用ijson 处理),因此内容中有多个条目。我能否使这个陈述更加节省时间。如果是,如何?

1 个答案:

答案 0 :(得分:0)

1)是/否。如果你已经为每个节点添加了一个属性,该属性计算了节点插入树中的次数,那么你仍然有一个BST,答案是肯定的。

如果您确实需要重复节点,则需要修改BST属性。未修改的属性表示小于X的项目向左移动,大于X的项目向右移动。如果您改为向X表示大于或等于X的项目,则很容易看到您可以通过添加许多重复项目使树木任意高,答案为否。

2)你试过list(content)吗?当然,如果不以某种方式删除重复节点,则无法构建BST,这不能用于计算BST的高度。您需要删除重复的项目。这导致了你的第三个问题。

3)关于print set(i['score']...你不应该像这样把不同的问题捆绑在一起,因为它会引导你走上黑暗的道路,让不同的答案解决你问题的不同部分。但是,您编写的代码确实有Pythonic的内容。所以你必须问自己,是否真的值得你的时间(这通常是真正重要的时间),试图找到一个更复杂但更快的解决方案。