算法设计与分析历年题目(02-05).doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析历年题目(02-05)

给出n个正整数内置分奇偶的算法,偶数排在奇数前边,并说明算法的比较次数和移动次数。(05-1,02-1) 答:算法描述如下: void partition(int *a, int n) { int low = 0,high = n-1; int temp = a[0]; //起始位置先置空位 while(lowhigh){ while(a[high]是奇数high=0) high--; if(high!=0) a[low++] = a[high]; while(a[low]是偶数lown-1) low++; if(low!=n-1) a[high--] = a[low]; } if(high!=0 low!=n-1) a[low] = temp; //最终空出的位置填入起始为止的那个值。 } 本算法在比较次数上:因为第一个元素没有参与比较,故为n-1次 在移动元素次数上,是来回移动的,最坏情况下,n-1个元素都要相互移动,为n-1次,还有将首位置元素移入temp和从temp移入最终空位的2次,共需n-1+2=n+1次。 找出n个元素的最大元和最小元,并说明这个算法好的理由。(05-3,04-9) 算法描述如下: maxMin(int *a, int n){ n(奇数)个元素两两比较(除去最后一个)共(n-1)/2次,大的放在偶数位,小的放在奇数位,然后比较。n个元素两两比较,大的一半存入数组b,小的一半存入数组c;将最后一个元素分别放入两半中考虑。 比较法选出b中最大的元素,即为最大元;比较(n-1)/2次 比较法选出c中最小的元素,即为最小元;比较(n-1)/2次 共3(n-1)/2 } n为偶数时方法同上:两两比较需比较n/2次;b中有n/2个元素,找到最大需n/2 - 1次,c中有n/2个元素,找到最小需n/2 – 1次,所以共需要3n/2 – 2次。可见,如果n个元素找最大的最少比较次数为W(n),则W(n) = 3n/2 – 2 (*); 又根据对策论的思想,当最终找到最大最小元时,最大元在所有比较中都是胜利者,最小元在所有比较中都是失败者,他们分别带了1个信息(胜利或者失败)其余n-2个元素都有胜利有失败,故他们都带了2个信息。所以完成这个任务,需要生成信息总数为:2*(n-2)+2= 2n -2个信息。 1.两个不带信息的节点比较,可以产生两个信息, 2.带信息的节点与其他节点比较,最多产生一个信息。 所以为了使用最少的比较产生最多的信息,第一轮必须由不带信息的结点两两比较,比较次数为n/2,每次比较产生2个信息共可以产生n个信息,; 那么还需要产生2n-2 –n= n-2个信息,这时已经没有不带信息的节点,所以最坏情况下考虑每次比较最多产生一个信息,那么,n-2个信息需要比较n-2次。 故最少需要比较次数:n/2 + n-2 = 3n/2 -2。即:W(n)= 3n/2 -2 (#); 由(*)和(#)式可知,W(n) = 3n/2 -2。也就是说,上述算法已经达到了这个问题的最少比较次数。 用判定树方法得出的求n个元素最大最小元的比较次数下界。(05-4) 判定树的叶子节点为所有可能出现的最大最小元的排列数,即叶子节点数为:Pn2 = n*(n-1),如果树高从0开始,那么比较次数为判定树的高度,由归纳法可证判定树叶结点数=2h,所以判定树的高度为h=┌log(n*(n-1))┐所以比较次数至少为 ┌log(n*(n-1))┐,所以通过判定树方式,得出比较次数= ┌log(n*(n-1))┐。 给出dijkstra算法;并给出由生成的父节点数组,找到由s(源点)到z(终点)的一个实际最短路径的算法。(注意:共两个算法)(05-6,04-6) dijkstra(AdjMatricx w, int s, int n, int * parent, int *cost) { int state[n]; //标记各点是否加入了最短路径的点集; 初始化: state[s]设为1,其余state[]都为零; parent[s] = -1,所有与s相邻的节点i, parent[i] = s;其余为零; cost[],所有与s相邻的节点 i, cost[i] = w[s][i];其余节点cost为∞; while(i =0;in-1;i++){ 从cost里边选中state [v]=0且cost[v]值最小的节点v state[v] = 1; //v节点加入最短路径集合 for(v所有邻接的,且state[u] = 0的点u){ if(cost

文档评论(0)

zilaiye + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档