GO1.19排序实践|青训营笔记

55 阅读2分钟

01.为什么要学习数据结构和算法 了解课本上学习到的算法和真正在生产实践中使用的算法之间的差异

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

解决方案:

礼物数量存储在 Redis-zset 中,使用 skiplist 使得元素整体有序使用 Redis 集群,避免单机压力过大,使用 主从算法、分片算法保证集群原信息的稳定,使用 一致性算法

后端使用 缓存算法(LRU) 降低 Redis 压力,展示房间排行榜

数据结构和算法几乎存在于程序开发中的所有地方

2.经典排序算法

image.png

将元素不断插入已经排序好的 array 中起始只有一个元素 5 , 其本身是一个有序序列后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素。 平均和最坏时间复杂度为O(n^2).

image.png 分治思想,不断分割序列直到序列整体有序。 选定一个 pivot (轴点)。 使用 pivot 分割序列,分成元素比 pivot 大 和元素比 pivot 小两个序列。 image.png Heap sort 堆排序 image.png 利用堆的性质形成的排序算法。 构造一个大顶堆。 将根节点 (最大元素) 交换到最后一个位置,调整整个堆,如此反复。 快速排序整体性能处于中间层次。 根据序列元素排列情况划分完全随机的情况 (random)有序/逆序的情况。 (sorted/reverse)元素重复度较高的情况 (mod8)在此基础上,还需要根据序列长度的划分 (16/128/1024)。 插入排序在已经有序的条件下速度最快。

复现在课本上学习到的经典排序算法,讲解它们的原理以及特点

实际场景 benchmark 结论。

所有短序列和元素有序情况下,插入排序性能最好在大部分的情况下,快速排序有较好的综合性能几乎在任何情况下,堆排序的表现都比较稳定。