- 为什么学数据结构与算法
- 例子 每个直播间Top10 礼物数
- 礼物数存在 Redis-zset里 使用skiplist 使元素整体有序
- 使用redis集群 需要使用主从算法 分片算法
- 保证集群信息稳定 使用一致性算法
- 后端使用**LRU(缓存算法)**降低redis压力 展示房间排行榜
- 最快的排序算法
- go introsort <1.18 混合排序 类快速算法
- pdqsort rust c++ BOOST 使用 go 1.19
pdqsort的主要特点如下:
- 高性能:pdqsort在大多数情况下比标准库的排序算法更快,尤其在面对大规模数据集时表现突出。
- 稳定性:pdqsort是一种稳定的排序算法,意味着具有相等键值的元素在排序后的顺序保持不变。
- 适用性:pdqsort适用于各种数据类型,包括内置类型(如整数、浮点数)和自定义类型(通过自定义比较函数)。
- 自适应性:pdqsort能够根据输入数据的特性进行自适应,以达到最佳性能。它使用了一种混合策略,结合了快速排序、插入排序和堆排序的思想。
| Sort Algorithm | Best | Avg | Worst |
|---|---|---|---|
| Insertion Sort | n | n^2 | n^2 |
| Quick Sort | n * log n | n * logn | n^2 |
| Heap Sort | n * log n | n * logn | n * log n |
| wanted Sort | n | n * logn | n * log n |
- 实际场景进行 benchmark 见代码 堆排序比ppt慢
- 完全随机 random
- 有序 逆序 sorted reverse
- 元素重复比较多 mod8
- 序列长度划分 16/128/1024
- Pattern-defeating quicksort pdqsort
- 不稳定的混合排序算法
- 短序列选择插入排序
- 其他情况使用快速排序
- 快速排序表现不好 使用堆排序
- Q&A
- 短序列的界限 : < = 24
- 什么时候定义为表现不佳 pivot位置在两端1/8长度处 设置limit 减到0 使用堆排
- 选择首个元素为pivot
- 如何优化padsort
- 改变pivot的选择 快排最优要求每次 pivot落到中间的位置(严格的n*logn)
- 原使用首个元素作为pivot
- 平衡 寻找pivot所需要的开销 和pivot带来的性能优化 这个陈越数据结构学过
- 策略
- 短序列 <=8 选择固定元素
- 中序列 <=50 采样3个元素 选择中位数
- 长序列 >50 采样9个元素
- pivot的采样的方式使得我们有探知序列当前状态的能力
- 采样的元素逆序 翻转序列 应对reverse场景
- 采样的元素有序 使用有限插入排序 应对sorted场景
- 这里插入使用的 partial insertion sort 部分插入排序
- 改变pivot的选择 快排最优要求每次 pivot落到中间的位置(严格的n*logn)
- 应对重复元素很多情况??
- 如果两次pivot相同 使用下图策略 待办 具体原理有时间在了解
- 设计思想
- 根据不同情况选择不同策略 取长补短
- 原版pdqsort论文地址
- 作业 待办 实现 pdqsort version1
- 如果实现了 写简历上也是可以的
- 目前使用的多是 hybrid sorting algorithm (大部分情况使用的是quick sort)
- 找随机数组的中位数的算法 使用快速选择 O(n)