一、算法
1、算法
算法是解决特定问题的步骤的描述。在计算机中算法是一个有穷(或语句、指令)的有序集合。
它确定了解决某一个问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。
2、算法与程序
算法是解决问题的思想方法;
程序是计算机语言的具体实现;
共同点:它们的语言不能有二义性
区别:算法不依赖计算机语言,程序则必须依赖计算机语言实现
算法是有穷的,程序可以是无穷的;
算法可以忽略语法的细节,程序必须严格遵守它所对应的计算机语言的语法;
3、算法与数据结构
算法设计:取决于选定的逻辑结构
算法实现:依赖于采用的存储结构
数据结构 + 算法 = 程序
4、算法的特性
有穷性、确定性、可行性、输入(不一定有输入)、输出(一定有一个或多个输出)
5、算法好坏的判定
(1)正确性:能否正确的解决问题(最基本的一点)
(2)效率方面:消耗时间的多少、消耗存储空间的多少
(3)编程方面:算法的结构要好,要易于理解、编码和调试
6、算法效率的度量——>时间复杂度
程序运行消耗的时间取决于:
(1)算法的设计;
(2)算法的输入规模;
(3)编译器对代码的优化;
(4)计算机执行指令的速度;
方法:
事后统计法
缺陷:依赖于特定的计算机软件与硬件, 需要花费大量精力设计测试程序和测试数据
事前估计法
根据算法中语句执行的最大次数(频度)来估算一个算法执行时间的数量级。
时间复杂度T(n)
算法中基本操作重复执行的次数是问题规模n的某个函数f(n)
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
7、算法复杂度的计算方法
计算T(n)的方法:
根据语句频度,写出表达式;
常数部分变为1;
只保留最高阶项目,其余的项舍去;
如果最高项有乘数且不为1,表达式除于最高阶相乘的数;
8、算法空间复杂度
算法空间复杂度就是计算方法所需要的存储空间的大小。
S(n)=O(f(n))
二、线性表
1、线性表
线性表就是零个或多个相同数据元素的有限序列。
2、表示方法
L=(D,R)
D为所包含的元素集合
R为元素关系集合
3、线性表的基本运算
(1)建立一个空表:CreateList(L);
(2)置空表:ClearList(L);
(3)判断表是否为空:EmptyList(L)
若为空,返回值为True(或1),否则返回False(或0);
(4)求表长:Length(L);
(5)取表中某个元素:GetList(L,i),即ai,要求0<=i<=length(L)-1;
(6)定位运算:Locate(L,x).确定元素X在表L中的位置(或序号);
(7)插入:Insert(L,x,i).将元素X插入到表L中第i个元素ai之前,且表长+1;
(8)删除:Delete(L,i).删除表L中第i个元素ai,且表长减1,要求0<=i<=n-1;
1-8为基本运算,此外,对线性表的运算还有:合并、拆分、复制、排序和遍历等。
三、顺序表
1、线性表存储映像
顺序映像、链式映像
2、为了明确区分顺序表里的元素个数
定义变量:last 1)有效数值的个数
2)最后一个有效元素的下标
3、顺序表的C语言实现顺序映像
#define N 100
typedef int data_t;
typedef struct {
data_t data[N];
int last;
}sqlist_t,*sqlink_t;
4、顺序表——删除元素
删除:将表中第i个元素ai从表中删除,即实现DeleSqlist(L,i).
思路:若参数i满足:0<=i<=L->last,将表中L->data[i+1]到L->data[L->last]部分顺序向上移动一个位置,覆盖L->data[i].
5、顺序表——定位
定位:确定给定元素X在表中第一次出现的位置(或序号)。即实现Locate(L,x)。
思路:设一扫描变量i(初值为0),判断当前表中元素ai是否等于x,若相等,则返回当前i值(表明x落在表的第i个位置);否则i加1,继续下去。若表中无一个元素与x相等,则返回-1.