考研复试计算机

操作系统:

1.文件系统和数据库系统的区别,哪个效率更高,为什么。

(1) 文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据;
(2) 文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离;
(3) 文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据;
(4) 文件系统实现以文件为单位的数据共享数据库系统实现以记录和字段为单位的数据共享。

数据库系统更高效,文件系统数据缺少统一管理,数据结构,编码等不规范,易出现数据冗余,且编写程序不方便,不能很好满足不同程序的需求。

 

2.进程上下文切换具体过程,是什么实现的?

进程的上下文信息包括, 指向可执行文件的指针, 栈, 内存(数据段和堆), 进程状态, 优先级, 程序I/O的状态, 授予权限, 调度信息, 审计信息, 有关资源的信息(文件描述符和读/写指针), 关事件和信号的信息, 寄存器组(栈指针, 指令计数器)等等。

 在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。在程序中,上下文切换过程中的“页码”。

 由操作系统内核完成

  1. 挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,

  2. 在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复

  3. 跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程

信息是保存在进程控制块(PCB)中的。PCB还经常被称作“切换帧”(switchframe)。“页码”信息会一直保存到CPU的内存中,直到他们被再次使用。


3.BIOS的意思,程序的可移植性?

即微机的基本输入输出系统(Basic Input-Output System),是集成在主板上的一个ROM芯片,其中保存有微机系统 最重要的基本输入输出程序、系统信息设置、开机上电自检程序和系统启动自举程序。


4..操作系统的基本概念

        操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机工作和资源分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统的最基本的系统软件。

并发,共享,虚拟,异步

5.操作系统开机过程;

  1. BIOS 程序首先将存储设备的引导记录(Boot Record)载入内存,并执行引导记录中的引导程序(Boot);
  2. 引导程序会将存储设备中的操作系统内核载入内存,并进入内核的入口点开始执行
  3. 后操作系统内核完成系统的初始化,并允许用户与操作系统进行交互

6.操作系统分哪些部分,进程管理包含什么内容;

 

7.操作系统我们所学的其他课程有什么关系,还是操作系统是个独立的课程

 

8.什么是系统调用?它和库函数调用有什么区别?

 

系统调用在内核态,库函数调用在用户态。

 

计算机网络:

1.数据链路层是干什么的?

链路层的主要功能 
链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应 
具备如下功能: 
① 链路连接的建立,拆除,分离. 
② 帧定界和帧同步.链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但 
无论如何必须对帧进行定界. 
③ 顺序控制,指对帧的收发顺序的控制. 
④ 差错检测和恢复。还有链路标识,流量控制等等.差错检测多用方阵码校验和循环码校 
验来检测信道上数据的误码,而帧丢失等用序号检测.各种错误的恢复则常靠反馈重发 
技术来完成. 

2.输入数据在网络层叫什么?

包,在数据链路层是祯,在物理层是比特流。

3.分组的生命期,为什么要设置这个生命期?

4.dns的工作过程?

DNS的工作原理及过程分下面几个步骤:
        第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
        第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。 
        第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址。
        第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
        第五步:重复第四步,直到找到正确的纪录。
        第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

5.点击一个链接的网络过程;   

                                                                    

>>>点击网址后,应用层的DNS协议会将网址解析为IP地址;
 
DNS查找过程:
 
1.        浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。
 
2.        如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存(hosts文件)中是否有这个域名对应的DNS解析结果。
 
3.        若还没有,此时会发送一个数据包给DNS服务器,DNS服务器找到后将解析所得IP地址返回给用户。
 
 
 
>>>在应用层,浏览器会给web服务器发送一个HTTP请求;
 
请求头为:GET http://www.baidu.com/HTTP/1.1
 
 
 
>>>在传输层,(上层的传输数据流分段)HTTP数据包会嵌入在TCP报文段中;
 
TCP报文段需要设置端口,接收方(百度)的HTTP端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP报文段由TCP首部(包含发送方和接收方的端口信息)+ HTTP数据包组成。
 
 
 
>>>在网络层中,TCP报文段再嵌入IP数据包中;
 
IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样IP数据包由IP头部(IP地址信息)+TCP报文段组成。
 
 
 
