• 面试算法题:16个数,最多用20次比较,找出第二大的数?


    这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较。

    既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法。

    假设16个数中最大的是A,第二大的是B。

    首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示

    红色路线是最大数经过的路径。

     

    接下来分析B可能存在的位置。

    将16个数分为左部分和右部分各8位:

    1、如果A和B在两个不同的部分(A在左部分,B在右部分,则B是右部分的最大者),因此按照上面的比较方法,B将在根节点的右子节点,即图中红色1节点;

    2、如果A,B处于同一个部分(假设都在左部分,如果同在右部分,分析方法一样),则在左部分的8个节点中,按照方法1继续划分查找;

    通过这种方式分析可以知道,A和B一定会做一次比较(想想为什么)。在图中,如果A按照红色路线上升,则B可能出现的位置就是红色节点1,2,3,4。

    四个红色位置比较要3次。

    因此最终需要:

    8+4+2+1+3=18

     

  • 相关阅读:
    html语法
    mysql常见的使用语法
    文件相关命令
    linux文件管理
    mysql常见名词解释
    MySQL初识
    文件管理
    并发基础知识3
    Bash shell初识
    【Spring Boot】ActiveMQ 发布/订阅消息模式介绍
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4354724.html
Copyright © 2020-2023  润新知