java winner tree_赢者树(WinnerTree)输者树(LoserTrees).ppt

赢者树(WinnerTree)输者树(LoserTrees).ppt

Chapter10 Tournament Trees 赢者树(Winner Tree) 输者树(Loser Trees) 竞赛树 赢者树 定义[赢者树] 对于n 名选手,赢者树是一棵含n 个外部节点,n-1个内部节点的完全二叉树,其中每个内部节点记录了相应赛局的赢家。 赢者树 赢者树优点 即使一名选手得分改变了,也可以较容易地修改此树。。 例 如当选手d的值由9改为1时,只需沿从d 到根那条路径修改二叉树,而不必改变其他比赛的结果。 有时甚至还可以避免重赛某些场次。如当b 值由6改为5时,其父节点的比赛结果中b仍为输家,故此时所有比赛的结果未变,因此不必重赛b 的祖父及曾祖父节点所对应的比赛。 赢者树分析 对于一棵有n 名选手的赢者树,当一个选手的得分发生变化时,需要修改的比赛场次介于0~log2n 之间,因此重构赢者树需耗时O(logn)。 由于n 名选手的赢者树在内部节点中共需进行n - 1场比赛(按从最低层到根的次序进行),因此赢者树的初始化时间为Θ(n)。 赢者树应用-排序 可用一个最小赢者树在Θ(nlogn)时间内对n个元素进行排序。 赢者树应用-排序 首先,用n个元素代表n名选手对赢者树进行初始化。利用元素的值来决定每场比赛的结果,最后的赢家为具有最小值的元素,然后将该选手(元素)的值改为最大值(如∞),使它赢不了其他任何选手。 在此基础上,重构该赢者树,所得到的最终赢家为该排序序列中的下一个元素。 以此类推,可以完成n个元素的排序。 赢者树应用-排序 初始化赢者树的时耗为Θ(n)。 每次改变竞赛赢家的值并重构赢者树的时耗为Θ(logn),这个过程共需执行n-1次。 因此整个排序过程所需要的时间为Θ(nlogn)。 外部排序 外部排序法(external sorting method)一般包括两步: 产生部分排序结果run; 将这些run合并在一起得到最终的run。 外部排序例 假设要为含16000个元素的记录排序,且在内部排序中一次可排序1000个记录。 外部排序例 在第1)步中,重复以下步骤16次,可得到16个排序结果(run): 输入1000个记录 用内部排序法对这1000个记录进行排序 输出排序结果run 外部排序例 2.在第2)步中,重复地将k个run合并成 一个run。 合并k个run的简单方法 从k个run的前面不断地移出值最小的元素,该元素被移至输出run中。当所有的元素从k个输入run移至输出run中时,便完成了合并过程。 只要有足够内存保存k个元素值,就可合并任意长度的k个run。 在实际应用上,感兴趣的是能一次输入/出更多元素以减少输入/出的次数。 外部排序例续 在上面所列举的16000个记录的例子中,每个run有1000个记录,而内存容量亦为1000个记录。 为合并前四个run,可将内存分为五个缓冲区,每个容量为200个记录。其中前四个为输入run的缓冲区,第五个为输出run的缓冲区,用于存放合并的记录。 外部排序例续 从四个输入run中各取200个记录放入输入缓冲区中,这些记录被不断地合并并放入输出缓冲区中,直到以下条件发生: 输出缓冲区已满。 某一输入缓冲区空。 外部排序例续 当输出缓冲区已满时,将输出缓冲区内容写入磁盘,写完之后继续进行合并。 当某一输入缓冲区空时,则从对应于空缓冲区的输入run中继续读取记录放入该缓冲区,读取过程结束后合并继续进行。 当这些run中的4000个记录都写入输出run中时,四个run的合并过程结束 k路合并 k个run要合并成一个排好序的run。 因在每一次循环中都需要找到最小值,故将每一个元素合并到输出run中需O(k)时间,因此产生大小为n的run所需要的时间为O(kn)。 若使用赢者树,则可将这个时间缩短为Θ(k+nlogk)。 k路合并 首先用(k)的时间初始化含k个选手的赢者树。这k个选手都是k个被合并run中的头一个元素。 然后将赢者移入输出run中并用相应的输入run中的下一个元素替代之。如果在该输入run中无下一元素,则需用一个key值很大(不妨为∞)的元素替代之。 k次移入和替代赢家共需耗时Θ(logk)。因此采用赢者树进行k路合并的总时间为Θ(k+nlogk)。 * * *

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
def __next_step(self, x, y): if not self.judge_colory: self.__history += 0 else: self.__history += 1 self.color = 1 if self.__history % 2 == 0 else 2 if self.start_ai_game: if self.ai_color == self.color: row,col = self.ai_stage(self.ai_game()[0],self.ai_game()[1]) else: col = round((x-self.__margin*2)/self.__cell_width) row = round((y-self.__margin*2)/self.__cell_width) stage_row = (y-self.__margin)-(self.__cell_width*row+self.__margin) stage_col = (x-self.__margin)-(self.__cell_width*col+self.__margin) if stage_col < stage_row: self.direct= 1 else: self.direct= 0 else: col = round((x - self.__margin * 2) / self.__cell_width) row = round((y - self.__margin * 2) / self.__cell_width) stage_row = (y - self.__margin) - (self.__cell_width * row + self.__margin) stage_col = (x - self.__margin) - (self.__cell_width * col + self.__margin) if stage_col < stage_row: self.direct = 1 else: self.direct= 0 if self.valide(row, col, self.direct): if self.__history % 4 == 0 or (self.__history + 2) % 4 == 0: self.__game_board.drew_turn(2) else: self.__game_board.drew_turn(1) self.add_logic(row, col, self.color) self.__game_board.draw_chess(row, col, self.color, self.direct) if self.judge_owner(row, col, self.color, self.direct): self.__game_board.drew_turn(self.judge_next(self.color)) for i in self.judge_owner(row, col, self.color, self.direct): x,y=self.draw_owner(i) self.__game_board.drew_owner(self.color, y, x) else: self.__game_board.drew_turn(self.color) self.judge_color(row, col, self.color, self.direct) print(self.logic_board_state) if 0 not in self.logic_board_owner: self.__game_board.pop_win(self.judge_winner())
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值