今天看了一下 go语言好像没看够 所以就来复习一下go语言 顺便把没写的笔记给补上 go语言之详解经典排序算法1.为什么要学习数据结构和算法:规则时间段内,直播间礼物数top10房间获得奖励,需要在每个房间展示排行榜 解决方案1.礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序 2.使用Redis集群,避免单机压力过大,使用主从算法、分片算法 3.保证集群原信息的稳定,使用一致性算法 4.后端使用缓存算法(LRU)降低Redis压力,展示房间排行榜。 数据结构和算法几乎存在于程序开发中的所有地方。插入排序:将元素不断插入已经排序好的array中 1.起始只有一个元素5,其本身是一个有序序列 2.后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素。快速排序:分治思想,不断分割序列直到序列整体有序 1.选定一个pivot(轴点)2.使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列。缺点:最坏情况的时间复杂度高达O(n^2)。堆序列:利用堆的性质形成的排序算法 1.构造一个大顶堆 2.将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复。缺点:最好情况的时间复杂度高达O(n*logn)。 经典算法理论印象:1.插入排序平均和最坏情况时间复杂度都是O(n^2),性能不好 2.快速排序整体性能处于中间层次 3.堆排序性能稳定,“众生平等” 实际场景benchmark:根据序列元素排列情况划分 1.完全随机的情况(random)2.有序/逆序的情况(sorted/reverse)3.元素重复度较高的情况(mod8)。在此基础上,还需要根据序列长度的划分(16/128/1024) 实际场景benchmark结论:1.所有短序列和元素有序情况下,插入排序性能最好 2.在大部分的情况下,快速排序有较好的综合性能 3.几乎在任何情况下,堆排序的表现都比较稳定。 插入排序—单车,快速排序—汽车,堆排序—地铁。