本文已参与「新人创造礼」活动, 一起敞开掘金创造之路。
数据结构02算法
数据结构与算法的关系
数据结构与算法的关系就相当于梁山伯和祝英台、罗密欧和朱丽叶的关系。只谈数据结构,当然是能够,可是只学数据结构,学完后,很可能不知道数据结构有什么用途,可是在学习数据结构的一起一起学习算法,就会发现,甚至开端慨叹:计算机界的长辈们,的确是—些很牛很牛的人,他们使得很多看似很难处理或者没法处理的问题,处理得如此美妙和奇特。
算法的界说
算法是处理特定问题求解过程的描绘,在计算机中表现为指令的有限序列,而且每条指令表明一个或多个操作。
算法的特性
算法具有五个具体特性:
- 输入:一个算法有零个或多个输入。
- 输出:一个算法有一个或多个输出。
- 有穷性:算法在履行有限的过程之后,主动结束而不会出现无限循环,而且每一个过程在可接受的时刻内完成。
- 确认性:算法中每条指令必须有切当的意义,且相同的输入只能得到相同的输出。
- 可行性:算法中描绘的操作都能够经过现已完成的基本运算履行有限次来完成。
算法规划的要求
通常规划一个“好”的算法应考虑到达以下方针:
- 正确性:算法应能正确地求解问题。
- 可读性:算法能具有杰出的可读性,以帮助人们了解。
- 健壮性:输入非法数据时,算法能适当地做出反应或进行处理,而不会产生不可思议的输出成果。
- 功率与低存储需求:功率是指算法履行的时刻,存储量需求是指算法履行过程中所需的最大存储空间。
算法功率的度量方法
设两个算法的输入规模都是nn,算法A要做2n+32n+3次操作,能够了解为先有—个nn次的循环,履行完成后,再有—个nn次循环,最终有三次赋值或运算,共2n+32n+3次操作。算法B要做3n+13n+1次操作,算法A和算法B谁会更快呢?
精确说来,答案是不一定的。
此刻咱们给出这样的界说,输入规模nn没有限制的状况下,只要超过一个数值NN,这个函数就总是大于另—个函数,咱们称函数是渐近增长的。
判断一个算法的功率时,函数中的常数和其他次要项常常能够忽赂,而更应该重视主项(最高阶项)的阶数。
算法时刻复杂度
在进行算法剖析时,语句总的履行次数T(n)T(n)是关于问题规模门的函数从而剖析T(n)T(n)随nn的变化状况并确认T(n)T(n)的数量级。算法的时刻复杂度,也便是算法的时刻度量,记作T(n)=O(f(n))T(n)=O(f(n))。它表明随问题规模nn的增大,算法履行时刻的增长率和f(n)f(n)的增长率相同,称作算法的渐近时刻复杂度,简称为时刻复杂度。其间f(n)f(n)是问题规模nn的某个函数。
这样用大写O()O()来表现算法时刻复杂度的记法,咱们称之为大OO记法。
推导大OO阶的方法:
- 用常数1取代运转时刻中的一切加法常数。
- 在修改后的运转次数函数中,只保存最高阶项。
- 假如最高阶项存在且其系数不是1,则去除与这个项相乘的系数。
得到的成果便是大OO阶
常见的时刻复杂度如下所示。
常用的时刻复杂度所消耗的时刻从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log_n)<O(n)<O(nlog_n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法空间复杂度
算法的空间复杂度经过计算算法所需的存储空间完成,算法空间复杂度的计算公式记作:S(n)=O(f(n))S(n)=O(f(n)),其间,nn为问题的规模,f(n)f(n)为语句关于nn所占存储空间的函数。
总结
算法是处理特定问题求解过程的描绘,在计算机中表现为指令的有限序列,而且每条指令表明一个或多个操作。
算法的特性:有穷性、确认性、可行性、输入、输出。
算法的规划的要求:正确性、可读性、健壮性、高功率和低存储量需求。
算法特性与算法规划简单混,需要比照记忆。
推导大O阶的过程:
- 用常数1取代运转时刻中的一切加法常数。
- 在修改后的运转次数函数中,只保存最高阶项。
- 假如最高阶项存在且其系数不是1,则去除与这个项相乘的系数。
得到的成果便是大O阶。
经过这些过程,咱们能够在得到算法的运转次数表达式后,很快得到它的时刻复杂度,即大O阶。
接着给出了常见的时刻复杂度所耗时刻的巨细摆放:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log_n)<O(n)<O(nlog_n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)