2010-04-25 9 views
7

das mag eine dumme Frage sein, aber ich möchte die Komplexität eines meiner Algorithmen berechnen, und ich bin mir nicht sicher, welche Komplexität für die memmove() Funktion zu berücksichtigen ist.Sollte ich memmove() O (n) oder O (1) betrachten?

Können Sie mir bitte helfen/erklären?

void * memmove (void * destination, const void * source, size_t num); 

So ist die Komplexität O (num) oder O (1). Ich nehme an, es ist O (num), aber ich bin mir nicht sicher, da mir momentan das Verständnis fehlt, was unter der Haube passiert.

+1

Die richtige Antwort ist wahrscheinlich, dass es implementierungsabhängig ist. Sie können sich ein ungewöhnliches System vorstellen, in dem Speicher wirklich ein komplexes Diagramm oder eine verkettete Liste ist. In jedem realen System ist mir bewusst, dass es proportional zu num ist. –

Antwort

11

Da die Laufzeit von memmove in direkter Proportionalität mit der Anzahl der Bytes steigt, um die es sich zu bewegen gilt, ist es O (n).

+6

O (n) ist die korrekte asymptotische Komplexität, aber ich glaube nicht, dass ich in diesem Zusammenhang den Begriff "direkte Proportionalität" verwenden würde, selbst für etwas so Einfaches wie "memove". Betrachte n = 4 vs. n = 1 Byte auf einer 32-Bit-Architektur: Der Fall n = 1 könnte tatsächlich die teurere Operation sein! –

+0

Es ist "O (n)", wobei "n" die an "memmove()" übergebene Zahl ist - aber das ist möglicherweise nicht proportional zu dem "n", mit dem Sie Ihren Algorithmus charakterisieren. – caf

2

Woran wenden Sie die Operation memmove() an - ausgewählte Elemente im Algorithmus oder alle? Wenden Sie memmove() auf Elemente mehr als einmal an?

Das sind die Dinge, die für die Komplexität des Algorithmus von Bedeutung sind.

Diese Antwort unterschiedlich sein können, dass die Komplexität von memmove() selbst die Anordnungen von char Elemente in Bezug auf die memmove() beschäftigt sich mit (für die memmove() ist ein O (n) -Operation).

Verwandte Themen