算法分析
算法基础
算法的五个重要特性:
-
- 有穷性:对于合法输入,在执行有穷步后结束,且每一步都可在有穷时间内完成
-
- 确定性:每一条指令必须有确切的含义,对于相同的输入只能得出相同的输出
-
- 可行性:算法中描述的操作都可以通过有限的基本运算实现
-
- 输入:0或多个输入
-
- 输出:1或多个输出
排序算法
各排序算法
img
插入排序
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。类似于扑克牌中给牌排序,从未排序的牌中选择一张对比已排序的牌,在比它小的牌后面插入。
插入排序
希尔排序(Shell排序)
先将整个带排序序列分割成若干子序列,然后分别进行插入排序,待整个序列记录基本有序时,再进行一次完整的插入排序。
希尔排序
冒泡排序
重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。每一轮比较结束后,最后一个数字是这一轮比较中的最大值。
冒泡排序
选择排序
在未排序的序列中找到最大(小)值,放到序列的头部或尾部,时间复杂度 O ( n 2 ) O(n^2) O(n2)。
选择排序
归并排序
建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并排序
合并相邻子序列:
合并相邻子序列
重复步骤
快速排序
由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要$Ο(nlogn) 次比较。在最坏状况下则需要 次比较。在最坏状况下则需要 次比较。在最坏状况下则需要O(n^2)$ 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 $Ο(nlogn) $ 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序又是一种分而治之思想在排序算法上的典型应用。
-
- 从数列中挑出一个元素,称为 “基准”(pivot);
-
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
-
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
快速排序
堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
-
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
-
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
其他
还有基数排序、计数排序、桶排序,这几个排序算法都利用了桶的概念。桶排序是每个桶都可以存放一个范围的数字,计数排序是每个桶只放一个数字,基数排序是根据数据的每一位来分配桶,所以也可以处理字符串。
基数排序
算法思想
贪婪算法
虽然每次的选择都是局部最优,当在算法结束的时候,其期望是全局最优才是正确的。不过有时,在不同条件与要求下时,最优解的答案可能不止有一个或不一样,而贪婪算法也可以得出一个近似的答案。
当前步骤最优解,非整体
分治算法
分治算法不是简单的递归,而是将大的问题递归解决较小的问题,然后从子问题的解构建原问题的解。比如,快速排序和归并排序算分治算法,而图的递归深度搜索和二叉树的递归遍历则不是分治算法的运用。
分解,递归,合并
动态规划
动态规划与分治算法的区别是,两种算法同样是将较大的问题分解成较小问题,而动态规划对这些较小的问题并不是对原问题明晰的分割,其中一部分是被重复求解的,因此动态规划将较小问题的解记录下来,使得在处理较大问题的时候,可以不用重复去处理较小的问题,而是直接利用所记录的较小问题的答案来求解。
每一步最优以保证全局最优
随机化算法
随机化算法的一个应用是在快速排序中对枢纽元素的选择,使得算法的运行时间不止依赖于特定的输入,还而且还依赖于所出现的随机数。虽然一个随机化算法的最坏情形运行时间常常与非随机化算法的最坏情形运行时间相同,但两者还是有区别的,好的随机化算法没有坏的输入,而只有坏的随机数。
回溯算法
回溯算法相当于穷举搜索的巧妙实现,对比蛮力的穷举搜索,回溯算法可以对一些不符合要求的或者是重复的情况进行裁剪,不再对其进行搜索,以减少搜索的工作量提高效率。比如,在图运用回溯算法的深度优先搜索遍历中,会对已搜索遍历过的顶点进行标记,避免下次的回溯搜索中对再次出现的该顶点进行重复遍历。
题外话
“不是只有程序员才要学编程?!”
认真查了一下招聘网站,发现它其实早已变成一项全民的基本技能了。
连国企都纷纷要求大家学Python!
世界飞速发展,互联网、大数据冲击着一切,各行各业对数据分析能力的要求越来越高,这便是工资差距的原因,学习编程顺应了时代的潮流。
在这个大数据时代,从来没有哪一种语言可以像Python一样,在自动化办公、爬虫、数据分析等领域都有众多应用。
更没有哪一种语言,语法如此简洁易读,消除了普通人对于“编程”这一行为的恐惧,从小学生到老奶奶都可以学会。
《2020年职场学习趋势报告》显示,在2020年最受欢迎的技能排行榜,Python排在第一。
它的角色类似于现在Office,成了进入职场的第一项必备技能。
如果你也想增强自己的竞争力,分一笔时代的红利,我的建议是,少加点班,把时间腾出来,去学一学Python。
因为,被誉为“未来十年的职场红利”的Python,赚钱、省钱、找工作、升职加薪简直无所不能!
目前,Python人才需求增速高达**174%,人才缺口高达50万,**部分领域如人工智能、大数据开发, 年薪30万都招不到人!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典