复试综合知识点一

120 阅读8分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

1、简述数据的逻辑结构和物理结构的概念和两者的关系

数据的逻辑结构:

是指数据对象中数据元素之间的相互关系。包括集合结构、线性结构、树形结构、图形结构。

  • 集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其它关系
  • 线性结构:线性结构中的数据之间是一对一的关系。
  • 树形结构:树形结构中的数据之间存在一种一对多的层次关系。
  • 图形结构(通信网络、交通网络、人际关系网络):图形结构的数据元素是多对多的关系。

例如:家族图谱(一对多)

image.png

数据的逻辑结构:

也称为物理结构,是指数据的逻辑结构在计算机中的存储形式。是数据在物理存储空间上选择集中存放还是分散存放。假设要存储大小为 10G 的数据,则集中存放就如图 3a) 所示,分散存放就如图 3b)所示。

数据的物理存储方式

如何选择,主要取决于存储设备的状态以及数据的用途。

顺序存储和链式存储。

  • 顺序存储:是把数据元素存放在地址连续的存储单元里。
  • 链式存储:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。

2、什么是算法?算法的性质有哪些?

算法(algorithm)是解决特定问题的步骤描述,通俗地讲,算法就是描述解决问题步骤的方法。

算法的特性

(1)确定性。算法的每一步都有确定的含义,不会出现二义性。即在相同条件下,只有一条执行路径,相同的输入只会产生相同的输出结果。

(2)可行性。算法的每一步都是可执行的,通过执行有限次操作来完成其功能。

(3)有穷性。一个算法必须在执行有穷步骤之后结束,且每一步都可在有穷时间内完成。这里的有穷概念不是数学意义上的,而是指在实际应用当中可以接受的、合理的时间和步骤。

(4)高效率与低存储。算法的效率通常指的是算法的执行时间,对于同一个问题的多种算法,执行时间短的其效率就高。 存储量指的是算法在执行过程中所需的最大存储空间,包括所用到的内存及外存。

3、快速排序在什么情况下效率最高,什么情况下最差?

最好的情况:每次选的pivot几乎能把数据均分成两半,这样递归树的深度就是logN,这样快排的时间复杂度为O(NlogN)

最坏的情况:每次找的pivot将数组分成两部分,其中有一部分是空,这样递归树就变成了一棵倾斜的树。树的深度为n-1,这样时间复杂度就变成了O(N^2). 一般当数据有序或者局部有序的时候会出现这种坏的情况,比如数组正序或者逆序,(数字完全相同的时候也是有序的特殊情况)。 解决方法:

选pivot的时候可以随机选,而不是每次选第一个或者最后一个 对子数组进行快排序的时候可以先扫描一遍,如果子数组有序就不用再快排了。

4、简述程序正确性证明的思想和方法?

穷举和假设

5、什么是递归排序?

递归作为一种算法在程序设计语言中广泛应用。在代码的世界中,一个程序如果调用自身,那它就是递归的。

更直接的说,递归就是把规模大的问题转换为规模小的相似的子问题来解决。特别地,在函数实现时,因为解决大问题的方法和解决小问题的方法往往就是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所在

6、什么是NP问题?

NP问题

  • P问题是一类可以通过确定性图灵机在多项式时间(Polynomial time)内解决的问题集合。
  • NP问题是一类可以通过非确定性图灵机( Non-deterministic Turing
    Machine)在多项式时间(Polynomial time)内解决的决策问题集合。

多项式时间(Polynomial time)在计算复杂度理论中,指的是一个问题的计算时间m(n)不大于问题大小n的多项式倍数,即m(n) = O(n)。任何抽象机器都拥有一复杂度类,此类包括可于此机器以多项式时间求解的问题。

P问题是NP问题的子集,也就是说任何可以被图灵机在多项式时间内解决的问题都可以被非确定性的图灵机解决,NP问题至今没有找到多项式时间算法解。

np问题习题


7、如何用顺序存储结构存储完全二叉树?

完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可。

二叉树的顺序存储就是用一组连续的存储单元来存放二叉树的数据元素。首先要对树中的每个结点进行编号,编号顺序就是结点在顺序表中的存储顺序。编号方法是:按照完全二叉树的形式,根结点的编号为1,然后按照层次从上到下、每层从左到右的顺序对每个结点进行编号。当某结点是编号为i的结点的左孩子时,它的编号应为2i,当他是右孩子时编号则为2i+1

8、堆的特征是什么?如何利用堆进行排序?

堆的逻辑结构是一颗完全二叉树

堆的物理结构是一个数组

1.结构性:用数组表示成完全二叉树

2.有序性:任一节点的关键字,都是其子树所有节点的最大值或最小值

排序思想:

  • 首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

  • 将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

  • 将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组

注意:升序用大根堆,降序就用小根堆(默认为升序)

9、贪心算法的思想是什么?能得到最佳结果吗?

贪心算法详解

10、简述用非递归实现递归的方法

1、直接转换法

用循环结构代替单向递归和尾递归。

单向递归:简单的说是指递归的过程总是朝着一个方向进行。函数1调用函数2再调用函数3…一只不重复调用之前的函数。 尾递归函数是以递归调用结尾的函数,是单向递归的特例。

尾递归的递归调用语句只有一个,而且是放在过程的最后。当递归调用结束并返回时,上层函数也就结束了。无需关注函数地址、参数、局部变量等,因此可以直接采用循环写出非递归过程。

斐波那契数列的递归

int Fib(int n) {
  if (n<=1) 
  	return n;
  else
  	return Fib(n - 1) + Fib(n - 2);//尾递归调用
}

斐波那契数列的非递归

int Fib(int n) {
  if (n<=1) 
  	return n;
  else//循环实现
  	int x1= 1;
 	int x2= 0;
 	int sum;
 	for(int i = 2;i < = n; i++) {
    	sum= x1+x2;
  	x2= x1;
    	x1= sum;
   }
  	return sum;
}

模拟栈调用

用循环结构代替单向递归和尾递归。

详解

11、树的遍历有几种方法?

先序遍历,中序遍历,后序遍历。

12、对链表设置头节点的好处是什么?

  1. 便于首元结点的处理:增加头结点后,首元结点的地址保存在头结点的指针域中,则对链表的第一个元素的操作和其他元素相同,无需进行特殊处理。(若单链表不带头结点,则首元结点无前驱结点,在其前插入结点和删除该结点操作复杂些。)

  2. 便于空表和非空表的统一处理:增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。

注:首元结点是指链表中存储线性表中第一个数据元素a1的结点(头结点的下一个结点)。为了操作方便,通常在链表的首元结点之前附设一个结点(头结点)。

13、分治法的基本思想是什么?为什么采用递推关系进行分治算法的时间复杂度分析?

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

递归调用时, 最关键的就是递归调用栈的深度. 我们也可以理解为分治算法中, 被分成的段数。从而把大问题转换为小问题去解决。