Derzeit mache ich ein Projekt für meine Universität, wo ich bekannte Datenstrukturen (Array, Linked List, BST, etc.) implementieren und ich muss die Zeiten, die einige Operationen auf ihnen erfordern. Zum Beispiel war die erste für mich Array. Ich habe die Zeit für das Hinzufügen eines Elements in der Mitte eines Arrays gemessen (mit weiteren Werten von c, also n = n + 1
. Es gab natürlich O(n)
, wobei n eine Anzahl von Elementen ist. Jetzt muss ich prüfen, ob ein Element hinzugefügt wird . zu Beginn des Array und ein Element, um es anhängt (Hinzufügen zu Ende) ich habe zwei einfache Algorithmen bekommt (ich nicht STL
oder boost::
verwenden):Complexal Komplexität der sortierten Array
Hinzufügen zum Anfang:
void array::beginning_append(int value)
{
int *temp = new int[n + 1];
memcpy(temp + 1, table, sizeof(int) * n);
n = n + 1;
temp[0] = value;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
Angehängt an das Ende:
void array::append(int value)
{
int *temp = new int[n + 1];
memcpy(temp, table, sizeof(int) * n);
temp[n] = value;
n = n + 1;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
Das sind Methoden oder array
Klasse, wobei table
und n
Mitglieder dieser Klasse sind. Jetzt unterscheiden sich diese nicht so sehr, ich dachte, dass ihre Zeiten gleich sein werden, und sie sind (ich überprüfte mit QueryPerformanceCounter
für große Anzahl von Elementen, wie 500000
, und es gab mir O(n)
Komplexität), aber mein Dozent sagte, dass das Hinzufügen zu Beginn wird O(n)
Rechenkomplexität haben, aber das Hinzufügen oder Entfernen eines Elements vom Ende wird eine Komplexität von O(1)
haben, so dass es const sein wird, unabhängig von der Anzahl der Elemente. So würde Ich mag euch fragen, ob meine Algorithmen schlecht sind, ich meine, sie unnötigen Dinge zu tun, und das ist, warum sie auf der Anzahl der Elemente verlassen, oder mein Dozent war einfach falsch
vorgeben statt zu betteln append? :) – gsamaras
Ich prolly sollte das tun: D Wenn ich kodiere, meine Fähigkeit zu sprechen, oder schreiben Sie richtiges Englisch abnimmt, so fe ich schreibe 'anfing' statt' Anfang' – Frynio
Die Zeiten unterscheiden sich nicht, weil in beiden Fällen Sie ordnen das gesamte Array neu zu und kopieren es. Wenn Sie verstehen wollen, warum das Anhängen an das Ende konstant ist, lesen Sie über _amortized konstante Zeit_ – paddy