日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sherwood算法

發布時間:2024/3/7 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sherwood算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訪問本站觀看效果更佳
在一般輸入數據的程序里,輸入多多少少會影響到算法的計算復雜度。這時可用舍伍德算法消除算法所需計算時間與輸入實例間的這種聯系。聯系例子,在快速排序中,我們是以第一個元素為基準開始排序時,為了避免這樣的情況,可以用舍伍德算法解決,也就是使第一個基準元素是隨機的。
當然,舍伍德算法也不是萬能的。有時也會遇到這樣的情況,即所給的確定性算法無法直接改造成舍伍德型算法。此時可借助于隨機預處理技術,不改變原有的確定性算法,僅對其輸入進行隨機洗牌,同樣可收到舍伍德算法的效果。

dlogRH(g, a, p) { // 求logg,pa, a = gx mod p,求x// Sherwood算法r ← uniform(0..p-2);b ← ModularExponent(g, r, p); //求冪模b=gr mod pc ← ba mod p; //((gr modp)(gxmodp))modp=gr+xmodp=cy ← logg,pc; // 使用確定性算法求logp,gc, y=r+xreturn (y-r) mod (p-1); // 求x}
  • Log g,p (st mod p) = (log g,p s + log g,p t) mod (p - 1)
  • Log g,p (g ^r mod p) = r, 0 <= r <= p – 2
  • dlogRH(g, a p) { // 求 log g,p a, a = g^x mod p,求 x Sherwood算法r ← uniform(0..p-2);b ← ModularExponent(g, r, p); //求冪模 b=g^r mod p,定理 1 真數的一部分c ← ba mod p; //((g^r modp)(g^x modp))modp=g ^(r+x)modp=c, 定理 2 中的真數y ← log g,p c; // 使用確定性算法求 log p,g c, y=r+x,定理 2return (y-r)mod(p-1); //求x,定理1 }

    在這里,唯一耗費時間的是 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算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。