pdq排序算法 | 青训营

199 阅读2分钟
  1. 为什么学数据结构与算法
    • 例子 每个直播间Top10 礼物数
    • 礼物数存在 Redis-zset里 使用skiplist 使元素整体有序
    • 使用redis集群 需要使用主从算法 分片算法
    • 保证集群信息稳定 使用一致性算法
    • 后端使用**LRU(缓存算法)**降低redis压力 展示房间排行榜
    • 最快的排序算法
    • go introsort <1.18 混合排序 类快速算法
    • pdqsort rust c++ BOOST 使用 go 1.19

pdqsort的主要特点如下:

  1. 高性能:pdqsort在大多数情况下比标准库的排序算法更快,尤其在面对大规模数据集时表现突出。
  2. 稳定性:pdqsort是一种稳定的排序算法,意味着具有相等键值的元素在排序后的顺序保持不变。
  3. 适用性:pdqsort适用于各种数据类型,包括内置类型(如整数、浮点数)和自定义类型(通过自定义比较函数)。
  4. 自适应性:pdqsort能够根据输入数据的特性进行自适应,以达到最佳性能。它使用了一种混合策略,结合了快速排序、插入排序和堆排序的思想。
Sort AlgorithmBestAvgWorst
Insertion Sortnn^2n^2
Quick Sortn * log nn * lognn^2
Heap Sortn * log nn * lognn * log n
wanted Sortnn * lognn * log n
  • 实际场景进行 benchmark 见代码 堆排序比ppt慢
    • 完全随机 random
    • 有序 逆序 sorted reverse
    • 元素重复比较多 mod8
    • 序列长度划分 16/128/1024
  1. 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相同 使用下图策略 待办 具体原理有时间在了解
  2. 设计思想
    • 根据不同情况选择不同策略 取长补短
    • 原版pdqsort论文地址
    • 作业 待办 实现 pdqsort version1
    • 如果实现了 写简历上也是可以的
    • 目前使用的多是 hybrid sorting algorithm (大部分情况使用的是quick sort)
    • 找随机数组的中位数的算法 使用快速选择 O(n)