我试图了解下面代码中的Big-O是什么。
代码应该做什么
基本上,我试图选择随机节点的子集(max size = selectionSize)以及它们之间存在的任何边。随机节点的选择在while
循环中完成。完成后,我想选择所选节点之间存在的任何边。
我认为是什么&为什么
我认为运行时间为
编辑 :呃第二个想法......没关系...... O = n^2
n=selectionSize
。原因是:即使我可以增加nodes
中元素的大小(例如将其设为10000),我也不相信它会影响算法,因为我只是循环遍历{{1}的最大值1}}。我有点担心这是错误的唯一原因是因为selectionSize
循环,我从列表中选择随机元素,直到我有足够的。虽然这可能需要很长时间(因为它是随机的),但我认为它不会影响整体输出的时间。while
大小会对它产生影响(因为nodes
最多可以达到这个大小[{1}})..所以我认为如果node.getNeighbors()
等于nodes
的大小,则运行时间为selectionSize
,其中nodes
。< / p>
任何提示/提示都将不胜感激。
代码
O=n^2
答案 0 :(得分:1)
如果override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
super.touchesBegan(touches , with:event)
}
适用于替换(同一节点可以选择两次),那么大o是not defined,因为你有一个可能无限循环(你最终可能会再次选择同一节点)再次)。
如果它没有替换就可以工作,那么它是selectRandomNode(nodes);
(在最坏的情况下,每个节点都可以连接到每个其他节点)。
<小时/> 选择无需替换的注意事项:
考虑给您一个大小为O(n^2)
的数组,例如n
和一个空数组A
的情况。 A中的所有元素都是唯一的。
任务是使用从B
随机选择的B
元素填充n
。希望A
中至少应有k
个唯一元素。
可以证明,具有B
个唯一项目的概率随着k
的增加而增加(我在图之后添加了等式)。
n
和n
的差异增加,单次通过(即,小于n
步骤)中的循环完成的概率变大。
如果你仔细想想它会非常直观,数学就是最重要的。
k
答案 1 :(得分:0)
如果我理解这一点,我不是百分百肯定的。但是让我们分解一下: while -Loop运行“selectionSize” - 最佳情况和最差情况n(其中n是节点数量)
因此randomNodeList的大小在O(n)中。 在一个简单的图中,您可以有O(n-1)个邻居。所以整个循环必须在O(n ^ 2)(因为 n *(n-1))
公理是正确的。实际上不可能找到该算法的上限。这是不确定的。这取决于你的随机数。