java面试-四维图新

1、给出至少三种排序方式,并写出详细实现思路。

 

  /**
     * 快速排序
     * @param arr
     * @param low
     * @param high
     */   
 public static void quickSort(int[] arr,int low,int high){
            int i,j,temp,t;
            if(low>high){
                return;
            }
            i=low;
            j=high;
            //temp就是基准位
            temp = arr[low];

            while (i<j) {
                //先看右边,依次往左递减
                while (temp<=arr[j]&&i<j) {
                    j--;
                }
                //再看左边,依次往右递增
                while (temp>=arr[i]&&i<j) {
                    i++;
                }
                //如果满足条件则交换
                if (i<j) {
                    t = arr[j];
                    arr[j] = arr[i];
                    arr[i] = t;
                }

            }
            //最后将基准为与i和j相等位置的数字交换
            arr[low] = arr[i];
            arr[i] = temp;
            //递归调用左半数组
            quickSort(arr, low, j-1);
            //递归调用右半数组
            quickSort(arr, j+1, high);
        }

    /**
     * 冒泡
     * @param array
     */
    public static void popSort(int[] array){
        for(int i=0;i<array.length-1;i++){
            for(int j=0;j<array.length-1-i;j++){
                if(array[j]>array[j+1]){
                    int temp=array[j+1];
                    array[j+1]=array[j];
                    array[j]=temp;
                }
            }
        }
    }

  //插入排序
        for (int i = 1; i < arr.length; i++) {
            //外层循环,从第二个开始比较
            for (int j = i; j > 0; j--) {
                //内存循环,与前面排好序的数据比较,如果后面的数据小于前面的则交换
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = temp;
                } else {
                    //如果不小于,说明插入完毕,退出内层循环
                    break;
                }
            }
        }

  

2、假如有一个文件大小为IG的文本文件,每行都不超过20个字符,可用内存只有100M,

    现需要进行对该文件进行排序,请给出实现思路。

题目:有一个大文件,里面记录了若干数字,把这些数字进行排序。文件大小远大于内存大小。
思路:内存极少的情况下,利用分治策略,利用外存保存中间结果,再用多路归并来排序。

(1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存;

(2)对这些有序子文件逐趟归并,使其逐渐由小到大,直至得到整个有序文件为止。

若干小文件排序
题目:有N(N远大于10)个1MB的小文件,文件里记录了若干数字,现要求在2M内存里对这些小文件中的数字排序。
思路:多路归并排序

1. 首先对每个小文件中的数字排序,2M内存足够对1M数字排序。
2. 现在有了N个有序的小文件,怎么合并成1个有序的大文件?
利用如下原理进行归并排序:


举例说明:
文件1:3,6,9
文件2:2,4,8
文件3:1,5,7

第一回合:
文件1的最小值:3 , 排在文件1的第1行
文件2的最小值:2,排在文件2的第1行
文件3的最小值:1,排在文件3的第1行
那么,这3个文件中的最小值是:min(1,2,3) = 1
也就是说,最终大文件的当前最小值,是文件1、2、3的当前最小值的最小值,绕么?
上面拿出了最小值1,写入大文件.

第二回合:
文件1的最小值:3 , 排在文件1的第1行
文件2的最小值:2,排在文件2的第1行
文件3的最小值:5,排在文件3的第2行
那么,这3个文件中的最小值是:min(5,2,3) = 2
将2写入大文件。

也就是说,最小值属于哪个文件,那么就从哪个文件当中取下一行数据。
(因为小文件内部有序,下一行数据代表了它当前的最小值)

3. 如何在N个数中找到最小值呢?
经典的算法的步骤是:
每次从k个组中的首元素中选一个最小的数,加入到新组,这样每次都要比较k-1次,故算法复杂度为O((n-1)*(k-1));

而如果使用胜者树,可以在O(logk)的复杂度下得到最小的数,算法复杂度将为O((n-1)*logk), 对于外部排序这种数据量超大的排序来说,这是一个不小的提高。

胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。
每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。

不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。

胜者树与败者树可以在log(n)的时间内找到最值。

任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。

下图是一个胜者树的示例。规定数值小者胜。
1. b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;
2. b3 PK b0,b3胜b0负,内部结点ls[2]的值为3;
3. b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;
4. b3 PK b1,b3胜b1负,内部结点ls[1]的值为3。


因此,上述问题的解决思路如下:
1. 对每个小文件排序。
2. 读取每个文件的首元素,用胜者树找到最小值,记录到大文件上。
3. 继续采用多路归并排序的方法,继续找最值,直到排完所有的文件。

此方法也适用于大文件排序,先将大文件分割成若干可以装入内存的小文件,用以上方法进行排序。

   

3、现有一个1T大小的文本文件,存储在HDF5上,需要对其排序,hadoop上每个节点可用内存为5G,请诶出实现思路(考虑性能)。

 

4、对数组、LIST、SET、MAP 按照使用场景做个尽可能详细的对比。

 

5、画出JVM内存架构图,并给出各个区的作用,并给出Java 在那些情况下会出现内存溢出。

 

1)概念