>>> 在网络接口层,IP数据包嵌入到数据帧(以太网数据包)中在网络上传送;
 
数据帧中包含源MAC地址和目的MAC地址(通过ARP地址解析协议得到的)。这样数据帧由头部(MAC地址)+IP数据包组成。
 
 
 
>>>数据包经过多个网关的转发到达百度服务器,请求对应端口的服务;
 
服务接收到发送过来的以太网数据包开始解析请求信息,从以太网数据包中提取IP数据包—>TCP报文段—>HTTP数据包,并组装为有效数据交与对应线程池中分配的线程进行处理,在这个过程中,生成相应request、response对象。
 
 
 
>>>请求处理完成之后,服务器发回一个HTTP响应;
 
请求处理程序会阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。处理完毕后,数据通过response对象给客户输出信息,输出信息也需要拼接HTTP协议头部分,关闭后断开连接。断开后,服务器端自动注销request、response对象,并将释放对应线程的使用标识(一般一个请求单独由一个线程处理,部分特殊情况有一个线程处理多个请求的情况)。
 
响应头为:HTTP/1.1200 OK
 
 
 
>>>浏览器以同样的过程读取到HTTP响应的内容(HTTP响应数据包),然后浏览器对接收到的HTML页面进行解析,把网页显示出来呈现给用户。
 
客户端接收到返回数据,去掉对应头信息,形成也可以被浏览器认识的页面HTML字符串信息,交与浏览器翻译为对应页面规则信息展示为页面内容。

6.网络模型,网络层协议有哪些,应用层协议有哪些?

网络各层的协议:
应用层:HTTP,FTP,NFS,SMTP等
运输层: TCP,UDP,SPX等
网络层: IP,IPX等
数据链路层: ATM,FDDI等
物理层: Rj45,802.3等
IP协议,ARP协议,RARP协议,ICMP协议已经IGMP协议

7.两台计算机中的进程进行通信,需要解决什么问题?

 

 

 

基础数学:

1.什么是极限,什么是趋近

2.极值的求法

3. 泰勒级数的展开式;为什么把一个简单的函数表示成那么麻烦的泰勒级数?

4.信息和数据的区别?

5.图形和图像有什么区别?

6.概率的全概率公式,高数的傅立叶级数,现代秩的概念

7.一枚硬币抛三次,至少一次正面的概率

8.什么是图的同构

9.说一下数理逻辑的定义

10.矩阵的用途

11.线性相关与无关

12.离散数学包含那些部分;

13.集合的势,无限集合的大小比较,偏序,良序,全序,划分,欧拉图,Hamilton图

14.什么是群

15.谓词逻辑和命题逻辑的区别

16.什么是等价关系,什么是子句,什么是合取范式

17.什么是二元关系

 

 

数据结构与算法:

1.什么是二叉树?

在计算机科学中,二叉树是每个节点最多有两个子树的树结构。

2.已知病毒特征码一百万个和文件一个,问用什么查找算法能尽快的检测出该文件是否有病毒?

3  

冯诺依曼体系结构???

第一,程序和数据存放在同一存储器的不同地址上;
 
第二,存储单元线性排列,且其位数固定;
 
第三,顺序执行,即程序/数据—>内存—>取指令执行指令;
 
  顺序执行程序。执行前,将需要的程序和数据先放入存储器(PC为内存)。当执行时把要执行的程序和要处理的数据按顺序从存储器中取出指令一条一条地执行,称作顺序执行程序。
 
第四,组成上有运算器,存储器,控制器,输入/输出设备。如下图:


3.快排和插入排序那个更高效?

快速排序高效。

4.简单描述九宫格算法?

5.学数据结构的意义?

6.离散数学的图论和数据结构图论的相同点和不同点?

7.堆栈和堆的区别?

①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
   ·堆中某个节点的值总是不大于或不小于其父节点的值;
   ·堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。
④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

栈:什么是栈?又该怎么理解呢?
①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
堆栈:什么是堆栈?又该怎么理解呢?
注意:其实堆栈本身就是栈,只是换了个抽象的名字。
堆栈的特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
1.堆栈空间分配
 ①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
 ②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆可以被看成是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。

