在计算机网络中,当多个站点试图通过同一个信道同时进行传输时,传输的数据会出现乱码,这称为冲突。
自适应树游走协议(Adaptive Tree Walk Protocol)是一种避免冲突的方法。它将所有使用同一个信道的站点使用一棵完全二叉树组织起来,每个
叶子代表一个站点。
当有站点想要使用信道时,使用深度优先遍历的方法处理冲突:在第一个时隙检查树根,若其所有后代结点中只有唯一的结点请求信道,则直接将信道分配给它;否则依次递归检查左子树、右子树,直到不存在冲突为止。
图中展示了A-H八个共享信道的站点被组织的方式。若某一时刻C、D、H三个站点同时请求信道,则该协议处理冲突如下:
- 第一个时隙检查0号结点,它有三个后代C、D、H均发起了请求,存在冲突。
- 第二个时隙检查0号结点的左儿子,即1号结点。它有两个后代C、D均发起了请求,存在冲突。
- 第三个时隙检查1号结点的左儿子,即3号结点。它没有后代发起请求,不需要继续向下递归检查。
- 第四个时隙检查1号结点的右儿子,即4号结点。它有两个后代C、D发起了请求,存在冲突。
- 第五个时隙检查4号结点的左儿子,即C。它是发起了请求的叶子结点,因此该时隙将信道分配给C。
- 第六个时隙检查4号结点的右儿子,即D。它是发起了请求的叶子结点,因此该时隙将信道分配给D。此时,对1号结点的递归检查已经完成。
- 第七个时隙检查0号结点的右儿子,即2号结点。它只有一个后代H发起请求,因此该时隙将信道分配给H,不需要继续向下递归检查。
处理所有请求共耗费了七个时隙。
作为一名刚刚开始学习计算机的萌新,Miaoyao为自己掌握了这个协议而非常得意。于是,他想要来考考你:给出站点个数n以及一些发起请求的站点编号,他想知道该协议需要几个时隙处理完所有请求。
当然,由于Miaoyao非常菜,他不希望把问题变得太过复杂。因此,他保证n是2的整数幂,即使用二叉树组织起来时,所得到的将会是一棵满二叉树:所有叶子均在同一层。同时,尽管针对这个协议有很多行之有效的优化,但是Miaoyao并没有掌握,他只会按照上面所述的流程逐个检查。