多路归并排序的时候,为什么要采用败者树?
一、多路归并排序的时候采用败者树
因为在使用败者树的时候,每个新元素上升时,只需要获得父节点并比较即可。 所以总的来说,减少了访存的时间。(拿空间换时间)胜者树以小为胜的话,如果比较兄弟节点发现更小直接替代父节点即可。如果更大则兄弟节点胜出。。
其实一开始就是用堆来完成多路归并的,但是人们发现堆每次取出最小值之后,把最后一个数放到堆顶,调整堆的时候,每次都要选出父节点的左右两个孩子节点的最小值,然后再用孩子节点的最小值和父节点进行比较,所以每调整一层需要比较两次。 这时人们想能否简化比较过程,这时就有了胜者树。
这样每次比较只用跟自己的兄弟节点进行比较就好,所以用胜者树可以比堆少一半的比较次数。 而胜者树在节点上升的时候首先需要获得父节点,然后再获得兄弟节点,然后再比较。这时人们又想能否再次减少比较次数,于是就有了败者树。所以总的来说,减少了访存的时间。
延伸阅读:
二、堆,赢者树,败者树的相同点和不同点
相同点
首先它们三个的相同点就是在于:空间和时间复杂度都是一样的。调整一次的时间复杂度都是O(logN)的。 所以这道题用堆来做,跟用败者树来做并没有本质上的算法复杂度量级上的差别。
不同点
其实一开始就是只有堆来完成多路归并的,但是人们发现堆每次取出最小值之后,把最后一个数放到堆顶,调整堆的时候,每次都要选出父节点的两个孩子节点的最小值,然后再用孩子节点的最小值和父节点进行比较,所以每调整一层需要比较两次。 这时人们想能否简化比较过程,这时就有了胜者树 。
这样每次比较只用跟自己的兄弟节点进行比较就好,所以用胜者树可以比堆少一半的比较次数。 而胜者树在节点上升的时候优选需要获得父节点,然后再获得兄弟节点,然后再比较。这时人们又想能否再次减少比较次数,于是就有了败者树。在使用败者树的时候,每个新元素上升时,只需要获得父节点并比较即可。 所以总的来说,减少了访存的时间。

相关推荐HOT
更多>>
redis、memcache、mongoDB有哪些区别?
一、redis、memcache、mongoDB的区别1、数据模型不同Redis是一种基于键值对的内存数据库,可以支持多种数据结构,如字符串、哈希、列表、集合、...详情>>
2023-10-15 23:51:15
WSGI到底是什么?
一、WSGI概念WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体的来说,WSGI是一个规范,定义了Web服务器如何与...详情>>
2023-10-15 23:16:04
CocoaPods都做了什么?
一、CocoaPods都做了什么1、支持插件CocoaPods提供了各种插件,可以定制化依赖管理过程,如将Podfile转换成其他依赖管理格式等。2、支持私有库...详情>>
2023-10-15 22:55:17
做一个App需要哪些步骤?
一、做一个App的步骤1、策划:开发策划是app开发的名列前茅步,它是确定最终的app开发方案和规划的必要步骤,开发策划的目的是把app的构思从理...详情>>
2023-10-15 18:02:59