Ich versuche zu verstehen, was der Big-O des folgenden Codes ist.Ermitteln der Big-O dieses Algorithmus
Was der Code soll
Wesentlichen tun, ich bin versucht, eine Teilmenge (max size = selectionSize) von zufälligen Knoten und alle Kanten zu wählen, die zwischen ihnen besteht. Die Auswahl der zufälligen Knoten erfolgt in der while
Schleife. Nachdem ich das getan habe, möchte ich alle Kanten auswählen, die zwischen den ausgewählten Knoten existieren.
Was ich denke, es & Deshalb
Ich denke, die Laufzeit ist bearbeiten: igitt auf den zweiten Gedanken ... Nevermind ... Die O = n^2
wo n=selectionSize
. Der Grund ist: Obwohl ich die Größe der Elemente in nodes
erhöhen kann (z. B. 10000), glaube ich nicht, dass es den Algorithmus beeinflussen kann, da ich nur das Maximum von selectionSize
durchlaufen habe. Der einzige Grund, warum ich ein bisschen besorgt bin, dass das falsch ist, ist wegen der while
Schleife, wo ich zufällige Elemente aus der Liste auswähle, bis ich genug habe. Das kann ziemlich lange dauern (weil es zufällig ist), aber ich glaube nicht, dass es die Gesamtleistung in Bezug auf die Zeit beeinflusst.nodes
Größe es nicht beeinflusst (da node.getNeighbors()
kann höchstens die Größe des nodes
sein) .. Also ich denke, dass, wenn die selectionSize
gleich die Größe von nodes
, die Laufzeit ist O=n^2
wo n=size of nodes
.
Alle Tipps/Hinweise wären willkommen.
-Code
// 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
}
}
}
}
Hallo @VidorVistrom, danke für den Kommentar. Ich habe meinen Beitrag bearbeitet. Wenn es noch unklar ist, lass es mich wissen. – Moody
Wirklich schwer zu sagen für den schlimmsten Fall, wo der Zufall den gleichen Index jedesmal herauszieht. Sie könnten so leicht über den besten Fall reden. Und das sollte abhängig von der Auswahlgröße linear sein. Weil Ihre Lookups konstant sind und n + n immer noch linear ist. –
@VidorVistrom Danke für den Einblick und Tipp! – Moody