为什么不算法?常用算法概要大纲!
为什么不去重视下算法?
1. 因为平时工作基本用不上;(不重视)
2. 算法太枯燥;(没耐心)
3. 算法难学;(智商余额不足)
但是你得改。本文列举几个常用算法概要大纲!
现在的高级语言,给我们带来了许多的开发的方便,但是也更让我们更傻瓜了。
甚至在99%的工作中,我们完全不了解算法,就可以把工作做好,顶多要多做的一件事就是,在不知道怎么办的时候,到网上去搜索下该语言的工具类库就好了。
然而,如果没有这些工具类库的情况下,你怎么办呢?
在解决问题的时候,如果只能想到使用工具类库去解决问题,甚至都不知道其实现原理,那么这些知识是多么的脆弱,多么的死板?
其实,到高手过招的时候,都是比的数据,比的算法。
所以,切莫沉溺工具类,而应该真正去掌握算法,至少常用的算法能够熟记于心,手到擒来!
下面列举几个常用算法的方向,作为研究的方向。
1. 常用排序算法
1.1. 冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1.2. 选择排序(Selection Sort)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
1.3. 插入排序(Insertion Sort)
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
1.4. 希尔排序(Shell Sort)
1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
1.5. 归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
1.6. 快速排序(Quick Sort)
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
1.7. 堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
1.8. 堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
1.9. 桶排序(Bucket Sort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
1.10. 基数排序(Radix Sort)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
具体算法示例请参考(超祥细): https://www.cnblogs.com/onepixel/articles/7674659.html
2. 常用查找算法
2.1. 顺序查找
顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构。该算法的时间复杂度为O(n)。
2.2. 二分查找
二分查找(Binary Search),是一种在有序数组中查找某一特定元素的查找算法。查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种查找算法每一次比较都使查找范围缩小一半。
2.3. 插值查找
插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的 查找方法,其核心就在于插值的计算公式 (key-a[low])/(a[high]-a[low])*(high-low)。
2.4. 二叉树查找算法
二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。
2.5. 平衡查找树之2-3查找树(2-3 Tree)
2.6. 平衡查找树之红黑树(Red-Black Tree)
整个树完全黑色平衡,即从根节点到所以叶子结点的路径上,黑色链接的个数都相同(2-3树的第2)性质,从根节点到叶子节点的距离都相等)。
2.7. B树和B+树(B Tree/B+ Tree)
2.8. 分块查找
分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素。
2.9. 哈希查找
哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。
详细信息请参考: https://www.cnblogs.com/yw09041432/p/5908444.html
3. 加密算法
常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。
常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES
常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
详情可参考: https://www.cnblogs.com/colife/p/5566789.html
4. 图论算法
Dijkstra算法
Floyd算法
Prim算法
Kruskal算法
可简单参考: https://www.cnblogs.com/wangmengmeng/p/5277225.html
5. 并行算法
并行算法就是用多台处理机 联合求解问题的方法和步骤,其执行过程是将给定的问题首先分解成若干个尽量相互独立的子问 题,然后使用多台计算机同时求解它,从而最终求得原问题的解。
百科解释: https://m.baidu.com/sf_bk/item/并行算法/967188?fr=aladdin&ms=1&rid=10850472149522734565
6. 随机化算法
参考: https://www.jianshu.com/p/dec9a453573f
7. 动态规划算法
动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
https://blog.csdn.net/baidu_37107022/article/details/73188963
https://blog.csdn.net/baidu_37107022/article/details/73189125
https://blog.csdn.net/baidu_37107022/article/details/78253222?utm_source=blogxgwz0
8. 计算几何的算法
9. 厄米变形模型
10. 随机森林算法
不重视算法,不代表不会算法,其实真正遇到问题时,我们仍然是会想各种办法解决的,所以从本质上我们都在使用算法。但是,算法的是很烧脑的东西,很多巨人的智慧结晶,只有不断地学习他们的知识,应用到工作中,才会事半功倍。
其实算法作为一个开发人员的基本功,是一定要引起重视的,否则最后就只会轮为一个业务的工具。
只有立足于算法之上,才能走得远,站得高。