本教程介绍 CS61B 中的基数排序,这是一种可以在某些情况下甚至超越归并排序、快速排序的特殊的排序方法,但是牺牲了内存空间

计数排序

连续编号情形

我们需要对一个编号从 0 到 11 的表进行排序
alt text
实际上我们可以拿出另一张同样大小的空白表,在遍历左边表时,我们不需要进行比较,就可以直接将元素填到正确的位置上!

这样我们的时间复杂度来到了 θ(N)\theta(N)θ(N),避免了之前我们提到的 NlogNNlogNNlogN 界限
但这种情况你必须保证编号是连续的

花色分类情形

alt text
我们要考虑的问题是,我怎么知道第一个红桃应该放在哪里呢?
我们要做的是,扫描两次,第一次扫描来计数每个相同的元素有多少个(同时根据优先级,我们可以知道每个元素的索引是多少),第二次扫描根据第一次扫描的结果来进行放置。

alt text
经过第一次扫描后,我可以根据counts表,得出这样一个 Starting Points 的元素索引表,来记录下一个对应的元素应该放置在哪个索引处,每次放置之后,更新索引表中的对应元素

计数排序 vs 快速排序

考虑城市人口排名的情形,城市人口是不连续的,如果在这里我们使用计数排序的话,需要列一个非常非常大的计数表
alt text

计数排序

实际上我需要两个变量来表示计数排序,一个用于告诉我元素的数量在增加,第二个变量告诉我,字母表的大小在增加
在花色分类中,字母表大小为4,而在城市人口排名中,字母表的大小为3700万

