1樓:匿名使用者
折半查詢需要先對資料進行排序。
#include
using namespace std;
int bsearch(int data, const int x, int beg, int last)
while(beg <= last)
else if (data[mid] < x)
else if (data[mid] > x)
}return -1;
}int rbsearch(int data, const int x, int beg, int last)
else if (x < data[mid])
else if (x > data[mid])
}int main(void)
;//int num = 3;
int num=30;
cout << "the array is : " << endl;
int n = sizeof(data)/sizeof(int);
for (int i = 0; i < n; i++)
cout << endl;
int index = -1;
//index = bsearch(data,num,0,n);
index = rbsearch(data, num, 0,n);
cout << "index of " << num << " is " << index << endl;
system("pause");
return 0;
}以上是氣泡排序演算法的實現。
折半查詢演算法描述如下:
在有序表中,把待查詢資料值與查詢範圍的中間元素值進行比較,會有三種情況出現:
1) 待查詢資料值與中間元素值正好相等,則放回中間元素值的索引。
2) 待查詢資料值比中間元素值小,則以整個查詢範圍的前半部分作為新的查詢範圍,執行1),直到找到相等的值。
3) 待查詢資料值比中間元素值大,則以整個查詢範圍的後半部分作為新的查詢範圍,執行1),直到找到相等的值
4) 如果最後找不到相等的值,則返回錯誤提示資訊。
實現如下:
#include
using namespace std;
int bsearch(int data, const int x, int beg, int last)
while(beg <= last)
else if (data[mid] < x)
else if (data[mid] > x)
}return -1;
}int rbsearch(int data, const int x, int beg, int last)
else if (x < data[mid])
else if (x > data[mid])
return -1;
}int main(void)
;int num = 3;
cout << "the array is : " << endl;
int n = sizeof(data)/sizeof(int);
for (int i = 0; i < n; i++)
cout << endl;
int index = -1;
//inedx=bsearch(data,num,0,n);
index = rbsearch(data, num, 0,n);
cout << "index of " << num << " is " << index << endl;
system("pause");
return 0;
}複雜度分析:
折半查詢就像搜素二叉樹:中間值為二叉樹的根,前半部分為左子樹,後半部分為右子樹。折半查詢法的查詢次數正好為該值所在的層數。
等概率情況下,約為log2(n+1)-1,其演算法複雜度為o(log(n))。
遞迴演算法和非遞迴演算法在分析時間複雜度和空間複雜度上為什麼不同
2樓:奔跑的窩牛的家
在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:
(1)代入法(substitution method)
代入法的基本步驟是先推測遞迴方程的顯式解,然後用數學歸納法來驗證該解是否合理。
(2)迭代法(iteration method)
迭代法的基本步驟是迭代地遞迴方程的右端,使之成為一個非遞迴的和式,然後通過對和式的估計來達到對方程左端即方程的解的估計。
(3)套用公式法(master method)
這個方法針對形如「t(n) = at(n/b) + f(n)」的遞迴方程。這種遞迴方程是分治法的時間複雜性所滿足的遞迴關係,即一個規模為n的問題被分成規模均為n/b的a個子問題,遞迴地求解這a個子問題,然後通過對這a個子間題的解的綜合,得到原問題的解。
(4)差分方程法(difference formula method)
可以將某些遞迴方程看成差分方程,通過解差分方程的方法來解遞迴方程,然後對解作出漸近階估計。
下面就以上方法給出一些例子說明。
一、代入法
大整數乘法計算時間的遞迴方程為:t(n) = 4t(n/2) + o(n),其中t(1) = o(1),我們猜測一個解t(n) = o(n2 ),根據符號o的定義,對n>n0,有t(n) < cn2 - eo(2n)(注意,這裡減去o(2n),因其是低階項,不會影響到n足夠大時的漸近性),把這個解代入遞迴方程,得到:
t(n) = 4t(n/2) + o(n)
≤ 4c(n/2)2 - eo(2n/2)) + o(n)
= cn2 - eo(n) + o(n)
≤ cn2
其中,c為正常數,e取1,上式符合 t(n)≤cn2 的定義,則可認為o(n2 )是t(n)的一個解,再用數學歸納法加以證明。
二、迭代法
某演算法的計算時間為:t(n) = 3t(n/4) + o(n),其中t(1) = o(1),迭代兩次可將右端為:
t(n) = 3t(n/4) + o(n)
= o(n) + 3( o(n/4) + 3t(n/42 ) )
= o(n) + 3( o(n/4) + 3( o(n/42 ) + 3t(n/43 ) ) )
從上式可以看出,這是一個遞迴方程,我們可以寫出迭代i次後的方程:
t(n) = o(n) + 3( o(n/4) + 3( o(n/42 ) + ... + 3( n/4i + 3t(n/4i+1 ) ) ) )
當n/4i+1 =1時,t(n/4i+1 )=1,則
t(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )t(1)
< 4n + 3i+1
而由n/4i+1 =1可知,i0,有f(n) = o(nlogb a-ε ),則t(n) = o(nlogb a )
2.若f(n) = o(nlogb a ),則t(n) = o(nlogb a *logn)
3.若f(n) = o(nlogb a+ε ),且對於某常數c>1和所有充分大的正整數n,有af(n/b)≤cf(n),則t(n)=o(f(n))。
設t(n) = 4t(n/2) + n,則a = 4,b = 2,f(n) = n,計算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = o(n2-ε ),此時ε= 1,根據第1種情況,我們得到t(n) = o(n2 )。
這裡涉及的三類情況,都是拿f(n)與nlogb a 作比較,而遞迴方程解的漸近階由這兩個函式中的較大者決定。在第一類情況下,函式nlogb a 較大,則t(n)=o(nlogb a );在第三類情況下,函式f(n)較大,則t(n)=o(f (n));在第二類情況下,兩個函式一樣大,則t(n)=o(nlogb a *logn),即以n的對數作為因子乘上f(n)與t(n)的同階。
但上述三類情況並沒有覆蓋所有可能的f(n)。在第一類情況和第二類情況之間有一個間隙:f(n)小於但不是多項式地小於nlogb a ,第二類與第三類之間也存在這種情況,此時公式法不適用。
折半查詢遞迴版的時間複雜度是多少,空間複雜度是多少?那非遞迴版的呢?
3樓:匿名使用者
遞迴折半查詢的時間複雜度是o(log2n),空間複雜度是o(log2n),也是遞迴的最大深度
非遞迴的時間複雜度是o(log2n),空間複雜度是o(1),僅僅用幾個單變數就夠了
C語言的兩個問題 所有的遞迴程式均可以用非遞迴演算法實現?遞
c語言所有遞迴都bai可以用非遞迴演算法實du現,最典型的就是 zhi迭代法dao,有時比遞迴更容專易理解。至 於遞迴中屬的形式引數是自動變數,沒明白樓主的意思,形參就是形參啊,形參變數也是變數,其記憶體分配在棧區,隨著函式的結束,其記憶體也會被釋放,形參的生命週期與函式生命週期相同哈 同生共死 i...
c語言程式ais與,c語言程式 a i s與a i s有區別嗎?
a i s 這個a i 必須是地址才對所以表達是錯誤的,應該 a i s 或者 定義一個指標 p a i 那麼 a i s 和p s是等價的,沒有區別 你這個a是一個結構體組成的陣列或者結構體指標組成的陣列吧 如果是前者,就是用a i s,如果是後者,就用a i s 因為結構體和結構體指標獲取屬性就...
C語言讀程式執行結果是什麼,並請寫出原因謝謝
1.執行結果 wlo 分析如下 由main i 0 執行fun i printf c st i 輸出w 又 i 2 則i 2 執行func2 i 輸出 l 接著 i 2 i 4 執行 func1 i 輸出 o 最後輸出 wlo 2.執行結果 22 main函式執行f a j 0 則i 0 執行s b...