[英]Time complexity of the java code
我正在學習課程的算法課程,我堅持這個特殊的問題。 我應該找到這段代碼的時間復雜度。
int sum = 0
for (int i = 1; i <= N*N; i = i*2)
{
for (int j = 0; j < i; j++)
sum++;
}
我在eclipse本身檢查了它,對於N的任何值,sum語句的執行次數小於N.
final value of sum:
for N=8 sum=3
for N=16 sum=7
for N=100000 sum=511
因此,時間復雜度應小於N,但給出的答案是N提升到冪2,怎么可能?
到目前為止我做了什么:
第一個循環將運行log(N ^ 2)次,因此第二個循環將執行1,2,3 .. 2 logN
第一個內環將是1 + 2 + 4 + 8 .. 2 ^ M,其中2 ^ M <= N * N.
2到N * N的冪的總和約為2 * N * N或O(N ^ 2)
注意:當N = 100000時,N * N將溢出,因此其結果具有誤導性。 如果你認為溢出是問題的一部分,對於大數,總和是相當隨機的,所以你可以爭論它的O(1),即如果N = 2 ^ 15,N ^ 2 = 2 ^ 30並且總和將是整數.MAX_VALUE。 沒有更高的N值會給出更高的總和。
這里存在很多混淆,但重要的是Big-O符號完全與增長率有關,或者像數學家所說的那樣限制行為 。 函數將在O(n * n)中執行意味着執行的時間將比例如n增加得更快,但是比例如2 ^ n更慢。
在使用big-O表示法進行推理時,請記住常量“不計算”。 這個特定問題有幾個問題。
N*N
表達式會導致O(log n * n)復雜度... i = i*2
導致外循環執行大約log n,如果內循環的內容在一個獨立的時間內運行,函數將在O(log n)中n 。 希望這能解決問題。
因此sum ++將執行1 + 2 + 4 + 8 + ... + N * N,總log2(N * N)次。 幾何級數之和1 *(1 - 2 ^ log2(N * N)/(1-2)= O(N * N)。
你的外環是log(N ^ 2) - > 2 * log(N) - > log(N),你的內環是N ^ 2 / 2-> N ^ 2。 因此,時間復雜度為N ^ 2 * log(N)。
關於基准測試,N = 8或N = 16的值是荒謬的,循環中的時間與設置JVM,緩存失敗等相關是微不足道的。 你必須:
從最大的N開始,檢查它的評估方式。
使用N的每個值進行多次運行。
認為時間復雜度是當N變得非常大時算法如何工作的度量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.