为什么要学习数据结构和算法
了解课本上学习到的算法和真正在生产实践中使用的算法之间的差异
例子-抖音直播排行榜功能
规则:某个时间段内,直播间礼物数TOP10房间获得奖励, 需要在每个房间展示排行榜 解决方案 礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序 使用Redis集群,避免单机压力过大,使用主从算法、分片算法 保证集群原信息的稳定,使用一致性算法 后端使用缓存算法(LRU)降低Redis压力,展示房间排行榜
数据结构和算法几乎存在于程序开发中的所有地方
什么是最快的排序算法?
Python - timsort
C+ + - introsort
Rust - pdqsort Go的排序算法有没有提升空间? Go( <= 1.18) - introsort
重新实现了Go的排序算法,在某些常见场景中比之前算法快~ 10倍,成为Go 1.19的默认排序算法
Go 1.19的排序算法是如何设计的? 生产环境中使用的的排序算法和课本上的排序算法有什么区别? Go语言的排序算法是快速排序么?
02.经典排序算法
复现在课本上学习到的经典排序算法,讲解它们的原理以及特点
从零开始打造目前业界性能一流的排序算法 pdqsort (P atern-Defeating-QuickSort)
插入排序
将元素不断插入已经排序好的array中 起始只有一个元素5,其本身是一个有序序列 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
缺点 平均和最坏情况的时间复杂度高达O(n^2) 优点 最好情况时间复杂度为O(n)
algorithm - Why is insertion sort Θ(n^2) in the average case? - Stack Overflow
快速排序
分治思想,不断分割序列直到序列整体有序 选定一个pivot (轴点) 使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列
缺点 最坏情况的时间复 杂度高达O(n^2)[每次分割都只是把一个元素分成有序] 优点 最好情况:恰好每次选择的元素都是中位数,则每次分割都是分成两部分O(n*logn)
平均情况的时间复杂度为O(n*logn)