20162308 2017-2018-2 《程序设计与数据结构》第二周学习总结
20162308 2017-2018-2 《程序设计与数据结构》第二周学习总结
教材学习内容总结
- 本周学习了教材第十三章"查找与排序"的内容
- 查找算法
查找算法,通常来说,分为遍历(线性)和二分,算法复杂度分别为O(n)和O((1/2)^n),二分查找通常是在有序的数据集中进行,即使是在极大的数据规模下,也能够保证相当快的速度。线性的遍历查找,在最坏情况下,需要遍历数据集中的每个元素,一旦数据规模变大,计算速度就会降低。
想象这样一种情况,我们设计了一个网络爬虫,我们爬到了几十亿(甚至几百亿)个url,为了加快爬取的速度,对于相同的url,我们的爬虫将不再进行重复下载。这时候,如何快速在由数十亿个元素组成的集合中快速发现是否有重复的元素?布隆提出了一种复杂度为O(1)的查找算法——Bloom Filter。
布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
虽然存在一定的误差,但是在大规模应用的情况下,布隆过滤器,通过HASH和建立二进制向量,能够非常出色地完成一些工作,在暑假,我和同学进一步拓展了布隆的工作,将其实现了Bloom Filter的分布式部署。
- 排序算法
教材中介绍了冒泡、快速、归并、选择等常见的排序算法,从原理上说选择排序、插入排序和冒泡排序都相差不大,都是用了两次循环,只是在第二重循环的具体实现上有一些区别。比较有意思的还是Quick Sort算法,但是娄老师在课上已经讲的很清楚了,这几天在知乎上看到一篇文章挺有意思,在博客中分享。https://zhuanlan.zhihu.com/p/22150349
作者在文章中从信息论角度讨论了排序算法时间复杂度的下限,角度还是挺新奇的,尤其是见到熟悉的交叉熵,除了用在神经网络算法里面,信息论还能用来计算算法复杂度。然后作者还介绍了一种来自Concrete Math特别酷炫的计算快速排序算法复杂度的方法,我浑沦吞枣的看完了,思路确实是非常精彩。
教材学习中的问题和解决过程
没有问题。
代码调试中的问题和解决过程
没有问题。
代码托管
- 代码提交过程 & 代码量截图:
结对及互评
点评模板:
- 博客中值得学习的或问题:
其他
这周过的很仓促,连着几天熬夜,很大部分的时间都用来忙校庆了。因为全身心地献给祖国献给党,所以学习上就没法兼顾,包括请了一节程序设计课的假。希望下周开始好好学习,fighting💪
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | - | 1 | 10 | |
第一周 | - | 2 | 20 |
-
计划学习时间:20小时
-
实际学习时间:10小时
-
改进情况: