树选择排序(Tree Selection Sorting)介绍

news2024/12/23 22:55:42

简介

或许你有一个疑问:为什么堆排序使用二叉树,但是叫堆排序,而不是树排序?
因为堆排序的前身正是叫做树选择排序(Tree Selection Sorting),使用树结构,但是要稍微简单一些。

高德纳(Donald E. Knuth)先生形容树选择排序算法像兵乓球比赛,所以这里使用一下 TAOCP 中的例子。假设有八个人参加比赛,需要评判出第一名到第八名,赛程如下:
请添加图片描述

Kim 和 Sandy、Chris 和 Lou、Pat 和 Ray、Dale 和 Robin分组比赛,胜者晋级。可以看到在 7 次比赛之后,最后的冠军是 Chris,但是第二名亚军是谁呢?是 Pat 吗?不一定是 Pat,因为 Kim 和 Lou 虽然都输给了冠军 Chris,但是不一定会比 Pat 弱,所以还需要 Kim 和 Lou 进行一场比赛,然后胜者再与 Pat 进行一场比赛(这时候你可能好奇为什么 Sandy 不用和 Pat 比赛,是因为 Sandy 本就弱于 Kim,无论赛况如何,Sandy 永远不可能是第二)。以此类推,最后就可以排序完成了。
那么在这个赛程树中,树根就是冠军,每次选出冠军之后,然后对剩下的人进行重赛(高德纳先生在这里设计为即使运动员生病或状态不佳也得重赛,所以你可能会认为有点不公平哦,但是这里不讨论这个问题)。

算法步骤

树选择排序有两个版本,原始版本和 1962 年 K. E. Iverson 提出的改进版本。

原始版本

原始版本的树排序具体步骤如下,图中叶节点都放最下面方便理解(Procreate 写的字很丑,见谅):

  1. 第一步,对所有叶节点两两对比,选出最小值1,将其输出(也就是从原数组中删除这个元素);
  2. 然后对剩下的元素再进行对比,一个个输出,直到结束。如下图。
    请添加图片描述

可以看到,这种算法每次在输出选择的最小值之后,就将原本最小值的位置换成 + ∞ +\infty +,那么要知道每个元素的指针或者下标。(我猜您阅读到这里很好奇 + ∞ +\infty +怎么在代码中体现出来,这里放到最后细说)
所以树选择排序算法需要的空间分为三部分 N 个关键字、N-1 个指针和存放输出的 N 个位置或指针。不过用数组的格式的话,那就是两个数组即可。

因为每次重新对比只需要改变一条路径(看上图可以看出来),所以选出第二个最小值最多只用 l g N lg N lgN次( N N N为元素数量),那么对比所有的元素需要 N l g N N lg N NlgN

改进版本

改进版本的树排序使用了“Pater Principle”。个人感觉高德纳先生使用“Pater Principle”一词虽然不是十分精准,但是意思上却十分贴切,而且以我的水平也想不到更好的词了(但是不能说树排序的改进是使用“Pater Principle”发明的,因为树排序的改进是 1962 年,“Pater Principle”是 1968 年)。

彼得原理(Pater Principle)是 Laurence J. Peter 开发的管理概念。Peter 指出,在一个体系中的人们,会上升到能力不符合职称的级别:员工根据他们在以前工作中的成功晋升,直到他们达到不再胜任的水平。

可能有人看上面机翻的解释没有看懂,那么简单来说可以理解成:在一个体系中,如果一个人一直成功晋升,最后会到达一个超过他能力的职位,然后他就不能继续晋升了,但是公司也不会开除他,他就相当于稳定在这个位置了(如果想要更详细的解释可以自己查查,是一个很有意思的原理)。

改进版的树排序就是将叶节点的值进行对比,然后将其放在适当的位置,然后删除之前的节点,这样可以大大降低对比的次数。上面的那个图会变成下面这样:
请添加图片描述

这时候如果忽略 ∞ \infty 的话,那么元素顺序应该是1 3 2 5 7 9。如果重复迭代运行改进版本的树选择排序算法,那么你会发现在不断迭代之后,最终二叉树会在两种情况之间“反复横跳”。所以需要想办法改进,这个办法就是堆排序(heapsort)。
或者你可以在第一次树选择排序之后,使用直接选择排序。因为此时元素已经比之前有序许多了,这时候使用不稳定的排序方法会快一些。例如此时只有32的位置不对,直接选择会快很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CNN卷积参数量计算

参考:轻量级网络-Mobilenet系列(v1,v2,v3) - 知乎 盘点下每种类型的层计算可学习参数的数量 Input layer:输入层所做的只是读取输入图像,因此这里没有可以学习的参数。 Convolutional layers:一个卷积层,其输入为l个特…

cassandra安装及配置

Cassandra介绍 Cassandra是一个开源的、分布式、无中心节点、弹性可扩展、高可用、容错、一致性协调、面向列的NoSQL数据库。 Cassandra的主要组成部分主要有: • 节点(Node):Cassandra节点是存储数据的地方。 • 数据中心(Data center):数据中心是相关节点的集合。 • 集群…

Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli

前面的文章分享了组件库的开发、example、组件库文档,本文分享组件库 cli 开发。 1 为什么要开发组件库 cli 回顾一个新组件的完整开发步骤: 1 在 packages 目录下创建组件目录 xxx: 1.1 使用 pnpm 初始化 package.json,修改 n…

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十八章 以太…

(十七) 共享模型之工具【JUC】【读写锁】

