数据结构
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据结构的定义
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科
二、结构
1.逻辑结构和物理结构
逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题
物理结构:是指数据的逻辑结构在计算机中的存储形式
2.数据元素的存储结构形式
1.顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
2.链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
代码如下(示例):
算法
前言
算法的五个特性:
1、有穷性:有限时间内能执行完(算法是又穷的 程序可以是无穷的)
2、确定性:相同输入智慧产生相同输出
3、可行性:可以用已有的基本操作实现算法
4、输入:丢给算法处理的数据
5、输出:算法处理的结果
好算法的特质:
1、.正确性:能正确解决问题
2、可读性:对算法的描述要让其他人也看得懂
3、健壮性:算法能处理一些异常状况
4、高效率与低存储量需求:省内存 时间空间复杂度低
一、算法效率的度量
1.算法时间复杂度定义
:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析随T(n)的变化情况并确定T(n)的数量级。记作:T(n)=O(f(n))
① 线性阶
例子:1+2+…+100=?
//第一种算法:
int i,sum = 0,n = 100; //执行1次
for(i = 1;i <= n;i++) //执行了n+1次(if判断)
{
sum sum + i; //执行n次
}
//第一种算法执行了1+(n+1)+n=2n+2次
② 平方阶
int i,j,n = 100;
for( i = 0; i < n; i++)
{
for(j = i;j < n; j++)
{
printf("a");
}
}
//分析:由于当i=0时,内村换执行了n次,当i=1时,内循环执行n-1次....所以总的次数:n+(n-1)+(n-2)+..1=n(n+1)/2=n*2/2+n/2
保留最高项O(n^2)
③ 对数阶
int i = 1, n = 100;
while(i < n){
i = i * 2
}
//分析:由于每次i*2之后,就离n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。
于是2^x=n得到x=log(2)n所以时间复杂度为O(logn).
O(logn)
注:常用的时间复杂度所耗费的时间从小到大依此是:
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
2、算法的空间复杂度:
通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
二、线性表
定义:由零个或多个数据元素组成的有限序列
注:
①首先是一个序列,也就是说元素之间由先来后到
②若元素存在多个,则第一个元素无前屈,最后一个元素无后继,其他元素都有且只有一个前驱和后继。
③另外,线性表强调是有限的。
1.线性表的存储结构
①线性表的顺序存储结构
定义:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
②线性表的链式存储结构
定义:是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存种未被占用的任意位置
注:链表的第一个结点的存储位置叫头指针,最后一个结点指针为NULL
基本操作
InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间
ListInsert(&L,i,e):插入操作。在表L种的第i个位置上插入指定元素e.
插入操作的时间复杂度
ListDelete(&L,i,&e):删除操作。删除表L种的第i个位置的元素,并用e返回删除元素的值。
删除操作的时间复杂度
LocateElem(L,e):按值查找操作。在表L种查找具有给定关键字值的元素。
按值查找复杂度:
GetElem(L,i):按位查找操作。获取表L种第i个位置的元素的值。
按位查找的时间复杂度O(1)
其他常用操作:
Length(L):求表长。返回线性表L的长度,即L种数据元素的个数。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L):判空操作。诺L为空表,则返回true,否则返回false.
1、顺序表
定义:用顺序存储的方式实现线性表顺序存储。
实现—静态分配
实现—动态分配
C 函数:
malloc(sizeof(ElemType)*InitSize)//申请 InitSize初始大小
free //释放
2、单链表
定义:
按位序插入(带头节点)
按位序插入(不带头节点)
按位序删除(带头节点)
按位查找
按值查找
红黑树
性质
①每个结点不是红色就是黑色
②不可能有连在一起的红色结点
③根结点都是黑色 root
④每个红色结点的两个子结点都是黑色,叶子节点都是黑色:出度为0满足了性质就可以近似的平衡了,不一定要红黑,可以为其他的
注:旋转和颜色变换规则:所有插入的点默认为红色
1.变颜色的情况:当前结点的父亲是红色,且她的祖父结点的另一个子节点也是红色(叔叔结点):
(1)把父节点设为黑色
(2)把叔叔也设为黑色
(3)把祖父也就是父亲的父亲设为红色(爷爷)
(4)把指针定义到祖父结点设为当前要操作的(爷爷)分析的点变换的规则
2.左旋
条件:当前父节点是红色,叔叔是黑色的时候,且当前
3.右旋
条件:当父节点是红色,叔叔是黑色的时候,且当前的结点是左子树,右旋
(1)把父节点变成黑色
(2)把祖父节点变成红色(爷爷)
(3) 以祖父结点旋转(爷爷)
的结点是左子树,左旋以父节点作为左旋
例子