有向图
带权图
邻接矩阵存储方法
存储费空间,使用方便
领结表存储方法
节省空间、使用耗时
如何存储微博、微信等社交网络中的好友关系?
判断用户A是否关注用户B
判断用户A是否是用户B的粉丝
邻接表
逆邻接表
王圆圆的每日报告
选择排序不稳定,相同元素可能会变化,因此这三种不选择选择排序。
代码中,把执行一个赋值语句的时间粗略地计为单位时间。冒泡排序需要 3 个赋值操作temp存储临时变量
,而插入排序只需要 1 个 a[j]=a[j+1]移动数据
。时间比值:1:7。
最优方法:插入排序。
方法:利用了分治思想,用递归代码来实现归并排序。先分,再合。
时间复杂度: T(n)=Cn+nlog2n。非常稳定,所有情况都是O(nlogn)。
方法:利用主元分区,每次分为左边小区,右边大区。直至区内只有一个元素之后,排序完成。
时间复杂度:分区每次右边都没有元素。就从 O(nlogn) 退化成了 O(n2)。
处理过程:是由上到下的,先分区,然后再处理子问题。
用户搜索的关键词,有很多可能都是重复的,散列表先记录次数。
用堆求 Top K 的方法,建立一个大小为 10 的小顶堆,遍历散列表,依次取出次数,若次数多>顶堆,则删除顶堆。遍历完成后得到top10。
然而10亿太大了。
哈希之后,将 10 亿条搜索关键词先通过哈希算法分到10个文件。在进行上述步骤,然后得到10x10个关键字。租后排序得到top10。
10 个接口访问日志文件,每个日志文件大小约 300MB,日志都是按照时间戳从小到大排序的
将这 10 个较小的日志文件,合并为 1 个日志文件,合并之后也是从小到大排序。
机器内存只有 1GB,你有什么好的解决思路,能“快速”地将这10 个日志文件合并吗?
每次从各个文件中取一条数据,在内存中根据数据时间戳构建一个最小堆,然后每次把最小值给写入新文件,同时将最小值来自的那个文件再出来一个数据,加入到最小堆中。这个空间复杂度为常数,但没能很好利用1g内存,而且磁盘单个读取比较慢,所以考虑每次读取一批数据,没了再从磁盘中取,时间复杂度还是一样O(n)。
扫描一遍文件,看订单金额所处的数据范围。假设经过扫描之后我们得到,订单金额最小是 1 元,最大是 1…
将所有订单根据金额划分到 100 个桶里,第一个桶我们存储金额在 1 元到 1000 元之内,第二个1001-2000,类推。每个桶按照范围命名。
年龄的范围最小 1 岁,最大不超过 120 岁;
遍历这 100 万用户,根据年龄将其划分到这 120 个桶里;
依次顺序遍历这 120 个桶中的元素。
数据范围小,我们划分为901个桶,桶内为分数相同的学生。
此时不需要在排序,而是只需要依次输出到数组即可,只需一次扫描操作,时间复杂度O(n)。
ps. 若考生分数有小数点后一位,则需要所有分数乘10,转为整数,再放进9010个桶内。
针对有序数据集合的查找算法
1000 万个整数数据,每个数据占 8 个字节,如何设计数据结构和算法,快速判断某个整数是否出现在这 1000 万数据中?
该功能不要占用太多的内存空间,最多不要超过 100MB。
O(logn) 惊人的查找速度
最简单的情况就是有序数组中不存在重复元素。
循环条件:low<=high
mid取值:
low 和 high 比较大的话,mid=(low+high)/2和可能会溢出。
改进方式1为,mid=low+(high-low)/2
改进方式2为,除以 2 操作转化成位运算 mid = low+((high-low)>>1)
low和high更新
low=mid+1,high=mid-1
1 | # 循环二分查找 |
内存管理的一种页面置换算法。LRU全称是Least Recently Used,即最近最久未使用的意思,最久未使用的数据,下次被访问的可能最小,我们需要删除它。
维护一个有序单链表,靠近尾部是最早访问,头部为最新访问。当有新数据被访问,我们从头开始遍历链表:
时间复杂度:时间复杂度为 O(n),需要遍历。
LRU缓存淘汰算法
1.上面所讲的几个散列表和链表组合的例子里,我们都是使用双向链表。如果把双向链表改成单链表,还能否正常工作?为什么呢?
2.假设猎聘网有10万名猎头,每个猎头可以通过做任务(比如发布职位)来积累积分,然后通过积分来下载简历。假设你是猎聘网的一名工程师,如何在内存中存储这10万个猎头的ID和积分信息,让它能够支持这样几个操作:
1)根据猎头ID查收查找、删除、更新这个猎头的积分信息;
2)查找积分在某个区间的猎头ID列表;
3)查找按照积分从小到大排名在第x位到第y位之间的猎头ID列表。
以积分排序构建一个跳表,再以猎头 ID 构建一个散列表。
1)ID 在散列表中所以可以 O(1) 查找到这个猎头;
2)积分以跳表存储,跳表支持区间查询;
3)这点根据目前学习的知识暂时无法实现,老师文中也提到了。
本章节主要讲解html和css样式的关系,以及html标签、html文件结构、head标签,最后讲解了在html中的注释代码的作用。
关系:
学习web前端开发基础技术需要掌握:HTML、CSS、JavaScript语言。下面我们就来了解下这三门技术都是用来实现什么的: