计算机复试 -- 数据结构
什么是数据结构?
特定的布局方式 存储数据 的容器。
数据是计算机科学当中最关键的实体,而数据结构则可以将数据以某种组织形式存储
无论你以何种方式解决何种问题,你都需要处理数据,
按照特定的格式进行存储,而很多数据结构能够满足以不同格式存储数据的需求。数据结构对于某些操作是高效的,而对于其他的操作往往是低效的。
数组和链表的区别
从逻辑结构上看,动态与否,优缺点
从分配方式来看,数组栈,链表堆
从访问方式上看
用循环比递归效率高吗?
首先,递归和循环两者是完全可以互换的,不能完全绝对性的说循环效率比递归效率高。
对于递归算法:
优点:代码简洁、清晰,并且容易验证正确性。
缺点:多次的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定的影响。
对于循环算法:
优点:速度快,结构简单
缺点:并不能解决所有问题。有的问题适用使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
邻接表与邻接矩阵
邻接矩阵表示法:在一个以为数组中存储所有的点,在一个二维数组中存储顶点之间的边的权值。
邻接表表示法:图中顶点用一个一位数组进行存储,图中每个顶点的所有邻接点构成单链表
邻接表和临界矩阵的优缺点:
邻接矩阵的优点边操作,快速添加边或者删除边,顶点少浪费空间
邻接表的优点是节省空间,只存储实际存在的边,其缺点是关注顶点的度时,就可能需要遍历一个链表。
KMP算法:
KMP算法是一个非常经典的字符串匹配的算法,它讲的是,我们给定两个字符串str1与str2,长度分别问N和M,实现一个算法,如果字符串str1,包含str2,则返回str2在str1中的开始位置,不包含则返回-1。
时间复杂度:
时间复杂度是指执行算法所需要的的计算工作量,因为整个算法的执行时间与基本操作重复执行的次数成正比,最深层循环内的语句
冒泡排序算法的改进
设置一个标志位变量pos,用于每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已经交换到位,故在进行下一趟时只要扫描到pos位置即可。
传统冒泡排序中每一趟操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法就可以得到两个最终值,即最大值和最小值,从而使得排序的趟数减少。
简述快速排序过程(分治)
1、选择一个基准元素,通常选择第一个或者最后一个元素
2、通过一趟排序将待排序的记录分割为独立的两部分(>基准和<基准)
3、此时基准元素在其排好序后的正确位置
快速排序的改进
1、如果数组近乎有序,如果每次都选择最小值作为标定点,快速排序时间复杂度会退化为,因此需要随机化标定点元素。
2、如果数组有大量相同元素,传统的快排会将相同元素分到大于v的区间,会造成两个子区间元素不平衡,所以需要将相等元素平衡地分入两个区间。
B树与B+树
B树是为了存储设备或者磁盘设计的一种平衡查找树
为什么B+树比B树更适合做系统的数据库索引和文件索引
1、B+树的磁盘读写代价更低
2、B+树的查询更加稳定
共同优点:数据库索引是存储在磁盘上的,当数据量大时,就只能把整个索引加载到内存了,只能逐一加载每一个磁盘页(对应索引树的结点)。所以我们要减少I/O操作,对于树来说,IO次数就是树的高度,而“矮胖”就是B树的特征之一。
B树和B+树的区别
B树每个结点都存储数据,所有结点组成这棵树。B+树只有叶子结点存储数据(B+树中有两个指针:一个指向根结点,一个指向关键字最小的叶子结点),叶子结点通过链表连接所有的数据,非叶子结点只是起到索引的作用。
B树中叶节点包含的关键字和其他节点包含的关键字不重复;B+树的索引项只包含对应子树的最大关键字和指向该子树的指针
B+树无论查找是否成功,每次都是一条从根节点到叶节点的路径。
如何实现循环队列,有何好处
如何实现:把数组弄成一个环,让rear和front指针沿着环走,这样就可以产生循环队列。
好处:循环队列是顺序队列的改进,在顺序队列中,在元素进队的时候,rear要向后移动,元素出队的时候,front也要向后移动,这样经过一系列的出队和入队操作之后,两个指针最后会达到数组的末端,此时虽然队列中已经没有元素了,但还是不能让元素入队,即出现了“假溢出的现象”。循环队列就可以很好的避免这种现象。
循环队列会空出一个位置,这是为了用来区分队空和队满的情况的。如果不空出一个位置,则判断队空和队满的条件是一样的。