建议收藏 10个数据结构高频知识点( 二 )


一般而言,需要考虑的因素有以下四点:
设待排序元素的个数为n.
1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序 。
2)当n较大,内存空间允许,且要求稳定性:归并排序
3)当n较小,可采用直接插入或直接选择排序 。
直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数 。
直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序
5)一般不使用或不直接使用传统的冒泡排序 。
6)基数排序
它是一种稳定的排序算法,但有一定的局限性:

  1. 关键字可分解 。
  2. 记录的关键字位数较少,如果密集更好
  3. 如果是数字时,最好是无符号的
 
5、冒泡排序算法的改进
  1. 设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置 。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可 。
  2. 传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半 。
6、邻接矩阵与邻接表
  • 邻接矩阵表示法:在一个一维数组中存储所有的点,在一个二维数组中存储顶点之间的边的权值
  • 邻接表表示法:图中顶点用一个一维数组存储,图中每个顶点vi的所有邻接点构成单链表
对比
  1. 在邻接矩阵表示中,无向图的邻接矩阵是对称的 。矩阵中第 i 行或 第 i 列有效元素个数之和就是顶点的度 。
  2. 在有向图中 第 i 行有效元素个数之和是顶点的出度,第 i 列有效元素个数之和是顶点的入度 。
  3. 在邻接表的表示中,无向图的同一条边在邻接表中存储的两次 。如果想要知道顶点的度,只需要求出所对应链表的结点个数即可 。
  4. 有向图中每条边在邻接表中只出现一次,求顶点的出度只需要遍历所对应链表即可 。求入度则需要遍历其他顶点的链表 。
  5. 邻接矩阵与邻接表优缺点:
  6. 邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,可以快速添加边或者删除边 。而其缺点是如果顶点之间的边比较少,会比较浪费空间 。因为是一个 n∗n 的矩阵 。
而邻接表的优点是节省空间,只存储实际存在的边 。其缺点是关注顶点的度时,就可能需要遍历一个链表 。
 
7、用循环比递归效率高吗?递归和循环两者完全可以互换 。不能完全决定性地说循环地效率比递归的效率高 。
递归算法:
  • 优点:代码简洁、清晰,并且容易验证正确性 。
  • 缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响 。但是,对于某些问题,如果不使用递归,那将是极端难看的代码 。在编译器优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环 。
循环算法:
  • 优点:速度快,结构简单 。
  • 缺点:并不能解决所有的问题 。有的问题适合使用递归而不是循环 。如果使用循环并不困难的话,最好使用循环 。
8、解决哈希冲突的方法哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构 。
1)线性探测法
2) 平方探测法
3) 伪随机序列法
4) 拉链法
9、KMP算法在一个字符串中查找是否包含目标的匹配字符串 。其主要思想是每趟比较过程让子串先后滑动一个合适的位置 。当发生不匹配的情况时,不是右移一位,而是移动(当前匹配的长度– 当前匹配子串的部分匹配值)位 。
 
10、B树根据B类树的特点,构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息,保证层数尽量的少,以便后面我们可以更快的找到信息,磁盘的I/O操作也少一些,而且B类树是平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的 。
B树和B+树的区别,以一个m阶树为例 。
  1. 关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点,但是其只拥有m-1个关键字 。

  2. 推荐阅读