【洛谷有题】NOIP 2014 提高组初赛试题 订正 网络协议 检索/比较次数计算

【洛谷有题】NOIP 2014 提高组初赛试题 订正

网络协议

第 4 题

TCP协议属于哪一层协议( ).

 应用层

 传输层

 网络层

 数据链路层

 TCP/IP通讯协议采用了 4 层的层级结构,每一层都呼叫下一层所提供的网络来完成自己的需求。

  1. 应用层:应用程序间沟通的层:SMTP:简单电子邮件传输、FTP:文件传输协议、Telnet:网络远程访问协议、HTTP:超文本传输协议、XMPP:可扩展通讯和表示协议等
  2. 传输层:节点间的数据传送服务:TCP:传输控制协议、UDP:用户数据报协议等
  3. 网络层:基本的数据封包传送:如IP
  4. 网络接口层:对实际的网络媒体的管理,定义如何使用实际网络:EthernetSerialLine

【拓展】那么数据链路层在哪里呢?

其实上面的是4层模型,而还有个5层模型,但只不过是在4层的基础上的“网络接口层”变成了“数据链路层”和“物理层”。

又其实,还有一个7层模型(OSI),又但只不过是5层的基础上的“应用层”变成了三个层:“应用层”,“会话层”和“表示层”;比如HTTP协议就包含在应用层里。

检索/比较次数计算

第 7 题

对长度位n的有序单链表,若检索每个元素的概率相等,则顺序检索到表中任一元素的平均检索长度为( ).

 n/2

 (n+1)/2

 (n-1)/2

 n/4

 可以用平均数计算。如果元素刚好是第一个那就只要检索1次,若元素是最后一个那就要检索n次,平均(1+n)/2次

第 12 题

同时查找2n 个数中的最大值和最小值,最少比较次数为( ).

 3(n-2)/2

 4n-2

 3n-2

 2n-2

 你也许以为最简单的是这样的:

 1 int a[10010];
 2 int maxn,minn;
 3 int n;
 4 int main()
 5 {
 6     cin>>n;
 7     for(int i=0;i<2*n;i++) cin>>a[i];
 8     maxn=minn=a[0];
 9     for(int i=1;i<2*n;i++)
10     {
11         if(a[i]>maxn) maxn=a[i];
12         if(a[i]<minn) minn=a[i];
13     }
14     return 0;
15 }

比较了4n-2次,(然而本菜鸡把它算成了2n-2所以错了……2n-2突破计算机极限了?!)

或者是这样的:

int a[10010];
int maxn,minn;
int n;
int main()
{
    cin>>n;
    for(int i=0;i<2*n;i++) cin>>a[i];
    maxn=minn=a[0];
    for(int i=1;i<2*n;i++)
    {
        if(a[i]>maxn){
            maxn=a[i];
        }
        else if(a[i]<minn) minn=a[i];
    }
    return 0;
}

平均比较1.5*2*n-2=3n-2,但是此题问的是至少比较次数,也就是最坏情况应该还是4n-2

其实是:

int a[10010];
int maxn,minn;
int n;
int main()
{
    cin>>n;
    for(int i=0;i<2*n;i++) cin>>a[i];
    if(a[0]<a[1]){
        maxn=a[1];
        minn=a[0];
    }
    else{
        maxn=a[0];
        minn=a[1];
    }
    for(int i=2;i<2*n;i+=2)
    {
        if(a[i]<a[i+1])
        {
            if(maxn<a[i+1])    maxn=a[a+1];
            if(minn>a[i]) minn=a[i];
        }
        else
        {
            if(maxn<a[i]) maxn=a[i];
            if(minn>a[i+1]) minn=a[i+1]
        }
    }
    return 0;
}

啊,真好……

首先外部比较1次。

其次,for循环会循环n-1次(注意步长为2)

  每次从数组中取出两个数,先判断这两个数的大小(1次)

  然后把大的与maxn比较,把小的与minn比较。(2次)

 所以每次循环有三次比较,for中一共有3n-3次

再加上外面的一次,一共有3n-2次。

(以上代码未经过编译的哈,谨慎使用)

over

posted @ 2020-10-09 17:07  Vanilla_chan  阅读(361)  评论(0)    收藏  举报