sherwood算法
生活随笔
收集整理的這篇文章主要介紹了
sherwood算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
訪問本站觀看效果更佳
在一般輸入數據的程序里,輸入多多少少會影響到算法的計算復雜度。這時可用舍伍德算法消除算法所需計算時間與輸入實例間的這種聯系。聯系例子,在快速排序中,我們是以第一個元素為基準開始排序時,為了避免這樣的情況,可以用舍伍德算法解決,也就是使第一個基準元素是隨機的。
當然,舍伍德算法也不是萬能的。有時也會遇到這樣的情況,即所給的確定性算法無法直接改造成舍伍德型算法。此時可借助于隨機預處理技術,不改變原有的確定性算法,僅對其輸入進行隨機洗牌,同樣可收到舍伍德算法的效果。
在這里,唯一耗費時間的是 b ← ModularExponent(g, r, p),它的執行時間與a,p 的取值無關,只與隨機取出的 r 有關
寫一Sherwood算法搜索有序表
#include<iostream> #include<ctime> #include<set> #include<cmath> using namespace std;const int N = 15; int val[N] = { RAND_MAX, 2, 3, 13, 1, 5, 21, 8, 29, 87, 56, 69, 72, 83, 45 }; //N==15 int ptr[N] = { 4, 2, 5, 6, 1, 7, 8, 3, 14, 0, 11, 12, 13, 9, 10 }; int ComCount = 0; //用于Search算法查找需要的次數//設x≥val[i]且x在表中,則從位置i開始查找x的算法 int Search(int x, int i) {ComCount = 0;while (x > val[i]){i = ptr[i];++ComCount;}return i; } //在表val[1..n]中從最小值開始查找x的算法為: int A(int x) {return Search(x, ptr[0]); }//在val數組的前sqrt(n)個元素中找y<=x的最大整數y,從y開始查找。 //在這里假設了val的元素是均勻分散的 int B(int x) {int i = ptr[0];int max = val[i];for (int j = 1; j <= (int)sqrt((double)N); ++j){int y = val[j];if (max < y && y <= x){i = j;max = y;}}return Search(x, i); }//隨機選擇val數組中的一個數做為開始,隨機sqrt(n)次,選取y<=x的最大整數y,從y開始查找, //此算法比B算法有更好的平均性能 int C(int x) {int i = ptr[0];int max = val[i];for (int j = 1; j <= (int)sqrt((double)N); ++j){int k = rand() % N;int y = val[k];if (max < y && y <= x){i = k;max = y;}}return Search(x, i); }//隨機選一個指針位置(0~n-1)開始查找,本例n=8 int D(int x) {int i = rand() % N; //C++ 從零開始,最后不必加1 int y = val[i];if (x < y){return Search(x, ptr[0]);}else if (x > y){return Search(x, ptr[i]);}else{return i;}} int main() {int totalA = 0;int totalB = 0;int totalC = 0;int totalD = 0;int i = 0;//對有序表中的元素逐個進行查找,得出所用的總比較次數。int temp(1);while (ptr[i] != 0){A(val[ptr[i]]);totalA += ComCount;B(val[ptr[i]]);totalB += ComCount;C(val[ptr[i]]);totalC += ComCount;D(val[ptr[i]]);totalD += ComCount;i = ptr[i];temp++;}cout << "對有序表中的元素逐個進行查找,得出所用的總比較次數。\n遍歷的元素表中的個數N=" << temp << endl << endl;cout << "算法A比較總次數:" << totalA << endl;cout << "算法B比較總次數:" << totalB << endl;cout << "算法C比較總次數:" << totalC << endl;cout << "算法D比較總次數:" << totalD << endl;system("pause");return 0;}總結
以上是生活随笔為你收集整理的sherwood算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字电视专业术语--DTV名词扫盲
- 下一篇: jk触发器的异步置位端和异步复位端的表示