Ich verstehe nicht, wie die Laufzeit des folgenden Algorithmus O (m + n) sein kann. Über den Algorithmus wird es verwendet, um einen gemeinsamen Knoten aus zwei Listen zu finden (die Längen beider Listen können unterschiedlich sein).Warum ist die Laufzeit dieses Algorithmus O (m + n)?
if (len1 < len2)
{
head1 = list2;
head2 = list1;
diff = len2 - len1;
}
Dies sollte O (1) sein.
O (n).
while(head1 != NULL && head2 != NULL)
{
if(head1 == head2)
return head1->data;
head1= head1->next;
head2= head2->next;
}
O (n).
Insgesamt erhalte ich auf O (n^2) ...
hier voll Algorithmus:
struct node* findMergeNode(struct node* list1, struct node* list2)
{
int len1, len2, diff;
struct node* head1 = list1;
struct node* head2 = list2;
len1 = getlength(head1);
len2 = getlength(head2);
diff = len1 - len2;
if (len1 < len2)
{
head1 = list2;
head2 = list1;
diff = len2 - len1;
}
for(int i = 0; i < diff; i++)
head1 = head1->next;
while(head1 != NULL && head2 != NULL)
{
if(head1 == head2)
return head1->data;
head1= head1->next;
head2= head2->next;
}
return NULL;
}
"Insgesamt komme ich zu O (n^2)" Warum denkst du, dass das Ausführen einer 'O (n)' Schleife ** gefolgt von ** einer 'O (n) 'Schleife' O (n^2) '? (Das ist gefolgt von * nicht * innen *). –
Oh, ich wusste das nicht. Wenn wir zum Beispiel eine for-Schleife innerhalb einer for-Schleife haben, wäre das O (n^2), oder? –
@ element115. . . Es hängt davon ab, was die Grenzen der for-Schleifen sind, aber unter vielen Umständen, ja, das wäre O (n^2). –