[英]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
) (假設listSize
是len(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.