2010-04-25 70 views
7

這可能是一個愚蠢的問題,但我想計算一個算法的複雜度,而且我不確定要爲memmove()函數考慮什麼複雜性。我應該考慮memmove()O(n)還是O(1)?

你能幫忙/解釋一下嗎?

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

因此是O(num)或O(1)的複雜性。我想這是O(num),但我不確定,因爲我現在缺乏對引擎蓋下發生的事情的理解。

+1

正確的答案可能是它依賴於實現。你可以想象一個不尋常的系統,其中內存實際上是一些複雜的圖形或鏈表。在每個真實的系統中,我知道它與num成正比。 – 2010-04-25 21:29:12

回答

11

由於memmove的運行時間與需要移動的字節數成正比增加,因此爲O(n)。

+6

O(n)是正確的漸近複雜度,但我不認爲我會在這種情況下使用術語「直接比例」,即使像「memmove」這樣簡單的東西。考慮在32位架構上n = 4與n = 1個字節:n = 1的情況實際上可能是更昂貴的操作! – 2010-04-25 21:42:18

+0

這是'O(n)',其中'n'是傳遞給'memmove()'的計數 - 但這可能與您用來表徵算法的'n'成比例。 – caf 2010-04-26 00:05:14

2

你是如何將memmove()操作應用到算法中的所選元素或全部元素的?你是否多次將memmove()應用於元素?

這些都是對算法的複雜性有影響的事情。

即答案可以是不同的,所述的memmove()本身複雜關於char元件陣列,與(對於該memmove()爲O(n)的操作)memmove()交易。