鱼C论坛

 找回密码
 立即注册

算法导论第五章5.1雇佣问题课后答案研究

已有 339 次阅读2013-12-24 10:30 |个人分类:数据结构与算法

5.1-1证明:假设在程序HIRE-ASSISTANT的第四行中,我们总是能够决定哪一个应聘者最佳,这就蕴含我们知道应聘者排名的总次序。


这就相当于一个排序,哪种排序都要进行元素之的比较,所以元素间的比较就是排序的关键,而此时是两个应聘者之间的比较


5.1-2描述RANDOM(a,b)过程的一种实现,它只调用RANDOM(0,1),作为a和b的函数,你的程序的期望运行时间是多少?


因为调用RANDOM(0,1)表示(a,b)之间的数,则肯定是用n位二进制数表示(a,b)之间的数。n位二进制数的每一位都有2种可能的选择(0,1),所以对于n位二进制数就有2^n种选择方式,其中每一个n位二进制数都有1/2^n个几率被选中,(a,b)之间有b-a+1个数,我们约定用RANDOM(0,1)生成随机二进制数的实验过程是相互独立的,每次实验成功时的几率都是p=(b-a+1)/(2^n)(成功选中(a,b)之间的数的概率)选中失败的几率是q=1-p,根据伯努利的几何分布知E(x)=1/p 知道E(x)=(2^n)/(b-a+1) 这就表示了在用RANDOM(0,1)成功随机到(a,b)之间的数之前需要平均进行(2^n)/(b-a+1)次随机,因为每次进行RANDOM(0,1)随机生成数时间固定为常数Tc,所以期望时间T=((2^n)/(b-a+1))Tc

#include <iostream>

#include <time.h>

using namespace std;

int power(int x,int n)

{

    int s=1;

    for (int i=0;i<n;i++)

    {

       s*=x;

    }

    return s;

}

int Rand(int a[],int m)

{

    int n=0;

    srand((unsigned)time(NULL));

    for (int i=0;i<m;i++)

    {

        a[i]=rand()%2;

        n+=a[i]*power(2,i);

    }

    return n;

}

int Rand2(int a,int b,int n)

{

    int flag=0;

    for (int i=a;i<b;i++)

    {

        if (n==i)

        {

            flag=1;

            break;

        }

    }

    return flag;

}

void main()

{

  int j=1,m=8,a[8]={0},b[10000]={0};

  b[j]=Rand(a,m);

  if (Rand2(1,5,b[j]))

  {

      cout<<b[j]<<"符合题意!"<<endl;

  }

  while(1)

  {

      cout<<"b["<<j-1<<"]"<<b[j]<<endl;

      if (Rand2(1,5,b[j]))

      {

          cout<<b[j]<<"符合题意!"<<endl;

          break;

      }

      else 

      {

          ++j;

          b[j]=Rand(a,m);

          while (b[j-1]==b[j])//这个循环式为了重置那些随机到相同的数

          {

              b[j]=Rand(a,m);

          }

      }

  }


}


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-17 02:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部