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)开头用螺帽将螺丝切分成两组,然后螺丝再确定螺帽,如此反复交替进行。
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)开头用螺帽将螺丝切分成两组,然后螺丝再确定螺帽,如此反复交替进行。