内存泄漏定义:一个不再被程序使用的对象或变量还在内存中占有存储空间。

内存溢出 out of memory : 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求。内存泄漏的堆积会发生内存溢出。

2)

1.虚拟机栈和本地方法栈内存溢出

发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够。

2.堆内存溢出

发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了。

3.方法区和运行时常量池溢出

6、给出尽可能多的方式来看看Java应用对应的jvm内存各个区的内存分配值以及垃圾回收信息。

 

JVM学习----查看堆栈信息  https://blog.csdn.net/eos2009/article/details/78522901

7、给出Java实现线程安全的方式。

 

8. 画出运行mapreduce的流程图。

 

9、画出HBase架构图

 

10、如果有如下表结构

            Oracle 关系表有100亿车联网监控数据

            <car_id , x, y, create_at, org_id,type>

            car_id:8 为整数,

            x:经度 浮点小数点后3位

            y:维度 浮点小数后3位

            create_at: 创建时间 timestamp

            type:类型1位整数,1.表示报警点, 2.正常点

            org_id:组织机构id,3位长整数

            需要支持如下业务

            查询指定天指定车辆的轨迹

            下载指定天指定单位所有报警点

    请按照hbase 设计优化策略,给出一种Hbase表结构并给出理由。  

 

 

1.

 

常见的RuntimeException异常有哪些?


RuntimeException是Exception类的子类,Exception类对象是Java程序处理或抛弃的对象,它有各种不同的子类分别对应于不同类型的例外。其中类RuntimeException代表运行时由Java虚拟机生成的例外,如算术运算异常 ArithmeticException(例如除以 0)、数组索引越界异常ArrayIndexOutOfBoundsException等;其他则为非运行时异常,例如输入输出异常IOException等。
注意:Java编译器要求Java程序必须捕获或声明所有的非运行时异常,但对运行时异常可以不做处理。虽然编译器对运行时异常不强制要求处理,但实际开发中为了程序的健壮性,还是有必要处理的。
在开发过程中常见的RuntimeException类型的异常主要有以下几种。
□ ArithmeticException:数学计算异常。
□ NullPointerException:空指针异常。
□ NegativeArraySizeException:负数组长度异常。
□ ArrayOutOfBoundsException:数组索引越界异常。
□ ClassNotFoundException:类文件未找到异常。
□ ClassCastException:类型强制转换异常。
□ SecurityException:违背安全原则异常。
其他非RuntimeException类型的常见异常主要有以下几种。
□ NoSuchMethodException:方法未找到异常。
□ IOException:输入输出异常。
□ EOFException:文件已结束异常。
□ FileNotFoundException:文件未找到异常。
□ NumberFormatException:字符串转换为数字异常。
□ SQLException:操作数据库异常

 

 

 

   

posted @ 2021-04-19 23:26  abcdefghijklmnop  阅读(230)  评论(0编辑  收藏  举报