码迷,mamicode.com
首页 > 其他好文 > 详细

2.3.15

时间:2018-06-03 21:21:49      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:not   .sh   重复   pre   The   pos   val   quic   direct   

question:

Nuts and bolts. (G. J. E. Rawlins) You have a mixed pile of N nuts and N bolts and need to quickly find the corresponding pairs of nuts and bolts. Each nut matches exactly one bolt, and each bolt matches exactly one nut. By fiting a nut and bolt together, you cansee whitch is bigger, but it is not possible to directly compare two nuts or two bolts. Give an effcient method for solving the problem.

answer:

用螺母把螺丝分类,得到
1.完全匹配那个;
2.比螺母小的螺丝;
3.比螺母大的螺丝;
将完全匹配的那个螺丝取出,再反过来用它对螺母分类,得到
1. 比螺丝小的螺母;
2. 比螺丝大的螺母;

再在这个对应好的螺丝螺母两边重复执行上述步骤(递归),直到完全匹配;

//我的代码

 

import edu.princeton.cs.algs4.*;

public class NutsAndBolts
{
    public static void match(int[] a, int[] b, int lo, int hi)
    {
        if(lo >= hi)//这里的递归终止条件不太好想,其实这里a找完的同时b一定也找完了
            return;
        int v = partition(a,lo,hi,a[lo]);//对a分割
        int w = partition(b,lo,hi,a[v]);//以a的分割值来分割b
        //StdOut.printf("%d %d\n",v,w);
        //这里v和w是一样的,这是必然的(因为w就是按v对应的值来找的然后放到位置上的),所以match传的lo和hi可以被a,b共同使用
        StdOut.print("a ");
        show(a);
        StdOut.print("b ");
        show(b);
        match(a,b,lo,v-1);//分割a和b的前半边
        match(a,b,v+1,hi);//分割a和b的后半边
    }
    
    public static int partition(int[] c, int lo, int hi, int value)
    {
        int i = lo, j = hi +1;
        int t;
        for(t = lo; t <= hi; t++)//以值value来找对应下标(假设现在的value是a里的,那么现在就好比遍历b来找对应b里对应的value),这里是关键--根据value找下标
        {
            if(c[t] == value)
                break;
        }
        exch(c,t,lo);//交换首元素和value对应下标的元素,这样后面的分割就和快排里分割一样了
        while(true)
        {
            while(c[++i] < value) if(i == hi) break;
            while(value < c[--j]) if(j == lo) break;
            if(i >= j)
                break;
            exch(c,i,j);
        }
        exch(c,lo,j);
        return j;
    }
    
    private static void exch(int[] c, int i, int j)
    {
        int temp = c[i];
        c[i] = c[j];
        c[j] = temp;
    }
    
    public static void show(int[] c)
    {
        for(int i = 0; i < c.length; i++)
            StdOut.print(c[i] + " ");
        StdOut.println();
    }
    
    public static void main(String[] args)
    {
        int N = 20;
        int[] a = new int[N];
        int[] b = new int[N];
        for(int i = 0; i < N; i++)
        {
            a[i] = b[i] = i;
        }
        StdRandom.shuffle(a);
        StdRandom.shuffle(b);
        show(a);
        show(b);
        match(a,b,0,a.length-1);
        show(a);
        show(b);
    }
}

 

2.3.15

标签:not   .sh   重复   pre   The   pos   val   quic   direct   

原文地址:https://www.cnblogs.com/w-j-c/p/9130025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!