解决特定问题。
深度优化程序性能的基础。
学习一种思想:如何把现实问题转化为计算机语言表示。
了解常见数据结构和算法,沟通没有障碍。
活学活用:遇到问题时知道要用什么数据结构和算法去优化。
线性:元素之间的关系是一对一的,如栈、队列。
非线性:每个元素可能连接0或多个元素,如树、图。
数学:算法是用于解决某一类问题的公式和思想。
计算机:一系列程序指令,用于解决特定的运算和逻辑问题。
时间复杂度:运行时间长短。
空间复杂度:占用内存大小。
如果运行时间是常数量级,则用常数1表示。
只保留时间函数中的最高阶项。
如果最高阶项存在,则省去最高项前面的系数。
字符串:暴力匹配、BM、KMP、Trie等。
查找:二分查找、遍历查找等。
排序:冒泡排序、快排、计数排序、堆排序等。
搜索:TFIDF、PageRank等。
聚类分析:期望最大化、k-meanings、k-数位等。
深度学习:深度信念网络、深度卷积神经网络、生成式对抗等。
异常检测:k最近邻、局部异常因子等。
......
回溯历史,比如方法调用栈。
页面面包屑导航。
消息队列
多线程的等待队列
网络爬虫的待爬URL队列
index = HashCode ("001121") % Array.length = 7
当key=this时,
index = HashCode ("this") % Array.length = 6
4)什么是哈希冲突?
不同的key通过哈希函数获得的下标有可能是相同的,例如002936这个key对应的数组下标是2,002947对应的数组下标也是2,这种情况就是哈希冲突。
5)如何解决哈希冲突?
开放寻址法:例子Threadlocal。
链表法:例子Hashmap。
6 树
1)什么是树?
树(tree)是n(n≥0)个节点的有限集。
当n=0时,称为空树。在任意一个非空树中,有如下特点:
有且仅有一个特定的称为根的节点。
当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。
如果左子树不为空,则左子树上所有节点的值均小于根节点的值。
如果右子树不为空,则右子树上所有节点的值均大于根节点的值。
左、右子树也都是二叉查找树。
查找==》二分查找。
排序==》中序遍历。
链表。
数组:对于稀疏二叉树来说,数组表示法是非常浪费空间的。
最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值。
最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值。
比较相邻的元素。如果第一个比第二个大,就交换它们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
重复步骤1~3,直到排序完成。
优点:实现和理解简单。
缺点:时间复杂度是O(n^2),排序元素多时效率比较低。
本轮排序中,元素没有交换,则isSorted为true,直接跳出大循环,避免后续无意义的重复。
记录有序和无序数据的边界,有序的部分在下一轮就不用遍历了。
鸡尾酒排序:元素的比较和交换是双向的,就像摇晃鸡尾酒一样。
把长度为n的输入序列分成两个长度为n/2的子序列。
对这两个子序列分别采用归并排序。
将两个排序好的子序列合并成一个最终的排序序列。
性能好且稳定,时间复杂度为O(nlogn) 。
稳定排序,适用场景更多。
非原地排序,空间复杂度高。
从数列中挑出一个元素,称为 “基准值”(pivot)。
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地对【小于基准值元素的子数列】和【大于基准值元素的子数列】进行排序。
性能较好,时间复杂度最好为O(nlogn),大多数场景性能都接近最优。
原地排序,时间复杂度优于归并排序。
部分场景,排序性能最差为O(n^2)。
不稳定排序。
随机选择基准元素,而不是选择第一个元素。
三数取中法,随机选择三个数,取中间数为基准元素。
大于、小于、等于基准值。
双轴快排:2个基准数,例子:Arrays.sort() 。
将初始待排序关键字序列(R1,R2….Rn)构建成最大堆,此堆为初始的无序区。
将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n]。
由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
性能较好,时间复杂度为O(nlogn)。
时间复杂度比较稳定。
辅助空间复杂度为O(1)。
数据变动的情况下,堆的维护成本较高。
找出待排序的数组中最大元素。
构建一个数组C,长度为最大元素值+1。
遍历无序的随机数列,每一个整数按照其值对号入座,对应数组下标的值加1。
遍历数组C,输出数组元素的下标值,元素的值是几就输出几次。
性能完爆比较排序,时间复杂度为O(n+k),k为数列最大值。
稳定排序。
适用范围比较狭窄。
数列的最小值作为偏移量,以数列最大值-最小值+1作为统计数组的长度。
创建桶,区间跨度=(最大值-最小值)/(桶的数量-1)。
遍历数列,对号入座。
每个桶内进行排序,可选择快排等。
遍历所有的桶,输出所有元素。
最优时间复杂度为O(n),完爆比较排序算法。
适用范围比较狭窄。
时间复杂度不稳定。
参考内容及图源 [1]《漫画算法:小灰的算法之旅》 [2]《算法(第4版)》 [3]《算法图解》 [4]《剑指Offer》 [5]十大经典排序算法(动图演示)
https://www.cnblogs.com/onepixel/p/7674659.html [6]维基百科
https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5
推荐阅读
美国未来20年人工智能研究路线图-美国人工智能协会中科院博士整理的机器学习算法知识手册 | 附PDF下载你拖后腿了吗?互联网大厂的薪资和职级一览 在公众号后台输入关键数字获取资料: 001,获取吴恩达DeepLearning.ai 知识图谱 002,获取吴恩达CS229中文速查表 003 ,获取吴恩达Machine Learning课程总结【腾讯白皮书】查看腾讯2020人工智能白皮书
【中国AI】查看2020年中国AI产业地图研究【美国人工智能】查看美国未来20年人工智能研究路线图
【机器学习算法】,获取机器学习算法知识手册【深度学习TF】,获取深度学习与TensorFlow 入门实战
AI人工智能科技平台
咱AI人自己的学习平台
人工智能|大数据|深度学习|计算机视觉
你点的每个赞,我都认真当成了喜欢