数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
1.基本数据结构:
集合:不存在任何关系。
线性结构:一对一的关系。例如学生信息表就是一个线性结构:其中包括学号、姓名、班级、性别、出生年月。
树形结构:一对多的关系。树形结构具有严格的层次关系。家族关系是典型的树形结构。
图形结构:多对多的关系。四个城市的公路交通图是典型的图状结构,又称网状结构。
2.算法:
描述算法的好坏:算法时间复杂度。
对某一特定类型的问题的求解步骤的一种描述。是指令的有限序列。其中每条指令表示一个或多个操作。
算法复杂度:该算法的运行时间与问题规模的对应关系。通常把算法中的基本重复执行的次数(频度)作为算法的时间复杂度。算法中的基本操作一般是指算法中最深层循环句的语句。
3.算法时间复杂度
算法中基本操作重复执行的频度T(n)是问题规模n的某个函数f(n).记作:T(n)=O(f(n)).
O表示:随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。或者说"O"表示数量级的概念。
O(1).常数阶:算法没有循环语句,则算法中基本操作执行频度与问题规模n无关。
O(n).算法只有一个重循环,基本操作的执行频度与问题规模n呈线性增大关系。
O(n*n)[就是n的平方]:平方阶 除此之外还有立方阶,对数阶等。
举例:O(N) O(N*N) O(N*N*N)
x=n; for( int i=1;i<n;i++ ) x=n;
y=0; { y=0;
while(y<x) for(j=0;j<n;j++) while(x>=(y+1)(y+1))
{ { {
y=y+1; A[i][j]=i*j; y=y+1;
} } }
}
3.线性表
具有相同类型的数据元素的一个有限序列。
相同类型:指的是线性表中的数据元素都属于同种类型。
有限:指的是线性表中的数据元素个数是有限的,线性表中的每一个数据元素都有自己的位置。
基本操作:用接口表示
public interface IListDS<T>
{
int GetLength();//求长度
void Clear();//清空操作
bool IsEmpty();//判断线性表是否为空
void Append();//追加操作
void Insert();//插入操作
T Delete(int i);//删除操作
T GetElem( int i );//取出不删除
int Locate( T value);//按值查找某个位置
}
4.线性表种类
顺序表、单向链表、双向链表、循环链表
顺序表是指用一块地址连续的存储空间依次存储线性表的数据元素。
特点:容量固定、访问速度快
顺序表典型方法:追加、插入、删除
@追加
0 1 2 3 4 5 6
50 |
datas指向存储空间的数组。 last指向最后一次操作的索引 比如上图last=0,没有值就为-1.
追加操作时间复杂度:和已经存在的数据没有任何关系。时间复杂度O(1).
@插入
顺序表上的插入操作,时间主要消耗在数据的移动上。
最好的情况下:插入末尾,没有移动。相当于追加。
最坏的情况下:插入头部,即第0个下标位置。
平均移动次数:n/2
时间复杂度为:O(n)
@ 删除
删除操作时间和插入操作相似,时间主要消耗在数据的移动上。
最好的情况下:删除末尾,无移动
最坏的情况下:删除头部,移动n-1次。
平均移动:(n-1)/2
时间复杂度:O(n)