博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度网页搜索部
阅读量:6831 次
发布时间:2019-06-26

本文共 2038 字,大约阅读时间需要 6 分钟。

一、算法效率比较

      题目:针对数组A和数组B,两个数组的元素内容相同,不过数组A是已经排序的,数组B是乱序的,针对数组的中位数,存在以下两组程序,比较其效率并分析原因。       

int g;int main() {    g = 0;    for(int i = 0 ; i < n ; i++) {        if( A[i] > mid )           g++;    }    for(int i = 0 ; i < n ; i++) {        if(B[i] > mid )           g++;    }}

 

      当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。

      这个题目之前在网上浏览到过,知道有序的数组的效率其实比无序的要高很多,但是原因实在想不出来。现在搜一下,原来是stackoverflow上面的经典问答呢,原因不是编译器动手脚,而是CPU动的手脚,CPU有一个叫分支预测的技术,是这个技术导致有序数组的效率很高。 CPU指令执行的过程是流水线,简单的分支预测方案是针对当前元素(实际是处理过元素的统计学规律)判断下一个元素的指令跳转方向,有序的话分支预测的准确率很高,无序的话分支预测技术就不生效了,无法提前装载指令进入流水线,这样就损耗了一定的CPU时间。

二、简单算法之求不同元素

      题目:一个数组中只有一个数字出现1次,其他数字出现两次。

      挺简单的题目,因为见过,所以就跳过了这个题目,所以元素异或即可。

三、DP题目

      题目:一个m*n得棋盘,每个格子中有一个数字,计算从左上角至右下角的最大路径和,每一步行只能够向右或者向下行走。

      ACM的时候做过,我只知道是DP,不过不是很理解,现在好好高一下。

         

      

先初始化二维数组S,用双重for循环,Arrays.fill方法只可初始化一维数组	s[0][0] = a[0][0];	for(int i=1; i

三、海量数据处理

      问题:两个URL文件,分别有20亿条记录,每个URL的项目大约1KB。文件中有重复的URL记录,如何去除重复?

      因为在一面的过程中了解到,有序的数组去除重复的时候能够得到快速的去重,所以就考虑到了首先排序,但是两个这么大的文件单机排序?外部排序,k路归并排序,然后面试官就顺势的问了我k路归并排序的知识,k路归并排序的时间估计,因为k路归并排序很多时间在磁盘的IO上面,所以我猜测可能磁盘的IO才是时间的平静,每个元素最终进出磁盘4次,所以我估计的方法是元素数量*4*磁盘IO平均时间。不知道这个方法对不对。

      多机的扩展,MapReduce程序应该可以完成,但是我对hadoop不是很了解(所以这个方法没有答)。自己想一下多机的扩展吧,当然也是分治,想想也可以多机k路归并排序,后来面试官引导我说可以不排序么?我才意识到原始问题只是为了去除重复,所以这里分治并且利用hash的方法应该能够达到很快速的算法(复习一下《大型网站架构》这本书)一致性simhash方法应该是解决这个问题的。

      我首先想到的是hash,因为前面见过如何求出访问最多的IP,就是对IP进行Hash,只不过不知道如何Hash而已,过两天专门搞海量数据的Hash处理。

      参考文献http://www.cnblogs.com/weixliu/p/3900633.html

四、象棋问题

      中国象棋中帅,将和一个将身边的士,输出其合理位置的方案。

      刚看到这个算法题目的时候还卡了一下,不过后来自己把棋盘编号为1,2,3,4,5,6,7,8,9之后豁然开朗~不过我的代码if,else比较多,3类情况枚举,后来在面试官的提示下进行条件合并,节省了很多的代码。 

for(int s = 1 ; s <= 9;s++) {     for(int j = 1 ; j <= 9;j++) {          for(int jsb = 1; jsb <= 9;jsb += 2) {                         if( validposition(s,j,jsb))                          printf("%d,%d,%d",s,j,jsb);          }       }} bool validposition(int s,int j,int jsb) {   //将和帅相对应,并且不是士兵挡在将的前面的情况???    if ( s%3 == j%3 && !( jsb % 3 == j % 3 && jsb < j ) )        return false;    return true;}

 

你可能感兴趣的文章
【案例分享】电力设备生产数据的多层分组统计报表实现
查看>>
Windows 7下安装Cygwin亲历烦恼记录
查看>>
4G时代,语音社交APP或成智能手表的杀手级应用
查看>>
年入十万靠努力,年入百万靠能力,年入千万靠什么
查看>>
【免费下载】《这样理解知识管理》电子书,2016学会知识管理
查看>>
轻量级的Web服务器Nginx0.9.0 开发版发布
查看>>
听到两个程序员聊天——A:“借我1K块。”
查看>>
Oracle ROWID
查看>>
重构可让SQL提高可维护性,可读性以及效能性
查看>>
java多线程例子
查看>>
fabric自动部署
查看>>
linux 命令小抄
查看>>
前端必读:浏览器内部工作原理
查看>>
C Socket Programming for Linux with a Server and Client Example Code
查看>>
6天通吃树结构—— 第一天 二叉查找树
查看>>
vs2005/vs2008和sql2005 的安装顺序
查看>>
powerdesigner 设置自动增长列(identity)和默认值
查看>>
Click Button to change the color of TextView
查看>>
oracle preparestmt 插入时间
查看>>
Java系的几种WebServer和ApplicationServer
查看>>