一、ReentrantReadWriteLock(P247) 当读操作远远高于写操作时,这时候使用 【读写锁】让 【读-读】可以并发,提高性能。 类似于数据库中的 select ... from ... lock in share mode 提供一个 数据容器类内部分别使用读锁保护数据的…

【论文阅读 CIKM‘2021】Learning Multiple Intent Representations for Search Queries

文章目录Original PaperMotivationMethodTask Description and Problem FormulationNMIR Framework: A High-Level OverviewModel Implementation and TrainingDataOriginal Paper Learning Multiple Intent Representations for Search Queries More related papers can be …

基于Electron的桌面端应用开发和实践

引言 如果开发跨桌面端的应用开发的话,我相信,electron目前绝对是不可避免的技术方案。web应用大家都知道,通过浏览器访问的应用就是web应用,那什么是桌面端?桌面端有两个重要特点: 具备独立运行于操作系…

学习压力容器中卡箍快开结构的强度计算

导读:压力容器的设计一定要考虑安全性、经济性、环保及健康问题。首先安全是核心问题,在保证安全的前提下尽可能的再做到经济合理。 本文从强度计算软件SW6-2011 V3.1补丁二(单机版)和(网络版)所解决的问题&#xff0…

Redis 性能问题优化方案

Redis性能问题&优化方案前言Redis真的变慢了吗?使用复杂度过高的命令操作bigkey集中过期实例内存达到上限fork耗时严重开启内存大页开启AOF绑定CPU使用Swap碎片整理网络带宽过载其他原因频繁短连接运维监控其它程序争抢资源总结前言 Redis 作为优秀的内存数据库…

Java高效率复习-MySQL上篇[MySQL]

前言 本文章是用于总结尚硅谷MySQL教学视频的记录文章,主要用于复习,非商用 原视频连接:https://www.bilibili.com/video/BV1iq4y1u7vj/?p21&spm_id_frompageDriver&vd_sourcec4ecde834521bad789baa9ee29af1f6c https://www.bilib…

Spring Boot 项目优化和 JVM 调优,亲测!真实有效。。

三、Jvm调优实战 1、未设置JVM参数的情况 我现在有一个项目,默认情况下,没有设置任何Jvm参数。 下面我来启动看一下。 看一下堆栈分配: 很明显默认的最大堆内存分配了8个G。很明显的不合理嘛。 2、下面我们来设置下Jvm参数 例如要配置JVM…

vue2 ElementUI 表单标签、表格表头添加问号图标提示

文章目录1. 问题背景2. element-ui悬浮提示定义3. 基础4. 延申5. 参考1. 问题背景 使用element-ui有时候需要对表格的表头、表单的标签进行自定义,添加问号的悬浮提示。 要达到的效果,如图所示: 2. element-ui悬浮提示定义 https://elemen…

【菜菜的sklearn课堂笔记】聚类算法Kmeans-基于轮廓系数来选择n_clusters

视频作者:菜菜TsaiTsai 链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们通常会绘制轮廓系数分布图和聚类后的数据分布图来选择我们的最佳n_clusters from sklearn.metrics import silhouette_samples,silhouette_s…

c++还原简单的vector

文章目录vectorvecotor的介绍vector的模拟实现类的框架成员变量迭代器构造函数析构函数size()capacity()operator[]重载扩容resize()尾插验证是否为空尾删clear 清除swap交换insert插入erase删除迭代器区间初始化构造函数拷贝构造赋值运算符重载n个val构造函数再谈构造函数vect…

数仓日记 - 数仓理论

寒刃尽断处,吾心作剑霜作锋🏂 目录 一、数仓简介 二、关系建模与维度建模 1. 关系建模   2. 维度建模    • 三种模型    • 事实表    • 维度表   3. 事实表的分类    • 事务型事实表    • 周期型快照事实表    • 累积型快照事实表…

Python操作Excel表格

本文介绍如何通过轻量级、零依赖(仅使用标准库)的 pylightxl 库操作Excel表格。 官网:Welcome to pylightxl documentation — pylightxl 2019 documentation 目录 一、入门 1. 读写CSV文件 2. 读Excel文件 3. 获取工作表和单元格数据 3…

前端css实现特殊日期网页变灰功能

前端变灰效果在网页实际使用过程中使用的比较少,但有时候又缺一不可,一般在大型哀悼日或纪念日的时候使用,使用后的网站页面会变成灰色(黑白色)。 我们先看下各大网站是怎么实现的: 1.csdn实现方式 2.淘宝 3.人民网 4.京东 5.掘…

Unity【Multiplayer 多人在线】服务端、客户端通用架构的使用指南

文章目录🚩 Import🚀 protogen使用方法🪐 客户端接口🌈 服务端接口🧭 数据处理🎨 Example🚩 Import 下载SKFramework框架,导入到Unity中; 在框架Package Manager中搜索并…

osgEarth示例分析——osgearth_colorfilter

前言 osgearth_colorfilter颜色过滤器示例。本示例中,主要展示了6种颜色过滤器的使用,分别是:HSLColorFilter、RGBColorFilter、CMYKColorFilter、BrightnessContrastColorFilter、GammaColorFilter、ChromaKeyColorFilter。 执行命令 // 一条命令是一…

Docker日常运维小技巧

一、故障定位 1、查看容器内部 https 请求响应时间 docker exec -t $(docker ps -f nameblog_web -q) curl -H X-Forwarded-Proto:https \-w %{time_total} -o /dev/null -s localhost 2、查看容器日志 docker logs --tail 50 --follow --timestamps mediawiki_web_1 3、删…