8.递归变成非递归需要什么(堆栈)?

9.堆栈溢出是怎么回事儿?

堆栈溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

10.算法的几种策略,迪杰斯特拉算法?

分治算法
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
贪心算法
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
动态规划算法
动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解;如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题。
解决上述问题的办法是利用动态规划。该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。
因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复出现的子问题,只在第一次遇到时加以求解,并把答案保存起来,让以后再遇到时直接引用,不必重新求解。
回溯算法
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。
其基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。换句话说,这个结点不再是一个活结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。

11.要得到文件的后N行,需要什么数据结构实现?

12.数据库中B+树和B-树的区别?

B-树
 
       是一种多路搜索树(并不是二叉的):
 
B+树
 
       B+树是B-树的变体,也是一种多路搜索树: B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在
 
非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
 
       B+的特性:
 
       1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好
 
是有序的;
 
       2.不可能在非叶子结点命中;
 
       3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储
 
(关键字)数据的数据层;
 
       4.更适合文件索引系统;

13.什么是树?什么是图?树和图有什么区别?

14.矩阵相乘的时间复杂度是多少?

15.现在有一未知大小的文件,里面是单词的集合,现要将文件读入内存,问采用什么存储结构较好?

 

、怎么在海量数据中找出重复次数最多的一个?
   方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。
然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。

 

数据库:

1.数据库查询语句怎样写效率更高?

1、建立索引
2、优化SQL语句
3、条件精确,使用索引
4、最好使用内部过程
5、只取需要的数据,不冗余

2.使用sql语句实现图的某一顶点可达的该图的其他顶点的查找?

3.数据库完整性措施;

数据完整性分为四类:实体完整性(Entity Integrity)、域完整
性(Domain Integrity)、参照完整性(Referential Integrity)、用户定义的完整性(User-definedIntegrity)。

4.如何保证数据的一致性?

5.数据库的基本理论知识,像关系数据库的定义、三种范式?

6.什么是事务处理?

 

 

软件测试:

1.工程使用什么测试手段,什么模型?

2.软件测试时软件开发过程的哪个阶段的?

软件开发一般分为五个阶段:
1.问题的定义及规划
此阶段是软件开发与需求放共同讨论,主要确定软件的开发目标及其可行性。
2.需求分析
在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细需求分析。需求分析阶段是一个很重要的阶段,这一阶段做的好,将为整个软件项目的开发打下良好的基础。“唯一不变的是变化本身”,同样软件需求也是在软件爱你开发过程中不断变化和深入的,因此,我们必须定制需求变更计划来应付这种变化,以保护整个项目的正常进行。
3.软件设计
此阶段中偶要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等。软件设计一般分为总体设计和详细设计。还的软件设计将为软件程序编写打下良好的基础。
4.程序编码
此阶段是将软件设计的结果转化为计算机可运行的程序代码。在程序编码中必定要制定统一、符合标准的编写规范。以保证程序的可读性、易维护性。提高程序的运行效率。
5.软件测试
在软件设计完成之后要进行严密的测试,一发现软件在整个软件设计过程中存在的问题并加以纠正。整个测试阶段分为单元测试、组装测试、系统测试三个阶段进行。测试方法主要有白盒测试和黑盒测试。

3.什么是白盒测试?什么是黑盒测试?区别是什么?

 

黑盒测试就是:只关注输入数据和输出结果,具体是怎么实现的不关心,
就像:2的平方为4,和2*2=4,结果一致,但具体实现过程不需要知道,就像一个黑盒子,你只可以看见两端的结果,不知道内部具体的实现方式;
白盒就是很清楚的知道:功能是怎实现的,知道编程的内部结构;

 

计组:

1.冯诺依曼系统结构

2.冯诺依曼机的存储思想

主要有三点:
(1)计算机硬件组成应为五大部分:控制器,运算器,存储器,输入和输出;
(2)存储程序,让程序来指挥计算机自动完成各种工作;
(3)计算机运算基础采用二进制;

3.做过哪些实验

