上回说到,队列是一个先进先出的操作受限的线性表。这一回,我们看到队列的两个常见的应用:层次遍历和在计算机系统中的应用。
队列在层次遍历中的应用
在信息处理中有一大类问题需要逐层或逐行处理。这类问题的解决方法往往是在处理当前层或当前行时就对下一层或下一行做预处理,把处理顺序安排好,待当前层或当前行处理完毕,就可以处理下一层或下一行。使用队列是为了保存下一步的处理顺序。下面用二叉树(如图所示)层次遍历的例子,说明队列的应用。下表显示了层次遍历二叉树的过程。
层次遍历二叉树的过程
序 | 说明 | 队内 | 队外 |
1 | A 入 | A | |
2 | A 出,BC 入 | BC | A |
3 | B 出,D 入 | CD | AB |
4 | C 出,EF 入 | DEF | ABC |
5 | D 出,G 入 | EFG | ABCD |
6 | E 出,HI 入 | FGHI | ABCDE |
7 | F 出 | GHI | ABCDEF |
8 | GHI 出 | ABCDEFGHI |
该过程简单描述如下:
- 根结点入队。
- 若队空(所有节点都已处理完毕),则结束遍历;否则重复 3 操作。
- 队列中第一个结点出队,并访问之。若其有左孩子,则将左孩子入队;若其有右孩子,则将右孩子入队,返回 2。
队列在计算机系统中的应用
队列在计算机系统中的应用非常广泛,以下仅从两个方面来简述队列在计算机系统中的作用:第一个方面是解决主机与外部设备之间速度不匹配的的问题,第二个方面是解决由多用户引起的资源竞争问题。
对于第一个方面,仅以主机和打印机之间速度不匹配的问题为例作简要说明。主机输出数据给打印机打印,输出数据的速度比打印数据的速度要快得多,由于速度不匹配,若直接把输出的数据送给打印机打印显然是不行的。解决的办法是设置一个打印数据缓冲区,主机把要打印输出的数据依次写入缓冲区,写满后就暂停输出,转去做其他的事情。打印机就从缓冲区中按照先进先出的原则依次取出数据并打印,打印完后再向主机发出请求。主机接到请求后再向缓冲区写入打印数据。这样做既保证了打印数据的正确,又使主机提高了效率。由此可见,打印数据缓冲区中所存储的数据就是一个队列。
对于第二个方面,CPU(即中央处理器,它包括运算器和控制器)资源的竞争就是一个典型的例子。在一台带有多终端的计算机系统上,有多个用户需要 CPU 各自运行自己的程序,他们分别通过各自的终端向操作系统提出占用 CPU 的请求。操作系统通常按照每个请求在时间上的先后顺序,把它们排成一个队列,每次把 CPU 分配给队首请求的用户使用。当相应的程序运行结束或用完规定的时间间隔后,令其出队,再把 CPU 分配给新的队首请求的用户使用。这样既能满足每个用户的请求,又使 CPU 能够正常运行。
总结
关于队列的应用就说到这里,下一回我们看一种大家都非常熟悉的数据结构——数组!
当然,我从今年开始已经入驻 B 站了!下面给出 B 站账号:新时代的运筹帷幄,喜欢的可以关注一下,看完视频不要忘记一键三连啊!
今天的文章有不懂的可以后台回复“加群”,备注:Python 机器学习算法说书人,不备注可是会被拒绝的哦~!