最近打算将数据结构和算法复习一下,写文章记录下来,以加强记忆,并和各位同仁们共同分享。
数据:是所有能被输入到计算机中,且能被计算机处理的符号的集合。
数据元素:是数据(集合)中的一个“个体”,是数据的基本单位。(例如张三是一个数据元素)
数据对象:是具有相同性质的若干个数据元素的集合。(例如高二三班是一个数据对象)
数据结构:是指数据以及数据元素相互之间的联系。可以看作是相互之间存在着某种特定关系的数据元素的集合。因此数据结构可看成是带结构的数据元素的集合。
数据结构包括如下几方面:(1)数据元素之间的逻辑关系、数据的存储结构即物理结构、施加在数据上的操作即数据的运算。
逻辑结构的描述或表示:为了更确切的描述一种数据结构,通常采用二元组表示:B=(K,R)其中B是一种数据结构,它由数据元素的集合K和K上的二元关系集合R所组成。其中
K={ki| 1≤i≤n,n≥0}---------------------集合中第i个数据元素
R={rj|1≤j≤m,m≥0} ------------------- 当m=0时,代表集合K中结点无任何二元关系,彼此独立。
序偶<x,y>(x,y∈K) ------------------x,为第一个节点,y为第二个结点,x是y的直接前驱结点,y为x的直接后继结点,若某个节点无前驱结点,则称为开始结点,同理称为终端节点。
说明:<x,y>表示有向关系,(x,y)表示无向关系。采用离散数学的表示方法。
例如:用二元组表示数据结构
K={k1,k2,k3,k4,k5,k6,k7}
R={r} //只有一种关系
r={<k1,k2>,<k2,k3>,<k3,k4>,<k4,k5>,<k5,k6>,<k6,k7>}
逻辑结构类型:
(1)线性结构:结点之间一对一的关系。----------------- 典型结构:顺序表。唯一的开始结束结点,其余结点仅有一个前驱和后继结点。
(2)树形结构:结点之间一对多的关系。------------------典型结构:树,开始结点唯一,但终端结点不惟一,终端结点外,每个结点有一个或多个后继结点,除开始结点外,每个
结点都有惟一的前驱结点。
(3)图形结构:结点之间多对多的关系。------------------典型结构:图,无开始和终端结点,所有节点都可能有多个前驱和后继。
存储结构类型:
(1)顺序存储方法----数组---节省空间----便于查找随机存取(2)链式存储方法----链表----空间浪费-----便于插入、删除,不适合随机存取(3)索引存储方法----索引表----便于查
找、插入、删除(4)哈希或者散列存储方法---根据key利用函数算出地址作为存储-----便于查找但它只存储结点的数据。不存储逻辑关系,所以一般只适合对数据进行快速查找和
插入的场合。
数据类型:一个值的集合和定义在此集合上的一组操作的总称。(int整型数据类型即是整数数据的集合和相关的整数运算)
抽象数据类型:ADT指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现
算法,ADT = 数据元素集合 + 抽象运算
ADT Name
{
数据对象:
数据关系:
基本操作:
}
例如:
ADT Complex
{
数据对象:
D={e1,e2|e1,e2均为实数}
数据关系:
R1={<e1,e2>|e1是复数的实数部分,e2 是复数的
虚数部分 }
基本操作:
AssignComplex(&Z,v1,v2):构造复数Z。
} ADT Complex
算法:具体存储结构上的操作实现步骤或过程称为算法。此外的操作还有还有逻辑结构上的操作功能。算法无个性质:(1)有穷性(2)确定性(3)可行性(4)有输入(5)有输出
算法分析:
(1)算法时间复杂度分析:一个算法由控制结构和原操作组成,算法即时二者的综合效果,不能用绝对执行时间来比较算法,算法的基本运算即是最深层次循环的语句。所以
通常把算法中包含基本运算次数的多少称为算法的时间复杂度。T(n)= O(f(n))。
各种不同数量级对应的值存在着如下关系:
O(1)<O(log2n)<O(n)<O(n*log2n)<O(n2)<O(n3)<O(2n)<O(n!)
(2)算法空间复杂度分析:空间复杂度是算法在运行过程中临时占用的存储空间大小的度量。S(n) = O(g(n)),若所需的额外空间相对于输入数据量是常数,则称为此算法是原
地工作。有关系则按最坏的情况计算。
数据结构+算法 = 程序。
线性表的定义:线性表是具有相同特性的数据元素的一个有限序列。
线性表的一般表示:(a1,a2,…ai,ai+1,…,an)表头元素、表尾元素。
线性表(逻辑结构)的顺序存储-------顺序表(存储结构):把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。
假定元素的类型为ElemType,整个线性表的空间为n*sizeof(ElemType)。
顺序表定义:
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList; /*顺序表类型*/
其中,data成员存放元素,length成员存放线性表的实际长度。
建立顺序表:
void CreateList(SqList *&L,ElemType a[],int n)
/*建立顺序表*/
{
int i;
L=(SqList *)malloc(sizeof(SqList));
for (i=0;i<n;i++)
{
L->data[i]=a[i];
}
L->length=n;
}