Ich versuche, die Zeit Komplexität dieser algorithm zu finden.Zeit Komplexität eines iterativen Algorithmus
Der iterative: -Algorithmus erzeugt alle Bitstrings innerhalb einer gegebenen Hamming-Distanz, ausgehend von der eingegebenen Bitfolge. Er erzeugt alle ansteigenden Folgen 0 <= a[0] < ... < a[dist-1] < strlen(num)
und setzt Bits bei entsprechenden Indizes zurück. Der Vektor a
soll Indizes beibehalten, für die Bits invertiert werden müssen. Wenn also a den aktuellen Index i
enthält, drucken wir 1 statt 0 und umgekehrt. Ansonsten drucken wir das Bit als (siehe else-Teil) ist, wie unten dargestellt:
// e.g. hamming("0000", 2);
void hamming(const char* num, size_t dist) {
assert(dist > 0);
vector<int> a(dist);
size_t k = 0, n = strlen(num);
a[k] = -1;
while (true)
if (++a[k] >= n)
if (k == 0)
return;
else {
--k;
continue;
}
else
if (k == dist - 1) {
// this is an O(n) operation and will be called
// (n choose dist) times, in total.
print(num, a);
}
else {
a[k+1] = a[k];
++k;
}
}
Was ist die Zeitkomplexität dieses Algorithmus?
Mein Versuch, sagt:
dist * n + (n wählen t) * n + 2
aber dies scheint nicht wahr zu sein, die folgenden Beispiele betrachten, die alle mit dist = 2:
Hier sind zwei repräsentative Läufe (mit dem Druck, der am Sta geschehen soll) rt der Schleife):
000, len = 3
k = 0, total_iter = 1
vector a = -1 0
k = 1, total_iter = 2
vector a = 0 0
Paid O(n)
k = 1, total_iter = 3
vector a = 0 1
Paid O(n)
k = 1, total_iter = 4
vector a = 0 2
k = 0, total_iter = 5
vector a = 0 3
k = 1, total_iter = 6
vector a = 1 1
Paid O(n)
k = 1, total_iter = 7
vector a = 1 2
k = 0, total_iter = 8
vector a = 1 3
k = 1, total_iter = 9
vector a = 2 2
k = 0, total_iter = 10
vector a = 2 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[email protected]:~/Desktop/generate_bitStrings_HammDistanceT$ ./iter
0000, len = 4
k = 0, total_iter = 1
vector a = -1 0
k = 1, total_iter = 2
vector a = 0 0
Paid O(n)
k = 1, total_iter = 3
vector a = 0 1
Paid O(n)
k = 1, total_iter = 4
vector a = 0 2
Paid O(n)
k = 1, total_iter = 5
vector a = 0 3
k = 0, total_iter = 6
vector a = 0 4
k = 1, total_iter = 7
vector a = 1 1
Paid O(n)
k = 1, total_iter = 8
vector a = 1 2
Paid O(n)
k = 1, total_iter = 9
vector a = 1 3
k = 0, total_iter = 10
vector a = 1 4
k = 1, total_iter = 11
vector a = 2 2
Paid O(n)
k = 1, total_iter = 12
vector a = 2 3
k = 0, total_iter = 13
vector a = 2 4
k = 1, total_iter = 14
vector a = 3 3
k = 0, total_iter = 15
vector a = 3 4
+1. Betreff: "N_INCR_SEQ (n, dist) ist die Anzahl ansteigender Folgen natürlicher Zahlen
ruakh
Eine Implikation Ihrer Analyse ist übrigens, dass das OP die Leistung seines/ihres Codes minimal korrigieren konnte, indem er die Zeile "if (++ a [k]> = n)" in "if (++ a [k]" änderte > n - dist + k) '. Das würde alle unnötigen/unproduktiven Hin- und Herdurchgänge eliminieren. – ruakh
In der Tat @ Ruakh, aber ich mag Pauls Code mehr, es scheint eleganter zu meinem jungen Auge! Also eine gesamte Zeit Komplexität von O ((n wählen dist) * n) ... – gsamaras