访问本站观看效果更佳
在一般输入数据的程序里,输入多多少少会影响到算法的计算复杂度。这时可用舍伍德算法消除算法所需计算时间与输入实例间的这种联系。联系例子,在快速排序中,我们是以第一个元素为基准开始排序时,为了避免这样的情况,可以用舍伍德算法解决,也就是使第一个基准元素是随机的。
当然,舍伍德算法也不是万能的。有时也会遇到这样的情况,即所给的确定性算法无法直接改造成舍伍德型算法。此时可借助于随机预处理技术,不改变原有的确定性算法,仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。

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}
  1. Log g,p (st mod p) = (log g,p s + log g,p t) mod (p - 1)
  2. 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算法相关推荐

  1. 数据结构和算法详解(四)——五大基本算法思想

    更多例子可参考:https://blog.csdn.net/Aidam_Bo/article/details/86715865 一.穷举算法思想 穷 举 算 法 (ExhaustiveA ttack ...

  2. Monte-Carlo算法(基本原理,理论基础,应用实践)

    文章目录 1.Monte-Carlo算法引导 2.Monte-Carlo算法的数理基础 3.应用实例一:使用Monte-Carlo算法计算定积分 3.1 插值积分法 3.2 Monte-Carlo积分 ...

  3. 【数据结构和算法设计】算法篇(11) 概率算法和近似算法

    文章目录 12.1 概率算法 12.1.1 什么是概率算法 1. 概率算法的特点 2. 概率算法的分类 3. 随机数生成器 12.1.2 蒙特卡罗类型概率算法 12.1.3 拉斯维加斯类型概率算法 1 ...

  4. 解析Monte-Carlo算法(基本原理,理论基础,应用实践)

    转载自https://www.cnblogs.com/leoo2sk/archive/2009/05/29/1491526.html 引言 最近在和同学讨论研究Six Sigma(六西格玛)软件开发方 ...

  5. 三个随机算法的简介(舍伍德,拉斯维加斯,蒙特卡洛)

    舍伍德,拉斯维加斯和蒙特卡罗算法 舍伍德算法 拉斯维加斯算法 蒙特卡罗方法 舍伍德算法 很多算法对于不同的输入时间复杂度有较大区别,例如快速排序算法.在这个时候就可以采用舍伍德型概率算法消除这种影响. ...

  6. 理论计算机初步:概率算法和近似算法

    已经提到了显示中大多数难解问题问题最后都被证明是NP-完全问题.这意味着,除非NP=P,它们是不可能有多项式时间算法的(而且,在 这篇文章提到即使NP=P,人们也可能找不到一个NP完全问题的「有效」算 ...

  7. 机器学习(二十八)——Monte-Carlo

    动态规划(续) Value Iteration vk+1(s)=maxa∈A(Ras+γ∑s′∈SPass′vk(s′))vk+1(s)=maxa∈A(Rsa+γ∑s′∈SPss′avk(s′)) v ...

  8. 《算法分析与设计》复习笔记

    目录 一.算法的基本概念 1.1 算法的定义 1.2 算法的"好坏"如何衡量? 1.3 描述算法的时间复杂度 ⭐ 1.4 如何评价算法 二. 分治法 2.1 分治法的求解步骤 2. ...

  9. 三种方法实现选择问题

    一.选择问题 选择问题(selection problem)是求一数组(n个数)中第k(k <= n)个最小元素的问题. 二.三种方法实现 1.确定算法 ①Lomuto划分 ②Hoare划分 2 ...

最新文章

  1. Java设计模式:设计模式基础知识和原则
  2. Oracle中去重复记录 不用distinct
  3. java web过滤器
  4. ASCII Unicode GBK UTF的联系
  5. leetcode - 673. 最长递增子序列的个数
  6. _Linux学习笔记
  7. iOS开展-CocoaPods安装和使用教程
  8. w ndows10启动黑屏,windows10开机黑屏?win10黑屏无法进入桌面解决技巧
  9. 进程的同步和互斥反映了_用信号量解决进程的同步与互斥探讨【持续更新】
  10. 手机用久了耗电快?华为手机的后备隐藏能源,开启后续航强如新机
  11. DDR3联合HDMI进行图片数据的传输
  12. K8S在centeros中的部署
  13. 机器学习之金融信贷风控(二)申请评分卡中的数据预处理和特征衍生(未完待续)
  14. 【Milvus的人脸检索】
  15. 【java】本地客户端内嵌浏览器3 - Swing 使用 Spring 框架 + 打包项目 + 转exe + 源码
  16. comtrade文件C语言,COMTRADE录波文件资料格式定义.doc
  17. 怎么在WEB页面上读取身份证信息
  18. 高集成、大突破----485/CAN总线隔离收发模块的“芯”级体验
  19. 混合储能系统容量优化matlab,采用粒子群算法编制风光互补发电储能系统的容量优化程序,程序采用超级电容和蓄电池的方案
  20. Scratch少儿编程精品课2侏罗纪公园

热门文章

  1. mysql计算年休假天数_如何计算年假多少天
  2. 业务逻辑漏洞挖掘-某网站绕过下载付费机制进行下载文件
  3. 【第十二篇】Flowable事件-定时器事件
  4. 基于微信小程序的师生答疑交流平台APP
  5. 滴滴夜莺02-自定义推送数据
  6. Swift3豆瓣电台
  7. Verilog HDL 编程规范
  8. 应用在hiapk安卓市场分类排行榜中不显示的原因
  9. nlp算法工程师英语
  10. LTE小区搜索-物理小区ID和同步信号PSS、SSS