曾经有人建议说程序员都应该读读算法.虽然大学里也学过严蔚敏的数据结构书,但自己好像神游般不知学了什么,也不知道自己是如何稀里糊涂地通过了考试.现在有时间了,就想重新看看算法,也许智商是硬伤,但能走多远算多远吧:)
什么是算法?
所谓算法就是定义良好的计算过程,它取一个或一组作为输入,并产生一个或一组值作为输出.亦即,算法就是一系列的计算步骤,用来将输入数据转换成输出结果.(《算法导论》)
算法里有两个重要的概念时间复杂度和空间复杂度
- 时间复杂度(释义来自维基百科)
在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。举例,如果一个算法对于任何大小为
n 的输入,它至多需要 5n^3+3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n^3) 。
计算时间复杂度的过程,常常需要分析一个算法运行过程中需要的基本操作,计量所有操作的数量。通常假设一个基本操作可在固定时间内完成,因此总运行时间和操作的总数量最多相差一个常量系数。
有时候,即使对于大小相同的输入,同一算法的效率也可能不同。因此,常对最坏时间复杂度进行分析。最坏时间复杂度定义为对于给定大小 n 的任何输入,某个算法的最大运行时间,记为 T(n) 。通常根据 T(n) 对时间复杂度进行分类。比如,如果对某个算法有 T(n) = O(n) ,则称其具有线性时间。如有 T(n) = O(2^n) ,则称其具有指数时间。
- 空间复杂度(维基百科)
算法的空间复杂度是指计算机科学领域完成一个算法所需要占用的存储空间,一般是输入参数的函数。它是算法优劣的重要度量指标,一般来说,空间复杂度越小,算法越好。我们假设有一个图灵机来解决某一类语言的某一问题,设有X个字(word)属于这个问题,把X放入这个图灵机的输入端,这个图灵机为解决此问题所需要的工作带格子数总和称为空间。
一般学习算法的第一步就是排序,排序算法有很多种:插入排序 选择排序 冒泡排序 快速排序 归并排序 希尔排序 堆排序 等等.一个有意思的网站Comparison Sorting Algorithms演示了各个算法的实现.如果想看看各个经典排序算法如何实现,可以看看经典排序算法总结与实现.
Github上也有算法实现的Objective-C版 Swift版 Ruby版
读哪些书呢?我想一本《算法导论》就够了吧?可以结合视频来看.
要去看算法啦 :)
Girl学iOS100天 第29天
网友评论