4.程序和数据分别怎么存储(其实也就是问冯诺依曼机和哈佛机的区别

 

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。
中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,
并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,
如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。


 

冯?诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,

编程语言

1.什么是C++动态联编技术,为什么C++要引入动态联编?

动态联编说的是程序在运行时才确定调用和被调用者的关系.

2.虚函数作用,主要在应用中?

指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

3.纯虚函数的作用,这也主要在实际应用中?

4.Andriod和ios各用什么语言写app;java和oc有什么共同点和不同点;java一次编译多处运行的原理;

5.什么是多态?

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。

6.子类继承父类的内存分配是怎样的?

分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量在哪里分配空间?”
1:虚拟机加载ExtendsDemo类,提取类型信息到方法区。
2:通过保存在方法区的字节码,虚拟机开始执行main方法,main方法入栈。
3:执行main方法的第一条指令,new Student(); 这句话就是给Student实例对象分配堆空间。因为Student继承Person父类,所以,虚拟机首先加载Person类到方法区,并在堆中为父类成员变量在子类空间中初始化。然后加载Student类到方法区,为Student类的成员变量分配空间并初始化默认值。将Student类的实例对象地址赋值给引用变量s。
4:接下来两条语句为成员变量赋值,由于name跟age是从父类继承而来,会被保存在子类父对象中(见图中堆中在子类实例对象中为父类成员变量分配了空间并保存了父类的引用,并没有实例化父类。),所以就根据引用变量s持有的引用找到堆中的对象(子类对象),然后给name跟age赋值。
4:调用say()方法,通过引用变量s持有的引用找到堆中的实例对象,通过实例对象持有的本类在方法区的引用,找到本类的类型信息,定位到say()方法。say()方法入栈。开始执行say()方法中的字节码。
5:say()方法执行完毕,say方法出栈,程序回到main方法,main方法执行完毕出栈,主线程消亡,虚拟机实例消亡,程序结束。

7.什么是重载如何实现重载?

 

专业方向:

1.什么是云计算?

云计算(cloudcomputing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。

2.杀毒现在为什么使用云计算?

3.解决一个复杂问题的策略有什么

 

编译原理:

1.词法分析和语法分析是怎么实现的?

2.编译原理和离散数学用的是什么教材,作者是谁?

3.***文法是几型文法?

4.如果用两种高级语言混合编译,需要解决什么问题?(我现在理解的:对变量、表达式和函数的整合)?


1、一枚硬币抛三次,至少一次正面的概率;
2、点击一个链接的网络过程;
3、如何比较两条曲线的相近程度;
4、数据库完整性措施;
5、上机3道题都怎么实现的;
6、操作系统开机过程;

我复试特惨!正好赶上中午送餐的进去。里面很乱,我读英文文章的时候好像没人在听,我自己也心不在焉,读完翻译的一塌糊涂,然后问问题:
1.什么是图的同构
2.说一下数理逻辑的定义
3.什么是面向方面

4.如何保证数据的一致性?


6.图形与图像的区别?

图形与图像的区别如下: 
基本概念 
图形是指由外部轮廓线条构成的矢量图。即由计算机绘制的直线、圆、矩形、曲线、图表等;而图像是由扫描仪、摄像机等输入设备捕捉实际的画面产生的数字图像,是由像素点阵构成的位图。 
数据描述 
图形:用一组指令集合来描述图形的内容,如描述构成该图的各种图元位置维数、形状等。描述对象可任意缩放不会失真。 
图像:用数字任意描述像素点、强度和颜色。描述信息文件存储量较大,所描述对象在缩放过程中会损失细节或产生锯齿。 
屏幕显示 
图形:使用专门软件将描述图形的指令转换成屏幕上的形状和颜色。 
图像:是将对象以一定的分辨率分辨以后将每个点的信息以数字化方式呈现,可直接快速在屏幕上显示。 
适用场合 
图形:描述轮廓不很复杂,色彩不是很丰富的对象,如:几何图形、工程图纸、CAD、3D造型软件等。 
图像:表现含有大量细节(如明暗变化、场景复杂、轮廓色彩丰富)的对象,如:照片、绘图等,通过图像软件可进行复杂图像的处理以得到更清晰的图像或产生特殊效果。 
编辑处理 
图形:通常用Draw程序编辑,产生矢量图形,可对矢量图形及图元独立进行移动、缩放、旋转和扭曲等变换。主要参数是描述图元的位置、维数和形状的指令和参数。 
图像:用图像处理软件(Paint、Brush、Photoshop等)对输入的图像进行编辑处理,主要是对位图文件及相应的调色板文件进行常规性的加工和编辑。但不能对某一部分控制变换。由于位图占用存储空间较大,一般要进行数据压缩。 
技术关键 
图形:图形的控制与再现。 
图像:对图像进行编辑、压缩、解压缩、色彩一致性再现等

7.矩阵的用途?

第一个用途是解线性方程组,比如二维矩阵可以理解为一个平面直角坐标系内的点集,通过计算点与点之间的距离,完成聚类、分类或预测,类似的运算完全可以扩展到多维的情况。
第二个用途是方程降次,也就是利用矩阵的二次型通过升维将线性不可分的数据集映射到高维中,转换为线性可分的情形,这是支持向量机的基本原理之一。
第三个用途是变换,矩阵可以通过特征值和特征向量完成维度约简,简化类似图片这种高维数据集的运算,主成分分析使用的就是这个原理。

8.线性相关与无关?

线性相关/无关的定义在书上都写得很清楚,这里大概描述一下并谈谈一些想法。
相关,就是在一组数据中有一个或者多个量可以被其余量表示。


处理海量数据问题,无非就是:

分而治之/hash映射 + hash统计 + 堆/快速/归并排序;

Bloom filter/Bitmap;
Trie树/数据库/倒排索引;
外排序;
分布式处理之hadoop/mapreduce。
本文接下来的部分,便针对这5种方法模式结合对应的海量数据处理面试题分别具体阐述。

密匙一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序

1、海量日志数据,提取出某日访问百度次数最多的那个IP。
 

    既然是海量数据处理,那么可想而知,给我们的数据那就一定是海量的。针对这个数据的海量,我们如何着手呢?对的,无非就是分而治之/hash映射 + hash统计 + 堆/快速/归并排序,说白了,就是先映射,而后统计,最后排序:

分而治之/hash映射:针对数据太大,内存受限,智能是:把大文件化成(取模映射)小文件,即16字方针:大而化小,各个击破,缩小规模,逐个解决
hash统计:当大文件转化了小文件,那么我们便可以采用常规的hashmap(ip,value)来进行频率统计。
堆/快速排序:统计完了之后,便进行排序(可采取堆排序),得到次数最多的IP。
   具体而论,则是: “首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。”--十道海量数据处理面试题与十个方法大总结。

 
    但如果数据规模比较小,能一次性装入内存呢?比如下面的这道题,题目中说,虽然有一千万个Query,但是由于重复度比较高,因此事实上只有300万的Query,每个Query255Byte,因此我们可以考虑把他们都放进内存中去,而现在只是需要一个合适的数据结构,在这里,Hash Table绝对是我们优先的选择。OK,请看第2题:

2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。
    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

前面说了,数据比较小,摒弃分而治之/hash映射的方法,直接上hash统计,然后排序。So,

hash统计先对这批海量数据预处理(维护一个Key为Query字串,Value为该Query出现次数的HashTable,即hashmap(Query,Value),每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;如果该字串在Table中,那么将该字串的计数加一即可。最终我们在O(N)的时间复杂度内用Hash表完成了统计;
堆排序:第二步、借助堆这个数据结构,找出Top K,时间复杂度为N‘logK。即借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别和根元素进行对比所以,我们最终的时间复杂度是:O(N) + N'*O(logK),(N为1000万,N’为300万)。
    别忘了这篇文章中所述的堆排序思路:“维护k个元素的最小堆,即用容量为k的最小堆存储最先遍历到的k个数,并假设它们即是最大的k个数,建堆费时O(k),并调整堆(费时O(logk))后,有k1>k2>...kmin(kmin设为小顶堆中最小元素)。继续遍历数列,每次遍历一个元素x,与堆顶元素比较,若x>kmin,则更新堆(用时logk),否则不更新堆。这样下来,总费时O(k*logk+(n-k)*logk)=O(n*logk)。此方法得益于在堆中,查找等各项操作时间复杂度均为logk。”--第三章、寻找最小的k个数。
    当然,你也可以采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。

 

    由上面这两个例题,分而治之 + hash统计 + 堆/快速排序这个套路,我们已经开始有了屡试不爽的感觉。下面,再拿几道再多多验证下。请看第3题:
3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
   又是文件很大,又是内存受限,咋办?还能怎么办呢?无非还是

分而治之/hash映射:顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为x0,x1,...x4999)中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。
hash统计:对每个小文件,采用trie树/hash_map等统计每个文件中出现的词以及相应的频率。
堆/归并排序:取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100个词及相应的频率存入文件,这样又得到了5000个文件。最后就是把这5000个文件进行归并(类似与归并排序)的过程了。
4、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
   直接上:

hash映射:顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。
hash统计:找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。注:hash_map(query,query_count)是用来统计每个query的出现次数,不是存储他们的值,出现一次,则count+1。
堆/快速/归并排序:利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。对这10个文件进行归并排序(内排序与外排序相结合)。
     除此之外,此题还有以下两个方法:
    方案2:一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
    方案3:与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
5、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
    可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

分而治之/hash映射:遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
hash统计:求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
    OK,此第一种方法:分而治之/hash映射 + hash统计 + 堆/快速/归并排序,再看最后三道题,如下:

      8、怎么在海量数据中找出重复次数最多的一个?
    方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。
9、上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。
    方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第2题提到的堆机制完成。
10、一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
    方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。

    接下来,咱们来看第二种方法,Bitmap。

 

密匙二:Bloom filter/Bitmap
关于什么是Bloom filter,请参看此文:海量数据处理之Bloom Filter详解。
  适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
  基本原理及要点:
  对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。

  还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。

  举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。
  注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。

  扩展:
  Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。

  问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?
  根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿*8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。

    同时,上文的第5题:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。

    至于什么是Bitmap,请看此文:http://blog.csdn.net/v_july_v/article/details/6685962。下面关于Bitmap的应用,直接上题,如下第6、7道:

6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
    方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
    方案2:也可采用与第1题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。

7、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
    方案1:oo,申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

 

密匙三、Trie树/数据库/倒排索引
Trie树

  适用范围:数据量大,重复多,但是数据种类小可以放入内存
  基本原理及要点:实现方式,节点孩子的表示方式
  扩展:压缩实现。

  问题实例:
  1).有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。
  2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
  3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。

    更多有关Trie树的介绍,请参见此文:从Trie树(字典树)谈到后缀树。

数据库索引
  适用范围:大数据量的增删改查
  基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。

倒排索引(Inverted index)
  适用范围:搜索引擎,关键字查询
  基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
 以英文为例,下面是要被索引的文本:
    T0 = "it is what it is"
    T1 = "what is it"
    T2 = "it is a banana"
我们就能得到下面的反向文件索引:
    "a":      {2}
    "banana": {2}
    "is":     {0, 1, 2}
    "it":     {0, 1, 2}
    "what":   {0, 1}
 检索的条件"what","is"和"it"将对应集合的交集。

  正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。
  扩展:
  问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。

    关于倒排索引的应用,更多请参见:第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践,及第二十六章:基于给定的文档生成倒排索引的编码与实践。

密匙四、外排序
  适用范围:大数据的排序,去重
  基本原理及要点:外排序的归并方法,置换选择败者树原理,最优归并树
  扩展:
  问题实例:
  1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。
  这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。

    关于多路归并算法及外排序的具体应用场景,请参见此文:第十章、如何给10^7个数据量的磁盘文件排序。

密匙五、分布式处理 Mapreduce
      适用范围:数据量大,但是数据种类小可以放入内存
  基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。
  扩展:
  问题实例:
  1).The canonical example application of MapReduce is a process to count the appearances of each different word in a set of documents:
  2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
  3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的中数(median)?


————————————————
版权声明:本文为CSDN博主「LeetCoder」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baozhiqiangjava/article/details/79603394

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值