定义:
败者树是一个完全二叉树,非叶子节点记录失败者。那么相对于胜者树,具有访存小的优势。胜者树胜者拿走后,整条通路(从叶子到根)所有记录的胜者信息失效,那么新加入节点需要从叶子一直遍历到根,有可能每次都要写入(更新新的胜者)。而败者树,新加入的节点可以利用整条路径的败者信息。
败者树构建
构建过程:
① 初始四个数组,1,2,3,4,内部节点为-1;构建完全后,内部节点记录数组编号。
② 数组4中元素18与父节点比较,父节点为-1,更新为4,退出;等待后面元素更新父节点。
③ 数组3中元素11与父节点记录的败者4(数组4中元素18)比较,记录败者4,胜者3上浮,更新,遇到-1停止上浮,退出。
④ 数组2中元素6与父节点比较,父节点为-1,更新为2,退出;等等后面元素更新父节点。
⑤ 数组1中元素7与父节点记录的败者2(数组2中元素6)比较,记录败者1,胜者2上浮与父节点记录的3比较。
⑥ 数组2(6)与数组3(11)比较,记录败者3,将最终胜者2单独记录。
⑦ 至此,败者树构建完毕。
败者树排序
规定:小于等于为胜利者。
① 胜者为数组1,拿掉5以后,数组1弹出一个元素。
② 数组1中新元素12与父节点比较(即数组2中元素6比较),记录败者1,胜者2上浮,与数组3比较,取得胜利。
③ 胜者为数组2,拿掉6以后,数组2弹出一个元素。
④ 数组2中新元素9与父节点比较(即数据1中元素12比较),记录败者1,胜者2上浮,与数组3比较,取得胜利。
⑤ 胜者为数组2,拿掉9以后,数组2弹出一个元素。
⑥ 数组2中新元素12与与父节点比较(即数组1中元素12比较),记录败者1,胜者2上浮,与数组3比较,失败。
⑦ 胜者为数组3,拿掉11以后,数组3弹出一个元素。
⑧ 数组3中新元素15与父节点比较后(即数组4中元素18比较),记录败者4,胜者3上浮,与数组2比较,失败。
⑨ 胜者为数组2.
代码实现
#ifndef _LOS