例子
例子-抖音直播排行榜功能 规则:某个时间段内,直播间礼物数TOP10房间获得奖励,需要在每个房间展示排行榜 解决方案
- 礼物数量存储在 Redis-zset中,使用skiplist使得元素整体有序
- 使用 Redis集群,避免单机压力过大,使用主从算法、分片算法
- 保证集群原信息的稳定,使用一致性算法
- 后端使用缓存算法(LRU)降低 Redis压力,展示房间排行榜
经典排序算法
插入排序
将元素不断插入已经排序好的array中
- 起始只有一个元素5,其本身是一个有序序列
- 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
时间复杂度在 n - n^2 中间,需要 n 个数据的空间。
- 缺点:平均和最坏情况的时间复杂度为 n^2
- 优点:最好情况时间复杂度为 n
快速排序
分治思想,不断分割序列直到序列整体有序
- 选定一个pivot(轴点)
- 使用pivot分割序列,分成元素比 pivot大和元素比 pivot小两个序列
时间复杂度在 n*logn - n^2 中间,需要 n 个数据的空间。
- 缺点:最坏情况的时间复杂度为 n^2
- 优点:平均情况的时间复杂度为 n*logn
堆排序
利用堆的性质形成的排序算法
- 构造一个大顶堆
- 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复
时间复杂度为n logn ,平均下来为 n logn 的复杂度,需要 n 个数据的空间
- 缺点:最好情况的时间复杂度高达O(n*logn)
- 优点:最坏情况的时间复杂度为O(n*logn)
结论
- 所有短序列和元素有序情况下,插入排序性能最好
- 在大部分的情况下,快速排序有较好的综合性能
- 几乎在任何情况下,堆排序的表现都比较稳定
从零开始打造 pdqsort
qpqsort 是一种混合排序算法,它对常见的序列都进行了一些优化,使得它能有不错的性能
- 对于短序列(小于一定长度)我们使用插入排序
- 其他情况,使用快速排序来保证整体性能
- 当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为 O(n*logn)