数据结构应试要点——排序与查找

排序与查找的基础知识请参阅相关书籍,这里列出考试时需要注意或容易忽视的地方。如有补充,欢迎评论或私信!

查找

顺序查找与折半查找

1.对线性的链表只能进行顺序查找。

2.有序表的顺序查找可以是顺序结构也可以是链式结构。

3.折半查找适用于有序的顺序表,不适合链式结构。折半查找的过程可以使用二叉判断树表示,因而其比较次数不会超过树高。二叉判断树是一种平衡树,效率稳定,这是其与二叉排序树主要区别。

4.分块查找块内的元素可以无序,块与块之间必须有序

5.折半查找(二叉判断树)的平均查找长度:

  • ASL(成功):每一个结点与其所在层次的乘积之和。
  • ASL(失败):先在每一个度小于2的结点添加虚拟结点(若普通结点为圆形,则这些虚拟结点为矩形或方形,在要求作出判断树时应将这些虚拟结点一同画出),使其度为2,则失败时的平均查找长度为根结点到这些虚拟结点的路径长度之和。

6.对于顺序查找,无论数据是否有序,查找成功的平均时间均相同,但查找失败的平均时间不同(有序表显然要短)。

7.对数据较多(n个)的分块表进行查找,最理想的块长为根号n。

8.顺序查找的二叉判断树的结点或者是叶子结点,或者它只有右孩子。

B树与B+树

1.一棵含n个关键字的m阶B树具有如下特点:

  • 每个结点至多有m个子树,(m-1)个关键字。
  • 除根结点外每个非叶结点至少有⌈m/2⌉棵子树,⌈m/2⌉ - 1个关键字,而根结点需要特殊讨论,其子树至少为两棵。
  • 其高度至少为以m为底(n + 1)的对数,至多为以⌈m/2⌉为底((n + 1) / 2) + 1的对数。
  • B树的叶结点不存储任何数据

2.B树变高的唯一方法是插入,变矮的唯一方法是删除。

3.B树的插入位置一定是在最底层中的某个非叶结点。

4.若插入操作导致关键字个数不符合上面1中对个数的要求,则需从⌈m/2⌉处对结点进行分裂。 

5.若删除操作导致关键字个数不符合上面1中对个数的要求且兄弟结点不够借,则将其父结点拉下,与左右兄弟结点合并。

散列表 (哈希查找)

1.冲突是不可避免的,因此与装填因子α无关。冲突产生的概率与装填因子的大小成正比。

2.散列表查找成功的平均查找长度与装填因子直接相关,与表长无关。

3.在开放定址前提下,删除元素可能会导致搜索路径中断,通常的做法是在删除的地方做标记。

4.在开放定址中,散列到同一个地址而产生“堆积”(或聚集)问题,是指同义词冲突的探查序列和非同义词之间不同的探查序列交织在一起,导致关键字查询需要经过较长的探测距离,降低了散列的效率。因此要选择好的处理冲突的方法来避免堆积。

5.冲突对存储效率、散列函数和装填因子均不会有影响,而ASL会因堆积现象而增大

6.同义词冲突不等于聚集,链地址法在同义词冲突时不会发生聚集现象。

7.散列表的查找效率取决于:散列函数、处理冲突的方法、填装因子。

8.题目中给出的装填因子的用处是根据α = n / N求表长N,其中n是关键字的个数,若N为分数,则向上取整。如若需要确定散列函数,且形式为H(key) = key % p,则p取不大于N的最大质数。

9.计算平均查找长度时,成功情况下的分母为数据元素的个数,失败情况下的分母为哈希函数里key后面的数,即上面的p。

排序

1.根据定义,拓扑排序既不属于内部排序,也不属于外部排序。

2.内部排序通常需要进行两种操作:比较和移动,但基数排序并不基于比较。

3.排序趟数与初始序列状态有关的排序:交换排序(冒泡排序、快速排序)

4.比较次数与初始序列状态无关的排序:选择排序、基数排序

5.移动次数与初始序列状态无关的排序:归并排序、基数排序

6.时间复杂度与初始序列状态有关的排序:直接插入、交换排序(冒泡排序、快速排序)

  • 记忆时间复杂度与初始序列状态无关的排序:一堆(堆排序)乌龟(归并排序)选(选择排序)基(基数排序)友

7.稳定的排序:直接插入、冒泡排序、归并排序、基数排序

8.不稳定的排序:简单选择排序、希尔排序、快速排序、堆排序

9.直接插入排序可以用于链式存储的数据排序。

10.快速排序是所有内部排序算法中平均性能最优的排序算法。

11.快速排序在要排序的数据基本有序的情况下最不利于发挥其长处。

12.如何判断一个序列是否为快速排序第i趟排序结果?

答:找到i个以上元素在其最终排序位置,且这些元素的左序列小于它,右序列大于它。

13.快速排序的空间复杂度较为特殊,最优情况下栈深度为logn,最坏情况下深度为n。

14.选择排序(简单选择、堆排序)不关心序列的初始状态,时间复杂度始终相同。

15.堆查找效率较低,因其数据存储是无序的,只是根结点与其子树有大小关系而已。

你可能感兴趣的:(数据结构,数据结构)