Go1.19 排序算法设计实践 经典排序算法对比

详解经典排序算法

01 为什么要学习数据结构与算法

抖音直播排行榜功能 案例

规则:某个时间段内,直播间礼物数TOP10房间获得奖励,需要在每个房间展示排行榜解决方案

•礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序

•使用Redis集群,避免单机压力过大,使用主从算法、分片算法

•保证集群原信息的稳定,使用一致性算法

•后端使用缓存算法(LRU)降低Redis压力,展示房间排行榜数据结构和算法几乎存在于程序开发中的所有地方

讲师 张云浩 这个大佬的 团队提出的 算法 被官方采纳 应用于1.19

02 经典排序算法

Insertion Sort 插入排序

时间复杂度:

Best: 有序情况

Avg: 是翻转的对数log决定的,大家也可以看看详细解析

algorithm - Why is insertion sort Θ(n^2) in the average case? - Stack Overflow

Worst: 逆序

Quick 快速排序

Best: 每一次选择的轴点恰好是中位数,这样每次分割都能分割成 两个几乎相等的数组

Worst: 每次只将一个元素放到最终位置,例如选择的轴点都是已知序列的最小元素

Heap 堆排序

经典算法理论印象

实际场景

random

Selected

从零开始打造 pdqsort

pdqsoer---简介

不稳定:可能会对值相等的元素调整位置

pdqsort- version1

结合三种排序方法的优点

•对于短序列(小于一定长度)我们使用插入排序

•其他情况,使用快速排序来保证整体性能

•当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为O(n*logn)

Q&A

1.短序列的具体长度是多少呢?

12~32,在不同语言和场景中会有不同,在泛型版本根据测试选定24

2.如何得知快速排序表现不佳,以及何时切换到堆排序?

当最终pivot的位置离序列两端很接近时(距离小于length/8)判定其表现不佳,当这种情况的次数达到limit(即bits.Len(length))时,切换到堆排序

pdqsort- version2

pdqsort---final version(Go1.19 default)

高性能的排序算法是如何设计的?

根据不同情况选择不同策略,取长补短

生产环境中使用的的排序算法和课本上的排序算法有什么区别?

理论算法注重理论性能,例如时间、空间复杂度等。生产环境中的算法需要面对不同的实践场景,更加注重实践性能

Go语言(<=1.18)的排序算法是快速排序么?

实际一直是混合排序算法,主体是快速排序。Go<=1.18时的算法也是基于快速排序,和pdqsort的区别在于fallback时机、pivot选择策略、是否有针对不同pattern优化

非常感谢您阅读到这里,创作不易!如果这篇文章对您有帮助,希望能留下您的点赞👍关注💖收藏💕评论💬感谢支持!!!

听说三连的人都能上岸 进入大厂 年入百w

相关推荐
Infedium6 分钟前
优数:助力更高效的边缘计算
算法·业界资讯
阿乾之铭19 分钟前
spring MVC 拦截器
java·spring·mvc
码爸22 分钟前
flink 批量写clickhouse
java·clickhouse·flink
djgxfc24 分钟前
简单了解Maven与安装
java·maven
student.J26 分钟前
傅里叶变换
python·算法·傅里叶
中文很快乐28 分钟前
springboot结合p6spy进行SQL监控
java·数据库·sql
丶白泽28 分钟前
重修设计模式-概览
java·设计模式
小电玩29 分钟前
谈谈你对Spring的理解
java·数据库·spring
五味香32 分钟前
C++学习,动态内存
java·c语言·开发语言·jvm·c++·学习·算法
无名之逆33 分钟前
计算机专业的就业方向
java·开发语言·c++·人工智能·git·考研·面试