我已经实现了自己的QuadTree,而且我在查询树时恐怕没有正确地使用产率,我担心我会创建O(HN)迭代器。
你能告诉我如何更好地提高以下代码的性能吗?
QuadTree
public IEnumerable<T> Query(string leafId, Circle shape)
{
// Gets the relevant parent by a leafId Query (this is O(lg H))
var startNode = GetParentIntersecting(leafId, shape);
return startNode.Query(shape);
}QuadTreeNode
public IEnumerable<T> Query(IShape shape)
{
var results = new HashSet<T>();
foreach (var content in _contents)
{
if (shape.Contains(content.GetPosition()))
{
//Debug.Log(content.GetPosition());
yield return content;
//results.Add(content);
}
}
if (IsLeaf)
yield break;
foreach (var node in Nodes)
{
if (node.IsEmpty && node.IsLeaf)
continue;
foreach (var result in node.Query(shape))
{
results.Add(result);
};
}
}发布于 2020-01-01 22:43:28
如果正确地使用产率,则可以从嵌套循环中生成。但是你的第一个预言背后的所有代码都是无用的,它没有做任何有用的事情。
首先,yield break是无用的,因为后面没有更多的收益,无论IsLeaf是真还是假,都不会产生更多的返回值。无论如何,迭代都会结束。
第二,用某些内容填充results,但是结果的内容丢失了,然后该方法退出。
https://codereview.stackexchange.com/questions/234879
复制相似问题