• Algs4-2.3.15螺丝和螺帽


    2.3.15螺丝和螺帽。(G.J.E.Rawlins)假设有N个螺丝和N个螺帽混在一堆,你需要快速将它们配对。一个螺丝只会匹配一个螺帽,一个螺帽也只会匹配一个螺丝。你可以试着把一个螺丝和一个螺帽拧在一起看看谁大,但不能直接比较两个螺丝或者两个螺帽。给出一个解决这个问题的有效方法。

    1) 将螺丝与螺帽分开,形成一个螺丝堆,一个螺帽堆。

    2)将螺帽按任意次序排成一排。

    3)从螺丝堆中任取一个螺丝。

    4)将这个螺丝与螺帽排列中的螺帽按下述方式进行对比,以便实现左边放置小于匹配的螺帽,右边放置大于匹配的螺帽。

       4.1)从左向右一个一个螺帽与这个螺丝进行对比,
             当遇到小螺帽时,继续向右对比,
             当遇到匹配的螺帽时将这个螺帽放置在一边,然后继续向右对比,
             当遇到大螺帽时停下,
             当遇到或越过从右向左推进的位置时结束本轮对比,
             当遇到一对匹配的螺丝螺帽时结束本轮对比,
             当遇到右边没有螺帽时结束本轮对比。

       4.2)从右向左一个一个螺帽与这个螺丝进行对比,
             当遇到大螺帽时,继续向左对比,
             当遇到匹配的螺帽时将这个螺帽放在一边,然后继续向左对比,
             当遇到小螺帽时停下,
             当遇到一对匹配的螺丝螺帽时结束本轮对比,
             当遇到左边没有螺帽时结束本轮对比。

       4.3)交换上述找到的大小螺帽位置,然后从停下的位置按原方向继续按4.1、4.2方式进行对比。

       4.4)结束一轮对比后,刚才匹配的螺帽放在螺帽排列的交界位置,然后把与之匹配的螺丝放在这个螺帽的下方,
            这样便实现了左边放置小于匹配的螺帽,右边放置大于匹配的螺帽。

       4.5)从螺丝堆中再任取一个螺丝,将它按二分查找的方式与已匹配的螺帽进行对比,以便确定与这个螺丝匹配的螺帽属于哪个一一对比段,
            确定一一对比段后再接4.1至4.4的方式对这个一一对比段进行动作。

            一一对比段是指以下情况之一的段:
             a)两个已匹配的螺帽形成的一个段,并且两个已匹配螺帽之间没有已匹配的螺帽。
             b)一个已匹配的螺帽与一个与最左边 或 与最右边的螺帽形成的一个段,并且这两个螺帽之间没有已匹配的螺帽
           
       4.6)如此反复直到取完所有的螺丝。

    另一种方法是:从4.5)开头用螺帽将螺丝切分成两组,然后螺丝再确定螺帽,如此反复交替进行。
  • 相关阅读:
    python压平嵌套列表
    利用Python通过频谱分析和KNN完成iphone拨号的语音识别
    教你用Python Jupyter Notebook 制作代码分享 PPT
    windows10远程桌面连接身份验证错误:函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正
    常用Linux命令
    利用uWSGI和nginx进行服务器部署
    阿里云ECS Ubuntu16.0 安装 uwsgi 失败解决方案
    阿里云上安装pip3(Ubuntu)
    基于python的快速傅里叶变换FFT(二)
    基于Python的频谱分析(一)
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9860231.html
Copyright © 2020-2023  润新知