这样问题可以以两种不同方式增长
如果我们有 k 个不同的种类,而字母表大小为 R,那么时间复杂度为 θ(N+R)\theta(N+R)θ(N+R) ,空间使用情况仍然为 θ(N+R)\theta(N+R)θ(N+R)
(时间复杂度中的 R 来源于我在第一次遍历数组之后,还需要遍历 R 数组将对应的索引填进去

基数排序

LSD

我们可以将每一个编号看作一个数字或者具有不同位数的元素
我们从最低有效位开始排序,然后逐步向最高有效位排序,同时每次排序保证是稳定的(也就是相同的数字,相对位置保持不变)
alt text
这样我们的时间复杂度为 θ(W(N+R))\theta(W(N+R))θ(W(N+R))
其中 N 表示元素的数量,R 表示字母表的大小,W 表示元素的宽度(位数)
相当于对每一位都进行一次计数排序

MSD

但是如果我的字符串非常长,那么 LSD 可能就会变得很慢,归并排序不会在较长的字符串上变慢,因为必须比较所有字符

我们可以从最高有效位开始比较
但是 MSD 会出现不稳定的情况
alt text
这样直接从最高位开始进行排序,会因为不稳定导致排序错误
为此,我们可以将其分解成子问题,比如一旦将所有以 a 开头的单词归类,下一步将是对这个子问题进行排序,而这些元素不会越界到 b 的范围
alt text

MSD 的时间复杂度有不同的情况

  • 最好情况:比较最高位即完成θ(N+R)\theta(N+R)θ(N+R)
  • 最坏情况:需要比较每一位,退化成 LSD ,θ(WN+WR)\theta(WN+WR)θ(WN+WR)

LSD vs Merge Sort

实际情况;

  • 我们认为字母表是常数,LSD 时间复杂度为 θ(WN)\theta(WN)θ(WN)
  • 归并排序在 θ(NlogN)\theta(NlogN)θ(NlogN)θ(WNlogN)\theta(WNlogN)θ(WNlogN) 之间

而具体来说哪一个更好呢?这取决于实际情况

  • LSD 更快
    • N非常非常大
    • 比较的字符串之间非常相似
    • alt text
  • 归并排序更快
    • 比较的字符串之间差异非常大
    • alt text

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReAct模式深度解析:构建具备推理能力的AI智能体架构

本文深入剖析ReAct(Reasoning+Acting)架构设计模式,揭示如何通过推理与行动循环构建具备自主决策能力的AI智能体,并展示其在复杂问题求解中的革命性突破。 引言:从工具调用到自主决策的进化 传统AI系统面临的核心瓶颈: #mermaid-svg-orlnKyviyW86xIJZ {font-family:&quo…

Corrosion2靶机攻略

第一步搭建环境 靶机下载地址:https://download.vulnhub.com/corrosion/Corrosion2.ova 下载完成后直接右击用VM打开,重试一下就可以了 右击虚拟机设置将网络连接改成nat模式 第二步信息收集 查看一下靶机的网段,左上角编辑,虚…

SSL 剥离漏洞

一、SSL/TLS 协议基础​1.1、SSL/TLS 协议的核心功能​SSL/TLS 协议的核心功能主要包括三个方面:加密、认证和完整性校验,这三大功能共同构建了网络通信的安全屏障。​(一)加密​加密是 SSL/TLS 协议最基本的功能。它通过使用对称…

c++-reverse_iterator

C反向迭代器 反向迭代器是C标准库提供的一种适配器,它允许我们以相反的顺序遍历容器,反向迭代器是正向迭代器的封装。 迭代器可以分为两类:方向性质:单向迭代器(Forward Iterator)双向迭代器(Bi…

linux内核驱动:电流/电压/功率监控模块INA226调试

目录背景一、芯片介绍二、手册三、内核驱动配置3.1 设备树配置3.2 修改内核配置文件3.3 编译四、内核驱动分析1、初始化流程2、属性文件/解释五、调试和计算背景 最近调试了一款德州仪器的带有I2C控制接口的可以实现电压、电流、功率监测,并可以进行报警设置的芯片I…

ACL 2024 大模型方向优秀论文:洞察NLP前沿​关键突破

关注gongzhonghao【计算机sci论文精选】近年来,以Transformer架构为核心的大语言模型重塑了自然语言处理领域的技术范式。当前ACL相关研究呈现多维度深化态势,从开源社区推动轻量化架构与低成本训练技术革新,到学术界探索检索增强等机制突破长…

乐创E20H1型IO从站与Ethercat转Profinet网关转换器的配置应用案例

本案例聚焦于西门子 1200PLC 与 E20H1 - T01 IO 从站的连接。在正常运行过程中,E20H1 - T01 IO 从站需支持 EtherCAT 协议,作为 EtherCAT 从站;而监控系统所采用的西门子 S7 - 1200 系列 PLC 则支持 PROFINET 协议。由于协议的不一致性&#…

【2】专业自定义图表创建及应用方法

一、专业自定义图表创建及应用方法1)不是图表的图表制作方法例题1:迷你图表制作方法定义:指依靠Excel基本制图功能之外的其他功能(如公式、条件格式、迷你图等)创建的数据可视化图表特点:引用数据少且占用…

embodied复现所需docker环境配置粗略流程

由于embodied很多安装包都需要linux环境,所以为了建立虚拟ubuntu系统,在不适用vmvare的情况,可以考虑使用docker容器来实现,也不会出现的vmware的卡顿情况 1.首先建立容器,并和pycharm建立连接,先安装docker desktop&a…

2025.8-12月 AI相关国内会议

以下是2025年8月至12月国内与人工智能(AI)相关的重要会议及活动总结,按时间顺序排列: 2025年8月第六届人工智能与机电自动化国际学术会议(AIEA 2025) • 时间:8月1-3日 • 地点:安徽…

计数组合学7.10(舒尔函数的组合定义)

7.10 舒尔函数的组合定义 前几节讨论的四个基 mλm_{\lambda}mλ​、eλe_{\lambda}eλ​、hλh_{\lambda}hλ​ 和 pλp_{\lambda}pλ​ 的定义都较为直观。本节将介绍第五个基,其元素记为 sλs_{\lambda}sλ​,称为舒尔函数,其定义则更为微…

【前端】CSS Grid布局介绍及示例

CSS Grid 简介 CSS Grid 是一个二维布局系统,专为处理行和列的复杂网页布局而设计。与 Flexbox(一维布局)不同,Grid 允许开发者同时控制行和列,实现更精确的布局结构。 核心概念: Grid 容器:通过…

[echarts]多个柱状图及图例

前言 实现多个柱状图功能,并设置多个图例样式,并定时刷新数据 react引入echarts import React, { useEffect, useRef } from react; import * as echarts from echarts; import DeviceApi from /api/screen/DeviceApi;const CenterDeviceSummary (props…

【读文献】Capacitor-drop AC-DC

[1] F. Song, et al., “An 85-to-230VAC to 3.3-to-4.6VDc 1.52W Capacitor-Drop Sigma-Floating-SC AC-DC Converter with 81.3% Peak Efficiency,” 2025 IEEE International Solid-State Circuits Conference (ISSCC), 2025.以下是针对该电容降压AC-DC转换器设计的通俗版解…

`StreamConfigurationMap` 实现逻辑与解析过程详解:相机流能力的声明、匹配与验证机制全景

StreamConfigurationMap 实现逻辑与解析过程详解:相机流能力的声明、匹配与验证机制全景 关键词: StreamConfigurationMap、CameraCharacteristics、OutputFormat、InputFormat、Size 配置、帧率范围、流兼容性、配置失败调试 摘要: StreamConfigurationMap 是 Android 相…

关于“PromptPilot” 之3 -Prompt构造器核心专项能力:任务调度

本篇问题Q20. 以上设计是“原始制造商”的典型范式。在三个不同理论层级(Prompt 构造进程的三个子进程(线程))分别适合三种不同的取向: 面向目标、面向结果和面向过程。不同取向将采取不同的策略 和不同的 监控方式&am…

Solana: 链上开发入门,用 Anchor 和 Rust 构建第一个程序

大家好,如果大家对 Solana 开发充满好奇,但又对 Rust 语言感到陌生,那么大家来对地方了。很多人在探索 Solana 这条高性能公链时,遇到的第一个门槛就是其原生开发语言——Rust。Rust 以其高性能和内存安全著称,但学习曲…

node.js之Koa框架

Koa框架介绍Koa 是一个新的 web 框架,由 Express 原班人马打造,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。Koa 解决了 Express 存在的一些问题,例如:中间件嵌套回调(callback hell)错误处理不…

C/C++离线环境安装(VSCode + MinGW)

因为工作需要部署离线C环境,网上有许多大佬分享了不错的教程,总结一篇完整教程自用,使用VSCode MinGW感谢一、安装准备二、软件安装1.安装MinGW2.安装VSCode及插件三、测试环境1.创建工程文件夹2.创建cpp文件总结感谢 本教程参考了以下教程…

如何创建一个飞书应用获取自己的飞书AppID和AppSecret?

这篇文章是接下来要开发「监控 X(原Twitter)博主账号最新推文」 自动化工作流的先导文章,由于内容相对独立,也可用于飞书应用的其他场景,故单独发出来,方便查阅。 监控X平台指定博主最新发文,需…