09数据结构概述
二、与408关联解析
-
逻辑结构与存储结构
-
时间复杂度与空间复杂度(大题必考)
三、
逻辑结构与存储结构
-
逻辑结构:数据元素之间的逻辑关系(抽象的)。
-
存储结构:数据结构在计算机中的表示(具体的)。
-
逻辑结构:集合结构(无关系);线性结构(一对一);树形结构(一对多);图形结构(多对多)。
-
线性结构中:前面的称为前驱(如1)、后面的称为后继(如2)。
-
存储结构: 顺序存储、链式存储、索引存储、散列存储。(后两种结构也是通过前两种结构来实现)
-
C语言实现:
int Array[6]={1,2,3,4,5,6};//定义数组并初始化
printf(“%d\n”, Array[3]) //随机访问第4个元素
-
C语言实现:
Typdef struct Lnode{
ElemType data;
struct Lnode *next;
}Lnode,*LinkList;
Lnode *L;
L=(LinkList)malloc(sizeof(Lnode));
A->next=B;B->next=C
-
逻辑结构对人友好,存储结构对计算机友好。
-
顺序存储与链式存储分析
(1)顺序存储可以实现随机存取;每个元素占用最少的空间;但只能使用整块的存储单元,会产出较多的碎片。
(2)链式存储充分利用所有存储单元,不会出现碎片现象;但需要额外的存储空间来存放下一结点的指针;只能实现顺序存取。
四、
时间复杂度与空间复杂度
-
算法:对特定问题求解步骤的描述。
-
特性:有穷、确定、可行、输入、输出。
-
时间复杂度:指算法中所有语句的频度((执行次数))之和。记为:T(n)=O(f(n)),其中n是问题的规模,f(n)是问题规模n的某个函数。表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
-
访问数组中的任意元素:O(1)。
-
时间复杂度的计算
-
例子
int sum=0; //执行一次
sum=n*(n+1)/2; //执行一次
printf(“%d”,sum); //执行一次
算法的执行次数等于3。时间复杂度为T(n)=O(1)。表示不会随n的增长而增长。
-
例子
int x=2;
while(x<n/2)
x=2*x;
-
例子
int sum=0,i=1;
while(i<n){
sum=sum+i;
i++;
}
printf(“%d”,sum);
-
例子
int i,x=2;
for(i=0;i<n;i++)
{
x=0;
while(x<n/2)
x=2*x;
}
-
例子
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
sum=sum+1;
}
-
例子
int sum1=0,sum2=0,i,j;
for(i=0;i<n;i++)
sum1=sum1+i;
for(j=0;j<m;j++)
sum2=sum2+j;
printf(“%d,%d”,sum1,sum2);
-
例子
-
空间复杂度:指算法运行过程中所使用的的辅助空间的大小。记为S(n)=O(f(n))。
-
除了需要存储算法本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。
-
若输入数据所占空间只取决于问题本身, 和算法无关, 这样只需分析该算法在实现时所需的辅助单元即可。
-
算法原地工作是指算法所需的辅助空间是常量, 即O(1)。
-
n个元素的数组元素排序,不开辟额外的空间(随n的增长而增长的空间为额外空间),此时空间复杂度就是O(1)。