簡體   English   中英

假設這個函數在線性(O(n))時間內運行,我是否正確?

[英]Would I be correct in assuming this function runs in linear (O(n)) time?

這是我用偽代碼編寫的函數:

partition(itemList) {
    numPackets = calculateNumOfPackets(listSize, packetSize); 
    indexOfNextItem = 0; 
    packetQueue = initialize(numPackets); 
    for (i = 0; < numPackets; i++) {
        // Initialized as a fixed-size list 
        Packet p = createNew(packetSize); 
        for (j = indexOfNextItem; j < itemList.length; j++) {
           // hasRoom() returns false when packet is at capacity
            if (p.hasRoom()) 
                // Guaranteed to run in constant time due to predefined capacity
                p.add(item[j]); 
            else {
                indexOfNextItem = j; // keep track of next index for inner loop
                break; 
            }   
        } // end inner
        packetQueue.add(p); 
    } // end outer
    return packetQueue; 
}

我希望很清楚,這只是進行分區並返回包含輸入列表項目的“數據包”分區隊列。 現在我很確定這是在線性時間內運行的,因為對於外循環的每次迭代,內循環都沒有完全運行; 它只會運行到當前數據包已滿,此時它會保留它停止的索引的緩存,然后跳出內部循環。 結果,我懷疑這實際上是在線性時間內運行的。

我是否正確理解這一點?

如果createNew(packetSize)packetSize中是線性的,則initialize(numPackets)numPackets中是線性的並且p.hasRoom()p.add()itemList[i]packetQueue.add(p)都是 O(1),你的算法是 O( listSize ) (假設listSizelen(itemList)

證明的草圖是每個內循環最多執行packetSize O(1) 操作,並且該內循環最多執行ceil(listSize / packetSize) ,因此操作總數最多將運行(numPackets + 1) * packetSize * n ,其中n是與每個循環中完成的操作數相關的常數。

您的其中一條評論指出:

給定一個項目列表,該算法應該將一定數量的這些項目添加到數據包(表示為固定大小的列表)並返回所述數據包的隊列。 因此,如果輸入列表有 100 個項目,並且允許的最大數據包容量為 10,那么您將得到一個包含 10 個數據包的隊列,每個數據包有 10 個項目。

如果這是真的,那么,由於每個項目僅包含在 1 個數據包中,因此您的算法在項目數量( O(itemList.length) )上是線性的 - 假設將項目放入數據包是恆定時間。

僅當循環計數器是獨立的時,計算嵌套循環才有意義。 如果您知道,就像在這種情況下,列表中的每個項目都被訪問一次且僅一次,並且該訪問是恆定時間的,那么您可以自信地聲明此類代碼在項目數量上是線性的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM