20220815笔记

  • 说说常用的排序算法和其时间复杂度

  • 100万用户如何根据年龄排序

  • 深度优先和广度优先搜索算法

  • 如何快速获取Top10热门搜索关键词

  • 单向链表反转怎么实现?

  • 如何判断链表有环

  • 如何找到单向链表的中间元素

说说常用的排序算法和其时间复杂度

类别排序方法时间复杂度空间复杂度稳定性
平均情况最好情况最坏情况辅助存储
插入排序直接插入O(n2)O(n)O(n2)
Shell排序O(n1.3)O(n)O(n2)O(1)
选择排序直接选择O(n2)O(n2)O(n2)
堆排序O(nlog2n)O(nlog2n)O(nlog2n)O(1)
交换排序冒泡排序O(n2)O(n)O(n2)
快速排序O(nlog2n)O(nlog2n)O(n2)O(1)
归并排序O(nlog2n)O(nlog2n)O(nlog2n)O(n)
基数排序O(d(r+n))O(d(n+rd)O(d(n+r))O(rd+n)

注:基数排序的复杂度中,r表示关键字的基数,d表示长度,n表示关键字的个数

100万用户如何根据年龄排序

可以通过桶排序、基数排序、基数排序

  • 桶排序:把数据分到M个桶内,希望桶内的数据实现均匀的,并且桶与桶之间有着天然额大小顺序。极端情况下会退化成O(nlogn),比较适合外部排序,在进行划分同数据的时候,可能出现桶数据不均匀的情况,可以选择再多的数据桶内继续划分桶,直到桶数据可以加载到内存中为止。

    将用户按预估年龄合理划分桶的数量,之后将用户简单分组至桶中,再分别对桶内数据按照常用排序算法进行排序,全部完成以后再将桶进行排序得出最终结果。

  • 计数排序:将数据逐一统计不同数据的数量,再将其按照排序规则逐一输出以得到最终结果。

    年龄排序可以创建1-100的的数组,遍历数据将其按照年龄将对应索引的值自增。完成以后从小到大输出索引,同时值自减直至为零再跳到下一个索引。

  • 基数排序:基数排序和计数排序有点类似,不过不是整个数据一起判断,而是先排个位,再排十位以此类推…

深度优先和广度优先搜索算法

  • 广度优先算法:一般称为BFS,在查找的时候一层一层的向前查找,直到找到目标。比较适合图的搜索,例如多个站点,找出两个站点之间最近的路线。

    一般通过三个属性记录:

  • visited:一个布尔数组,记录节点是否被访问过,访问过为真,没有则为假。

  • vertex:记录上一层的顶点,用来访问当前层其他还没有访问的节点。

  • prev:记录搜索路径,保存当前节点的路径,以便输出结果。

  • 深度优先算法:一般称为DFS,查找的时候先从一个节点往下搜索到底,没有找到则回溯。比较适合树的查找,例如走迷宫问题。

    在走迷宫问题中先随意走一个路口,直到走到尽头,发现出口则直接返回,没有的话就回溯往回走,继续下一个路口。

如何快速获取Top10热门搜索关键词

可以通过优先级队列实现,一般队列是遵循先进先出原则,而优先级队列不是。在优先级队列中数据的出队顺势是根据优先级来的,优先级越高越先出队。

单向链表反转怎么实现?

首先将头节点指向第二个节点,之后获取第二个节点,将其指向第三个节点。。以此类推,直到完全遍历转换完成。

如何判断链表有环

设定两个指针,分别为one、two。

两指针都是从头节点开始,one指针每次前进一步,two指针每次前进两步,一直前进,直到遇到尾节点或者两指针相等时退出。

如何找到单向链表的中间元素

跟上一问差不多。

设定两个指针,分别为one、two。

两指针都是从头节点开始,one指针每次前进一步,two指针每次前进两步,一直前进,当two节点为空时,one节点所处位置即为中间节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值