Go语言上手-基础语言 | 青训营笔记

167 阅读2分钟

数据结构与算法

 

为什么要学习数据结构和算法

例子-     抖音直播排行榜功能

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

解决方案

  礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序

  使用Redis集群,避免单机压力过大,使用主从算法、分片算法

  保证集群原信息的稳定,使用一致性算法

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

 

什么是最快的排序算法?

Python-timsort C++-introsort Rust-pdqsort

 

Go的排序算法有没有提升空间?

Go(<=1.18)-introsort

 

重新实现了Go的排序算法,在某些常见场景中比之前算法快~10被,成为Go1.19的默认排序算法

Go1.19的排序算法是如何设计的?

生产环境中使用的排序算法和课本上的排序算法有什么区别?

Go语言的排序算法是快速排序吗?

 

 

 

经典排序算法

插入排序|快速排序|堆排序|Benchmark

 

Insert Sort 插入排序

将元素不断插入已经排序好的array中

起始只有一个元素5,其本身是一个有序序列

后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素

时间复杂度

缺点:平均和最坏情况的时间复杂度高达O(n^2)

优点 最好情况时间复杂度为O(n)

 

Quick Sort 快速排序

Comparison Sorting Visualization (usfca.edu)

分治思想,不断分割序列直到序列整体有序

选定一个pivot(轴点)

使用pivot分割序列,分成元素比pivot大和元素比povit小两个序列

时间复杂度

最优是选择的轴点刚好是中位数

缺点:最坏时间复杂度高达O(n^2)

 

 

Heap Sort 堆排序

利用堆的性质形成的排序算法

构造一个大顶堆

将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复

时间复杂度

缺点:最好情况的时间复杂度高达O(nlogn)

 

插入排序平均和最快情况时间复杂度都是O(n^2),性能不好

快速排序整体性能处于中间层次

堆排序性能稳定”众生平等 ”

 

 

实际场景benchmark

根据序列元素排列情况划分

完全随机的情况(random)

有序/逆序的情况(sorted/reverse)

元素重复度较高的情况(mod8)            20分16秒