工作已经找好,看到以前的学习笔记竟然有人看,就把记忆中(过了3个月,不知道记得多少)的自己笔试面试中碰到过,与朋友碰到的重点内容相关的题注释在旁边,希望对大家面试有用。只是个人观点和经验
(好久没有写博客了,近期开始找工作,想把以前学过的课程复习一下,把大纲和基本的概念记下,方便后面的复习。)
#1、绪论
数据结构的内容:逻辑结构、存储结构、运算集合。
数据类型:一个值的集合和定义在此集合上的一组操作的总称。
抽象数据类型:abstract data type,用户经行软件设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机具体存储结构和运算的具体实现算法。此模块包含定义、表示和实现。也就是数据对象的定义、数据关系的定义、基本操作的定义。
算法特征:有穷性、确定性、可行性、输入、输出
算法设计的要求:正确性、可读性、健壮性、高效率和低存储的要求。
时间复杂度,空间复杂度。给一个程序要会算,常考。
#2、线性表
(笔试面试重点 :
笔试选择题经常出,要牢记顺序表和链表的定义、性质、优缺点,考题很活但不难;
***编程题面试笔试都会有:有头结点和无头结点的链表的反转、2个链表或数组的合并、3个数组归并……***)
定义:一个线性表示具有n个数据元素的有限序列
特点:同一性、有穷性、有序性
顺序表特点:
线性表链式存储结构的特点:
静态链表(数组表示和实现)
其他链表: 循环链表、双链表要了解
#3、限定性线性表——栈和队列
(笔试面试重点 :
笔试选择题经常出,一般都是从队列的进出顺序上做文章;
***编程题一般出在笔试,相对难一点:如迷宫、深搜、广搜 ***)
##栈
递归(算法设计方法):后调用先返回
特点:分而知之、把复杂问题分解为简单问题的求解方法;时间效率低。
##队列
#4、串
(笔试重点 :
笔试选择题:好像有算子串的个数吧,方正不多;
***编程题笔试偏多偏简单,算送分题多,就是那种一版会编程的读了题就能做的,eg,字符串局部位旋转,单词颠倒等 ***)
串(字符串):是零个或多个字符组成的有限序列,一般记为S=‘a1a2…an’,属于取值受限的线性表
子串:串中任意个连续的字符组成的子序列称为该串的子串。“ $\phi $”为任意串的子串。
主串:包含子串的串相应地称为主串
位置:字符在串中的序号称为该字符在串中的位置。
串相等:只有两个串的长度相等,且每个对应的字符都相等时才相等。
空格串:由一个或多个空格组成的串,非空串。
存储:
串的***模糊匹配***算法:朴素模式匹配算法(Brute-Force算法,简单匹配算法)、KMP算法
#5、数组和广义表
(见过相关的选择题,出的不多,了解概念就好)
数组定义:n(n>1)个相同类型数据元素a0,a1,…,an-1构成的有限序列,且该有限序列存储在一块地址连续的内存单元中。是线性表在元素上的扩展。
矩阵的压缩存储:特殊存储(对称矩阵、三角矩阵、对角矩阵)
广义表
定义:是线性表的推广,是由零个或多个单元素或子元素所组成的有限序列
广义表的长度:表中所含元素的个数n
广义表的深度:广义表展开后所含的括号的最大层数
表头:非空时,称第一个元素a1为广义表的表头,可能是原子,也可能是广义表;
表位:其余元素组成的表(a2,a3…an)称为广义表的表尾,一定是广义表。
存储:头尾链表存储表示、扩展线性存储表示、
#6、树
(笔试重点 :
笔试选择题:考题种类多,主要集中在遍历方法和二叉树上;
编程题笔试多,遍历树,构建二叉树,找最长路径,找公共祖先,找叶子结点等,多刷刷leetcode就好)
##树
定义:n(n>0)个结点的有限制,n==0为空树;非空树满足(有且只有一个特定的称为root的结点,其余n-1个结点可以划分成m个互不相交的有限集,没一部分又是一棵树)
表示方法:树形表示法;文氏图表示法;凹入表示法;括号表示法(广义表表示法)
基本术语:结点,结点的度,树的度,叶子,分支结点,孩子、双亲、兄弟、堂兄弟,路径与路径长度,结点的祖先和子孙,层次与高度,有序树和无序树,森林。
存储:双亲表示法、孩子表示法、孩子兄弟表示法
遍历方法:先根遍历、后跟遍历
##二叉树
要求:每个结点的度都不大于2,每个结点的孩子结点次序不能任意颠倒。
性质:
特殊树:满二叉树,完全二叉树
存储:顺序存储,链式存储结构
##森林
(多颗树组成森林)
遍历方法:先根遍历、后跟遍历
哈夫曼树:最小带权路径长度的二叉树称为哈夫曼树。
路径长度:一个结点到另一个结点之间的分支数目称为路径长度。
树的路径长度(树根到每个结点的路径长度之和),结点的权,带权路径长度
树的带权路径长度WPL:树中所有叶子结点的带权路径长度之和。
注意:
#7、图
(笔试重点 :
笔试选择题:考题种类多,像遍历、拓扑结构,关键路劲等;
面试中被问过概念:关键路径和最短路径的区别
***编程题很少有,记得在微软的上机笔试中见过,***)
定义:两个集合V、E组成,记为G=(V,E),其中V是顶点的有限集合,E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G)。
基本术语:完全图、稀疏图、稠密图、子图、顶点的度(入度、出度)、权与网、路径和图、连通图、强连通图(来回都连通)、连通分量等
存储结构:邻接矩阵表示法(数组表示法)、邻接表存储方法、十字链表(有向图的邻接表和逆邻接表结合在一起)、邻接多重表
遍历:深度优先搜索、广度优先搜索
最小生成树:
AVO网:用顶点表示活动,边表示活动的顺序关系的有向图称为AOV网。
拓扑排序:在一个有向图中找一个拓扑序列(当且仅当该顶点序列满足: 若 < v i , v j > <vi,vj> <vi,vj>是图中的弧,则在序列中顶点vi必须排在顶点vj之前)的过程称为拓扑排序。
关键路径:从源点(唯一的入度为0的点)到汇点(出度为0的点)的最长路径路径的长度即为完成整个工程任务所需的时间,该路径叫做关键路径。
最短路径:
#8、动态存储管理
新用户请求分配内存:一,系统继续从地址的空闲中分配地址,直到无法分配,才回收不在使用的空闲块。二,运行结束,就把它所占的内存释放成空闲块。
分配策略:首次拟合发,最佳拟合法(适用最广),最差拟合法。
#9、查找
(面试笔试重点 :
笔试选择题、简答题都有,要会画查找的哈希表、会计算平均查找时间;
面试编程:折半查找;
面试经常考:可能因为我研究生的方向是与数据查询有关的,经常被问到解决哈希冲突的方法,问的细了,还问各个的优缺点,一般何时用)
基本术语:文件,记录、字段(数据的最小单位)、关键字、主关键字、次关键字
静态查找表:查询某个特定的元素是否在表中;检索某个特定的元素的各种属性。查找方法为 顺序查找、折半查找、索引顺序表查找
动态查找表:若在查找的同时对表做修改运算(如插入和删除)
哈希表:
#10、排序
(面试笔试重点,重中之重呀!!!!! :
笔试选择题:一般偏概念,要熟练各个排序算法的步骤、时间复杂度、空间复杂度、稳定性、会算移动次数等;
面试经常考:现场编程,让写过递归与非递归的快排、递归与非递归的归并排序、堆排序,所以这章真的真的很重要)
概念:将一组杂乱无章的数据按一定的规律顺序排列起来,使之按关键字递增(0或递减)有序排列。了解稳定排序的意义
排序时间开销:算法执行中关键字比较次数和记录移动次数来衡量。
内部排序:待排序记录存放在计算机随机存储中进行的排序过程。
外部排序:待排序记录数量大,在排序过程中尚需对外存进行访问的排序过程。
方法分类:
插入排序:将待排序记录按其关键字大小插入到前面已经排好序的子表中的适当位置,知道全部插入完全为止。包括:直接插入排序、折半插入排序、2-路插入排序、表插入排序、希尔排序(缩小增量排序,多趟)。主要应用“比较”和“移动”。
交换排序:通过不断比较相邻元素大小,进行交换来实现排序。冒泡排序、快排。
选择排序:每一趟都选出一个最大或最小的元素,并放在合适的位置。有简单选择排序、树形选择排序、堆排序。
归并排序:将2个或两个以上的有序表合成一个新的有序表。
基数排序:通过“分配”和“收集”过程来实现排序,是一种借助于多关键字排序的思想对单关键字排序的方法。包括多关键字排序,链式基数排序,
各个排序算法比较: