[英]How to find an array of numbers(elements) from array of n numbers whose sum is exactly equal (or nearly equal) to the number x.?
[英]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.