簡體   English   中英

考慮以下代碼片段。 假設A [0…n]是一個數組,其元素是0到n之間的自然數

[英]Consider the following code fragment. Suppose that A[0…n] is an array whose elements are natural numbers between 0 and n

我在stackoverflow的第一篇文章中,我遇到了有關算法的問題。

考慮以下代碼片段。 假設A [0 ... n]是一個數組,其元素是0到n之間的自然數。

    for i=0 to n-1 do {
        for j=n-i-1 to 0 do{
            if(A[j] <= A[j+1]){
               print A[j]-A[j+1];
            }
        }
    }

(a)作為n的函數,print語句可能的最大次數是
執行? 導致這種最壞情況的A中條目的模式是什么? 將您的答案表示為求和,然后將其求和的結果表示為涉及n的精確(非漸近)公式。

(b)作為n的函數,輸出語句可以執行的最小次數是多少? 導致這種最佳情況的A中條目的模式是什么? 對於這一部分,您可以漸近表達您的答案。

對於A,我的輸入模式為1,2,3,...,n-1

給我f-(n-1)+(n-2)+ ... + 1 = O(n ^ 2)

對於B,我認為如果條件不滿足,最小執行量可以為零,但不確定如何繼續執行。

我不確定這兩個部分,將不勝感激的解釋/協助。

這段代碼是我們需要確定何時執行打印語句的部分:

if(A[j] <= A[j+1]){
    print A[j]-A[j+1];
}

因此,只要我們遇到兩個連續的值,就會執行打印語句,這樣索引較小的值將小於索引較大的值。 因此,對於任何升序排列的數組,如果從不降序排列,則將對每個j執行打印語句。

連同陣列的規格,這導致了陣列

worstcase = [0, 1, 2, ..., n]
bestcase = [n, n-1, n-2, ..., 0]

現在,在最壞的情況下,將始終執行打印語句,因此:

result = 0;
for i=0 to n-1 do {
    for j=n-i-1 to 0 do{
        result += 1;
    }
}

result是打印執行的次數),這顯然等於:

result = 0;
for i=0 to n-1 do {
    result += n - i;
}

要么

result = 0;
for i=1 to n do{
    result += i;
}

所以result = (n + 1)*n/2這將是O(n^2)

現在,在最壞的情況下,我們可以應用相同的模式:

result = 0;
for i=0 to n-1 do {
    for j=n-i-1 to 0 do{
        result += 0;
    }
}

顯然可以將其簡化為result = 0 ,即O(1) 通常,這可以用一種更數學的方式來表示,但是由於我並不是乳膠專業人士,因此您必須自己考慮加號。

暫無
暫無

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

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