• 【洛谷有题】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

  • 相关阅读:
    你喜欢使用eclipse+tomcat编程吗?!
    "ERR_GFX_D3D_INIT", GTA5-报错解决办法
    这样写JS的方式对吗?
    webui layout like desktop rich client
    2014年12月23日00:42:54——PS4
    2014年12月20日00:33:14-遮罩+进度条-extjs form.isvalid
    十分钟部署智能合约
    idea clion编译器
    parity 注记词
    go语言学习笔记
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/13786774.html
Copyright © 2020-2023  润新知