我有一个[{"score": 68},{"score": 78}]
我需要找到使用所有对象的分数制作的标准二叉搜索树的高度。我该怎么办?
这就是我正在做的事情。我首先获得所有分数并存储在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
处理),因此内容中有多个条目。我能否使这个陈述更加节省时间。如果是,如何?
答案 0 :(得分:0)
1)是/否。如果你已经为每个节点添加了一个属性,该属性计算了节点插入树中的次数,那么你仍然有一个BST,答案是肯定的。
如果您确实需要重复节点,则需要修改BST属性。未修改的属性表示小于X的项目向左移动,大于X的项目向右移动。如果您改为向X表示大于或等于X的项目,则很容易看到您可以通过添加许多重复项目使树木任意高,答案为否。
2)你试过list(content)
吗?当然,如果不以某种方式删除重复节点,则无法构建BST,这不能用于计算BST的高度。您需要删除重复的项目。这导致了你的第三个问题。
3)关于print set(i['score']...
你不应该像这样把不同的问题捆绑在一起,因为它会引导你走上黑暗的道路,让不同的答案解决你问题的不同部分。但是,您编写的代码确实有Pythonic的内容。所以你必须问自己,是否真的值得你的时间(这通常是真正重要的时间),试图找到一个更复杂但更快的解决方案。