2019/05/29大数据面试总结

一.假如有一个1g的文件,每行都不超过20个字符,可用内存只有100m,现在对其进行排序,写出实现的思路

总结:在内存只有100m的情况下首先排除内存排序算法,应该考虑外存排序算法。

1. 首先把文件分成n个小于100m的小文件,然后在把小文件放入内存中进行排序(快速排序),

2、1g数据使用100m内存如何排序 
  ①、把磁盘上的1g数据分割为n块(chunks),每份<100m。(注意,要留一些系统空间!) 
  ②、顺序将每份<100m数据读入内存,使用quick sort算法排序。 
  ③、把排序好的数据(也是<100m)存放回磁盘。 
  ④、循环n次,现在,所有的n个块都已经各自排序了。(剩下的工作就是如何把它们合并排序!) 
  ⑤、从n个块中分别读取<100m/n=??入内存(?? input buffers)。 
  ⑥、执行n路合并,并将合并结果临时存储于基于内存的输出缓冲区中。当缓冲区写满相对应的内存时,写入硬盘上最终文件,并清空输出缓冲区;当n个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个??GB,直到全部处理完成。

3、继续优化 
  磁盘I/O通常是越少越好(最好完全没有),那么如何降低磁盘I/O操作呢?关键就在第5和第6步中的40路输入缓冲区,我们可以先做8路merge sort,把每8个块合并为1路,然后再做5-to-1的合并操作。 
  再深入思考一下,如果有多余的硬件,如何继续优化呢?有三个方向可以考虑: 
  使用并发:如多磁盘(并发I/O提高)、多线程、使用异步I/O、使用多台主机集群计算。 
  提升硬件性能:如更大内存、更高RPM的磁盘、升级为SSD、Flash、使用更多核的CPU。 
  提高软件性能:比如采用radix sort、压缩文件(提高I/O效率)等。
 

        注:什么为内排序和外排序?

               在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;

               在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

            #稳定排序和非稳定排序

              简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定                    的。反之,就是非稳定的。

               比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定                       的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,a2,a3,a5就不是稳定的了。

          #算法的时间复杂度和空间复杂度

           所谓算法的时间复杂度,是指执行算法所需要的计算工作量。

            一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

二,

package test.demo;

class Test {
    
    public int b =9;
    
}

public class TestDemo{
    private final void add1(int a){
        a++;
        System.out.println(a);
    }
    
    public final void add2(Test test){
        test.b++;
        System.out.println(test.b);
    }
    
    public static void main(String[] args) {
        int a=9;
        
        TestDemo test = new TestDemo();
        test.add1(a);
        System.out.println(a);
        Test  test1 =new Test();
        test.add2(test1);
        System.out.println(test1.b);
    }
}

输出结果为:10 9 10 10 

三,数据结构与算法

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任错错

如果对您有帮助我很开心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值