栈和队列

栈的排列方式:

n个不同的元素进栈, 出栈元素不同排列的个数为

$\frac{1}{n+1}C_{2n}^n$

堆顶栈

栈满条件: top0 + 1 = top1 (无论是否从0或1开始)

循环队列判断队满的情况:

(q.rear + 1) % Maxsize == q.front

栈和队列的异同点

栈和队列都是加了限制的线性表,栈是先进后出表,队列是先进先出表。栈和队列的插入和删除操作都在端点进行,栈的插入和删除在同一端点,队列的插入和删除在不同的端点进行。

首元结点, 头结点, 头指针的区别

  1. 首元结点(First Node):链表中的首元结点是指链表中第一个实际存储数据的结点。它是链表中第一个具有数据域和指针域的结点,用来存储链表中的第一个元素。
  2. 头结点(Head Node):头结点是在链表中添加的一个额外的结点,位于链表的前面,不存储实际的数据。头结点的作用是为了方便链表的操作和管理,它可以包含一些附加信息,如链表的长度等。
  3. 头指针(Head Pointer):头指针是指向头结点的指针,它是链表的入口。通过头指针,可以找到整个链表的起始位置。头指针用来记录链表的基地址,在进行链表的遍历、插入、删除等操作时,可以通过头指针来进行操作。

  4. 首元结点是链表中的第一个实际存储数据的结点。

  5. 头结点是在链表中添加的一个额外结点,用于方便链表的操作和管理,不存储实际的数据。
  6. 头指针是指向头结点的指针,用来记录链表的基地址。

哈希表

假设哈希表长为m,p为小于等于m的最大质数,则哈希函数为
H(key) = key % p

哈希表平均查找长度

查找成功的平均查找长度:
ASLsucc = 查找次数 / 元素个数

查找失败的平均查找长度:
ASLunsucc = 查找次数 / 散列后的地址长度(p)

拓扑排序

关联路径求法:

关键路径

看这篇博客理解

具体步骤:

  1. 令ve(源点) = 0, 求最早的发生时间ve()
  2. 令vl(汇点) = ve(汇点), 求最迟的发生时间vl()
  3. 根据ve()值求所有点的最早开始时间ve()
  4. 根据每个点的最早开始时间ve(), 求弧的最早开始时间e()
  5. 根据vl()值求所有点的最迟开始时间vl()
  6. 根据每个点的最迟开始时间vl(), 求弧的最迟开始时间l()
  7. 求AOE网中所有活动的差额d(), 找出所有 d() = 0 的活动构成关键路径

查找

排序

如何判断序列是否执行了快速排序:

要点: 每经过一次快速排序, 轴点元素都必然就位。也就是说, 一趟排序至少有一个元素在其最终位置上

快速排序判断

最终排序位置是:2, 5, 12, 16, 28, 32, 60, 72,而选项中正确的位置有:

A. 5, 2, 16, 12, 28, 60, 32, 72
B. 2, 16, 5, 28, 12, 60, 32, 72
C. 2, 12, 16, 5, 28, 32, 72, 60
D. 5, 2, 12, 28, 16, 32, 72, 60

第一趟排序,确定一个元素位置
第二趟排序,又确定一个或两个元素位置
当第一趟元素确认的位置为最左或最右时,第二趟排序只能确认一个位置(A,B选项情况)
当第一趟元素确认位置不是最左或最右时,第二趟能确认2个位置(C选项情况)

线索二叉树: