算法
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列。并且每条指令表示一个或多个操作
算法具有5个基本特征:输入,输出,有穷性,确定性和可行性
设计算法应该尽量满足时间效率高和存储量低的需求
算法时间复杂度的定义
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数。
线性表:零个或多个数据元素的有限序列
若将线性表记为(a1,a2,a3,a4,........an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i = 1,2,3....n-1时ai有且仅有一个直接后继,当i = 2,3....n时,ai有且仅有一个直接前驱,所以线性表的个数n定义为线性表的长度,当n等于0时,为空表
在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
线性表的抽象数据类型定义如下:
ADT 线性表(List)
Data
线性表的数据对象集合为{a1,a2,a3,......an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且仅有一个直接前驱元素,除了最后一个元素an外,每一个元素有且仅有一个直接后继元素。数据元素之间的关系是一对一的关系。
Operation
InitList(*L): 初始化操作,建立一个空的线性表L。
ListEmpty(L):若线性表为空,返回true,否则返回false。
Clearlist(*L): 将线性表清空。
GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e。
ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。
ListLength(L);返回线性表L的元素个数。
endADT
将所有的在线性表Lb中但不在La中的数据元素插入到La中
void unionL(List *La,List Lb)
{
int La_len,Lb_len,i;
ElemType e;
La_len = ListLength(*La);
Lb_Len = ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); 取Lb中第i个数据元素赋给e
if(!LocationElem(*La,e)) La中不存在和e相同的数据元素
ListInsert(La,++La_len,e);
}
}