数据结构和算法——绪论
1、数据结构与算法绪论
什么是数据结构?
程序设计=数据结构+算法
数据结构就是关系,即数据元素相互之间存在的一种或多种特定关系的集合。
数据结构分为逻辑结构和物理结构。
逻辑机构:数据对象中数据元素之间的相互关系
物理结构:数据的逻辑结构在计算机中的存储形式。
四大逻辑结构:
1. 集合结构:结构中的数据元素同属于一个集合,没有其他关系。
2. 线性结构:结构中的数据元素之间是一对一的关系。
3. 树形结构:数据元素之间存在一对多的层次关系。(传销金字塔..)
4. 图形结构:数据元素之间多对多的关系。(人类之间的关系,各个个体之间都有关系)
物理结构:
研究如何将数据元素存储到计算机的存储器中。(内存的存储方式)
存储器:主要针对内存而言,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
数据组织的存储结构形式两种:顺序存储&链式存储
顺序存储结构:把数据元素存放在地址连续的存储单元里,数据间的存储关系和物理关系一致。例如编程语言中的数组结构。
【结构中元素的顺序可能时常有变化,顺序存储结构就不适应了,需要链式存储结构】
链式存储结构:把数据元素存储在任意的存储单元里,存储单元可连续也可不连续。这样的存储关系不能反映其逻辑关系,因此需要用一个指针存放(下一个)数据元素的地址,通过地址可以找到相应数据元素的位置。
2、谈谈算法
算法:对某一问题的解决方法的步骤的总结,计算机中表现为指令的有限序列,每条指令表示多个操作。
算法包括5个方面:输入,输出,有穷性,确定性,可行性。
输入:算法具有0个或多个输入
输出:算法至少有一个或多个输出
有穷性:算法在执行有限步骤后,自动结束而不会出现无限循环,并且在可接受的时间范围内完成
确定性:算法的每个步骤都具有确定的含义,不会出现二义性
可行性:算法每一步都必须可行,即每一步都能够通过执行有限次数完成
算法设计要求:
正确性:
(1)无语法错误
(2)合法输入产生满足要求的输出
(3)不合法输入产生合乎规格的说明
(4)***难测试能够输出所要求的输出
可读性:便于他人和自己阅读并理解
时间效率高,存储量小
3、时间复杂度和空间复杂度
如何度量算法的效率?
效率一般指算法的执行时间。那么如何度量算法的执行时间?
事后统计方法:【可以把算法跑若干次,用计时器计时】通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率高低。缺陷:必须依据算法,事先编制好测试程序,大量耗费时间精力。而且对测试环境的要求高,不同测试环境测出来的也不准。
事前分析估算方法:在计算机程序编写前,依据统计方法对算法进行估算。
经过总结分析,高级语言编写的程序的运行时间取决于以下因素:
1. 算法采用的策略、方案
2. 编译产生的代码质量【高级语言写的源代码通过编译器编译成二进制代码】
3. 问题的输入规模
4. 机器执行指令的速度
其中2和4分别取决于计算机软件、硬件,抛去这些,可见程序的运行时间依赖于算法的好坏和问题的输入规模。
分析一个算法的运行时间时,重要的是把基本操作的数量和输入模式关联起来。
函数的渐进增长:f(n)与g(n),若存在N,使n>N时,f(n)恒大于g(n),则称f(n)的增长渐进快于g(n)。
判断算法的效率时,函数中的常数和其他次要项科研忽略,更应该关注最高次项的阶数。
算法时间复杂度的定义:进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)为问题规模n的某个函数。
这样用大写O()来体现算法时间复杂度的记法,称之为大O记法。
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
分析时间复杂度:
用常数1取代运行时间中的所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
若最高阶项存在且不是1,则去除与这个项相乘的常数。
最后得到的结果就是大O阶数。
阶数:
常数阶O(1)
线性阶O(n)【非嵌套循环】
平方阶O(n²)【嵌套循环】,循环时间复杂度=循环体的复杂度×该循环的嵌套次数
对数阶O(log(n))
eg. While (i<n)
{ i=i*2}
耗费时间:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2^n)<O(n!)<O(n^n)
最坏情况与平均情况:
平均运行时间是期望的运行时间。
最坏运行时间是一种保证,在应用中,这是一种最重要的需求,通常除非特别指定,运行时间都是指最坏运行时间。
算法的空间复杂度:
写代码时可以用空间来换取时间。【判断是否闰年的例子:设计算法与查表】
空间复杂度通过计算算法所需的存储空间实现,计算公式:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。