社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
数据项
数据项:数据项组成数据元素,数据项是不可分割的最小单位
数据元素:组成数据的基本单位
数据对象:性质相同的数据元素的集合
数据:描述客观事物的符合
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
逻辑结构:数据对象中数据元素的相互关系
物理结构:数据的逻辑结构在计算机中的存储形式,也就是将数据元素存储到存储器
物理结构包括:顺序存储结构、链式存储结构
顺序存储结构:把数据元素存放在地址连续的存储单元,数据间逻辑关系和物理关系是一样的
链式存储结构:把数据元素存储到任意存储单元中,这些单元可以是连续的也可以是不连续的
链式存储很灵活,不用在意存储的位置,只要有一个存放地址的指针就好了。
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,且每条指令表示一个或多个操作。
输入、输出、有穷性、确定性、可行性
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况而确定T(n)的数量级。
时间复杂度,也就是算法的时间度量,表示岁问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
一般情况下,随着n的增大,T(n)增大最慢的方法是最优算法
用大写的O()来体现算法复杂度的记法,称为大O法。
如何推导时间复杂度:
1、常数阶:O(1)
2、线性阶:O(n)
关键在于分析循环结构内部情况,下面程序复杂度为O(n)
int i
for (i=0;i<n;i++)
{
//时间复杂度为O(1)的程序
}
3、对数阶:O(log n)
int count=1;
while(count<n)
{
count=count*2 //时间复杂度为O(1)的程序
}
由于每次count*2以后,就距离n更近了,也就是说有多少个2相乘后大于n,则会退出循环,
4、平方阶:O(n^2)
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
//时间复杂度为O(1)的程序
}
}
相当于循环了n*n次,时间复杂度为O(n^2),如果外部循环m次,时间复杂度为O(n^m)
总结:时间复杂度为循环体的复杂度乘以该循环运行次数
线性表(List):零个或多个数据元素的有限序列
元素之间是有顺序的:第一个元素无前驱,最后一个元素无后继,其他元素都有前驱和后继
线性表强调是有限的
数学表达:
顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素
线性表存储结构代码:
顺序存储结构的三个属性:
数据元素的序号和存放它的数组下标之间的对应关系:
第i+1个数据元素和第i个数据元素存储位置的关系:
第i个数据元素可以由a1推出:
线性表的存取时间性能为:O(1)
(1)获取元素
时间复杂度为
(2)插入
(3)删除
(4)时间复杂度
如果插入最后一个位置,或删除最后一个位置,时间复杂度为
如果插入第一个位置,或删除第一个元素,时间复杂度为
平均的情况:插入第i个位置,或删除第i个元素,需要移动n-i个元素,根据概率原理,每个位置插入或删除可概率是相同的,所以最终平均移动次数和最中间那个元素的移动次数相等为
总结:读取的时候,复杂度为
(5)线性表顺序存储结构的优缺点
链式结构:元素信息+后继元素的地址
结点Node:存储数据元素信息的域(数据域)+存储后继元素的地址的域(指针域)
单链表:每个结点只包含一个指针域的线性链表
头指针:链表第一个结点的存储位置
最后一个结点的后继不存在,即最后一个结点的指针为空(NULL)
头结点:第一个结点前设一个结点,可以不存储任何信息,也可以存储长度等附加信息
头结点与头指针的异同:
带有头结点的单链表:
空链表:
设p是指向线性表第i个元素的指针,节点ai的指针域可以用p->data来表示,p->data的值是一个数据元素,节点ai的指针域可以用p->next来表示,p->next的值是一个指针,指向第i+1个元素,也就是ai+1的指针。
也就是,p->data=ai,p->next->data=ai+1
1、读取
2、插入
不用改变其他结点,只需要让s->next和p->next的指针做一点改变即可
s->next=p->next;
p->next=s;
也就是让p的后继结点变为s的后继节点,再把s变为p的后继结点
3、删除
q=p->next;
p->next=q->next;
也就是让p的后继的后继结点,改为p的后继结点。
4、对比
用数组描述的链表叫做静态链表
数组的元素=两个数据域组成(数据域data+游标cur)
数组的第一个和最后一个元素作为特殊处理单元,不存数据
单链表的终端结点的指针端原本为空指针,之后改为指向头结点,使整个单链表形成一个环,称为单循环链表,简称循环链表。
解决的问题:可以从当前一个结点出发,访问到列表的全部结点
在单链表的每个结点中,再设置一个指向前驱结点的指针域,所有每个结点都有两个指针域,一个指向后继,一个指向前驱。
栈是限定仅在表尾进行插入和删除操作的线性表
队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表
栈是限定仅在表尾进行插入和删除操作的线性表
栈顶:允许插入和删除的一端
栈底:不允许任何操作
规则:先进后出(线性表)
进栈:插入
出栈:删除
进栈:插入,push
出栈:删除(弹栈),pop
队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表
队列是一种先进先出的线性表(First in first out)的线性表,FIFO。
队尾:允许插入的一端
对头:允许删除的一端
由零个或多个字符组成的有限序列,又叫字符串
树是n个结点的有限集,n=0时,称为空树,在任意一颗非空树中:
树的结点包含一个数据元素及若干个指向其子树的分支,结点拥有的子树数量称为结点的度。
结点的分类:
树的度:树内各个结点的度的最大值
上图的树的度为3
结点间的关系:
结点的子树的根称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子称为兄弟,结点的祖先是从根节点到该结点所经分支上的所有结点。
结点的层次:
层次(Level)从根开始定义,树中结点的最大层次称为树的深度(Depth)或高度。
有序树:树中结点的各个子树看成是从左至右有次序的,不能互换
无序树:可以互换
二叉树(Binary tree)是n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两颗互不相交、分别称为根节点的左子树和右子树的二叉树组成。
二叉树的特点:
二叉树的五种形态:
1、斜树
所有结点都只有左子树的二叉树叫左斜树
所有结点都只有右子树的二叉树叫右斜树
2、满二叉树
所有分支节点都存在左子树和右子树,并且所有叶子都在同一层上的二叉树。
3、完全二叉树
对一棵有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的蛮二叉树中编号为i的节点在二叉树中的位置完全相同,则成全完全二叉树。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
完全二叉树特点:
1、在二叉树的第i层,至多有
2、深度为k的二叉树最多有
原文链接:https://blog.csdn.net/jiaoyangwm/article/details/80808235
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!