2.3.15

Posted w-j-c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.3.15相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

如果没有活动事务,createCriteria 无效(Struts 2.3.15、Spring 3.2.4、Hibernate 4.2.5 Final)

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数