我正在尝试理解下面代码的Big-O。
代码的目的
本质上,我试图选择随机节点的子集(最大大小= selectionSize),以及它们之间存在的任何边。选择随机节点是在while
循环中完成的。在完成此操作后,我想选择任何存在于所选节点之间的边缘。
我认为代码的时间复杂度和原因
我认为运行时间为
编辑:呃,在重新考虑之后...算了... O = n^2
,其中n=selectionSize
。原因是:即使我可以增加nodes
中元素的大小(例如将其设置为10000),我也不认为它会影响算法,因为我只循环最大的selectionSize
。我有点担心这是错误的唯一原因是while
循环,在该循环中,我从列表中选择随机元素,直到达到所需数量。虽然这可能需要很长时间(因为它是随机的),但我认为它不会影响整体输出的时间。nodes
的大小确实会影响它(因为node.getNeighbors()
最多可以是nodes
的大小)。因此,如果selectionSize
等于nodes
的大小,则运行时间为O=n^2
,其中n=nodes的大小
。
欢迎提供任何提示/建议。
代码
// nodes and selectionSize are my input:
int[] nodes = {1,2,3...,1000}; // 1000 elements
int selectionSize = 500; // This can be at most the size of the elements (in this case 1000)
run_algo(nodes, selectionSize);
public void run_algo(int[] nodes, int selectionSize) {
randomNodesList = {};
while(randomNodesList < selectionSize) {
randomNode = selectRandomNode(nodes); // Assume O(1)
if(!randomNodesList.exists(randomNode)) { // Assume O(1)
randomNodesList.push_back(randomNode); // Assume O(1)
}
}
foreach(node in randomNodesList) {
foreach(neighbor in node.getNeighbors()) { // Max. nodes size (in this case 1000)
if (!randomNodesList.exists(neighbor)) { // Assume O(1)
AddEdge(node, neighbor); // Takes O(1) time
}
}
}
}