数据结构概述java.docx
《数据结构概述java.docx》由会员分享,可在线阅读,更多相关《数据结构概述java.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构概述java
数据结构中常用的概念和术语
●数据
●数据元素
●数据对象
数据:
数据元素:
例如:
一次所有学生考试成绩当做一个数据,那么这次考试成绩当中一个学生的考试成绩是一个数据元素。
数据元素又由若干数据项组成。
数据项:
数据项是数据的最小单位,具有原子性,不可分割。
数据、数据元素和数据项它们是三级关系。
数据对象:
数据对象是具有相同特征的数据元素的集合,它是数据的子集。
数据元素是数据的子集,数据对象也是数据的子集。
什么是数据结构
数据结构是计算机存储、组织数据的方式。
它描述了数据元素之间的相互关系,以及数据元素的组织形式。
●逻辑结构
●存储结构
●数据运算
逻辑结构:
数据的逻辑结构是指从逻辑关系上描述数据,与数据的存储无关,且独立于语言。
存储结构:
数据的存储结构是指数据元素及其关系在计算机存储时如何表示,依赖与语言。
每个学生的成绩信息存储在计算机中,一个结构数组的一个数组元素中。
因此数据在计算机的存储方式就是存储结构。
数据运算:
数据运算通常定义在数据的逻辑结构上,每种逻辑结构都有一个运算的集合,但运算的具体实现要在存储结构上进行。
增加操作的定义就是我们把新增加这一条记录作为新的终端节点,原来的终端节点成为新增这一条学生记录的前趋节点。
新增的学生记录成为原来最后一个学号的后继节点这就是增加的操作定义。
深入学习数据逻辑结构
数据的逻辑结构按照数据元素之间的相互关系,又可以分为线性结构和非线性结构
线性结构:
线性结构指有且仅有一个开始结点和一个终结点,
所有结点最多只有一个直接前驱和一个直接后继。
例如:
线性结构
非线性结构:
非线性结构指一个节点可能有多个直接前驱和直接后继。
例如:
图这样的形式称之为闭合树。
算法和算法分析
算法:
为求解一个问题需要遵循的、被清晰的指定的简单指令的集合。
算法通常以某一个数据集合作为输入,执行完一组特定的指令之后,返回一个唯一的数据集合作为输出。
正确的算法特点:
第一、用待处理问题的相关信息作为输入数据
第二、对一个既定的合法输入,多次执行同一个算法总是返回同一个结果(随即算法除外)
第三、算法中的指令是可行的,既每个指令都可以实现,并且在有限的时间内完成。
第四、算法中指令的数量是有限的,既在有限的时间内,算法可以正确结束,不能无限循环下去。
第五、算法执行完毕后,能够输出正确的数据集合。
算法分析:
同一个问题可以用不同的算法来解决,算法的效率会影响程序的效率。
算法分析的目的在于选择合适的算法,算法分析是从复杂度来考虑的。
复杂度:
复杂度是衡量一个算法好坏的重要手段,分为时间复杂度和空间复杂度。
●时间复杂度
它以一个算法执行的时间长短来衡量一个算法的优劣。
如果问题规模是n,则时间复杂度是n的一个函数,记做T(n)=O(f(n)),结论就是:
算法的执行时间等于算法的循环次数乘以执行操作的时间
举例:
第一个时间复杂度为On
●空间复杂度
它以一个算法执行过程中所要占用的存储空间多少来衡量一个算法的优劣。
它也是问题规模n的一个函数,记做S(n)=O(f(n))
举例:
插入排序算法如果只插入了一个值额外消耗了一个存储空间。
因此空间复杂度就是O1
●复杂度越高,算法执行效率越低,算法也就越差。
线性表
线性表:
线性表是由n(n>=0)个数据元素(结点)组成的有限序列。
线性表中每个数据元素之间的关系是一对一的关系,也就是说在线性表中除了第一个和最后一个数据元素,其他的数据元素都是首尾相接的。
线性表的特点是:
●有且仅有一个开始结点
●有且仅有一个终结结点
●内部结点都有且仅有一个直接前驱结点和一个直接后继结点
均匀性是指虽然不同数据表的数据元素可以是各种各样的,但是对于同一线性表的各数据元素必定具有相同的数据类型。
有序性是指各数据元素在线性表中的位置只取决于它们的序列,数据元素之间的相对位置是线性的。
举例:
存储方式上分析线性表
线性表分为顺序存储和链式存储两种实现方式。
●顺序存储
计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素。
也称为向量存储,可以看做是一维数组存储。
数据元素在内存的物理存储次序与它在线性表中的逻辑次序相同。
举例:
由此可见顺序存储的特点是:
第一、使用连续的内存单元存放线性表的数据元素,它的内存单元是连续的。
第二、数据元素在内存中的物理存储次序与它们在线性表中的逻辑次序相同。
优点是存储密度大,位置连续,几乎不浪费空间。
缺点是插入、删除等运算都不方便。
线性表的视频演示
●选择排序
首先遍历线性表并将最小的元素与第一个元素进行交换,随后遍历剩余的元素将第二小的元素与第二个元素进行交换,依此类推直至排序结束。
举例:
选择排序的视频演示
●链式存储
链式存储用若干地址分散的存储单元存储数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻,必须采用附加信息表示数据元素之间的关系。
(即用指针体现结点之间的逻辑关系)它指向这个元素的后继结点的地址位置。
根据这个指针,我们才能完全遍历这个线性表。
Ø单链表
Ø循环链表
Ø双链表
单链表:
也叫线性链表,由一个个结点链接而成。
单链表的结点只有一个存放数据的数据域和一个称为next的指向后继结点的指针域
数据域存储结点的数据,指针域指向下一个结点的内存存储地址。
所以它不是闭环的,是一条链状结构。
举例:
单链表的逻辑结构
k1为头结点。
k2为k1的后继结点,依次类推。
单链表的存储结构
头指针:
它是一个指针,单链表第一个结点存储的位置,整个单链表的存储必须从头指针开始,通常用head表示。
空指针:
最后一个结点中的"指针"是一个特殊的值"NULL"(在图上用∧表示),通常称它为"空指针"。
单链表链式存储的视频演示
循环链表:
循环链表是线性表的另外一种链式存储结构,它在单链表的基础上,将表尾结点的指针域指向表头结点,整个链表形成环状结构。
举例:
双链表:
双链表是可以同时在向前和向后两个方向上查找数据元素的单链表。
它的结点除了数据域之外,还有previous和next两个指针域,分别指向直接前趋结点和直接后继结点。
举例:
链式存储顺序查找的视频演示
栈
中文解释是存储货物或供旅客住宿的房屋。
栈也叫堆栈,是一种限制只能在某一端进行插入和删除操作的线性表。
允许插入和删除的一端称为栈顶,相反,另外一端称为栈底。
存储在栈顶位置的数据元素称为栈顶元素,
存储在栈底位置的数据元素称为栈底元素。
不包含任何数据元素的栈称为空栈。
插入一般称为进栈,删除则称为退栈或出栈。
访问栈中的元素时,遵循后进先出(LIFO)的运算规则
举例:
push()方法用于向栈内压入值。
pop()方法用于弹出栈顶的值,即返回栈顶的值,并把它从栈内删除。
peek()方法用于查询栈顶的值,即只返回但不删除栈顶。
isEmpty()方法则用于判断这个栈是否为空栈。
size()方法返回栈的大小。
顺序栈:
栈的顺序存储结构简称顺序栈。
用一个top指针指示栈顶元素在顺序栈的位置。
顺序栈的特点:
1.数据元素存放在连续的存储地址中
2.栈底位置固定不变
3.栈顶位置随进栈、出栈操作而变化
顺序栈的操作视频演示
队列
队列也叫队,是允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
删除数据的一端叫做队头,插入数据的一端叫做队尾。
队列中没有任何数据元素就被称为空队列。
空队列的条件就是front=rear。
访问队列中的元素遵循先进先出的原则。
按照存储方式的不同顺序队列和链式队列
举例:
push()向队列队尾插入值
pop()弹出队列的对头的值,返回对头的值,并且把它从队列内删除。
peek()用于查询队列的对头的值,只返回但不删除对头。
isEmpty()判断队列是否为空队列。
size()返回队列的大小。
顺序队列:
队列的顺序存储结构称为顺序队列,顺序队列使用front和rear两个指针分别指示队头元素和队尾元素的位置。
顺序队列只能从front端删除元素,向队尾rear端添加新元素。
顺序队列是用一组地址连续的存储空间来存放队列中的数据元素的。
举例:
以上是从空队列到入队出队再变为空队列的过程。
顺队列的特点:
1.静态分配存储空间
2.入队操作只能在队尾,出对操作只能在队首。
3.队列为空时,front=rear
4.队列为满时,rear=队列长度-1
5.队列非空非满时,front链式队列:
队列的链式存储结构称为链式队列
每一个结点都有一个指针域next,指向它的后继结点。
其实就是
遵循队列操作规则的,
链式存储的线性表
链式队列的特点:
1.动态分配存储空间
2.入队操作在队尾进行,出队操作在对头进行
3.链式队列在入队时无队满问题
4.链式队列为空队列的条件:
front=rear
队列的操作视频演示
递归
是指在定义自身的过程中又直接或间接调用自身的一种算法。
递归必不可少的要素:
自身调用和递归终止条件
递归问题的特点:
一个问题可以被分解为若干简单的子问题
子问题和其上层问题的解决方案一致
外层问题的解决依赖于子问题的解决
德罗斯特效应(Drosteeffect)是递归的一种视觉形式,是指一张图片的某个部分与整张图片相同,如此产生无限循环。
举例:
普通计算n的阶乘
n*(n-1)!
递归实现n!
细分:
递归的工作方式:
一个对象函数调用自己的复制品,复制品再次复制出一个复制品继续调用,一直继续下去,直达遇到某个条件停止循环,然后逐层返回。
递归算法的视频演示
哈希表
哈希表(Hashtable,也叫散列表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。
圆圈部分为散列分布的关键字集合,以关键字k为自变量,通过一个确定的Hash方法来计算,Hash方法返回对应的值,值呢是一个存储单位的地址,指向了线性表T的索引。
从而可以确定一个数据元素。
关键字也叫键(key),Hash方法就是将关键字于该数据元素的存储地址建立对应关系的方法。
方格部分为地址
构建哈希表方法
哈希表的选择标准
●简单
●均匀
哈希表的常用方法
●直接寻址法
●数字分析法
●平方取中法
●折叠法
●出留余数法
直接寻址法:
取关键字的某个线性函数,来作为哈希地址的构造方法,其结果值作为哈希地址。
h(k)=a*key+b
数字分析法:
是取关键字中某些取值较分散的数字位作为哈希地址。
适用于所有关键字都已知的情况。
例如:
后面两位比较分散。
平方取中法:
是取关键字平方的中间几位作为哈希地址的方法。
举例:
关键字只留前面两位
,对其关键字进行平方操作,然后取平方后的数的中间分散的几位来作为哈希地址。
叠加法:
是首先将哈希表中的关键字分割成位数相等的几段,然后将他们叠加求和作为哈希地址的方法。
适用于关键字位数较多同时哈希地址的位数又较少而且每位关键字分散都比较集中的情况。
除留余数法:
h(key)=key%p(p为正整数)
要求p小于哈希表的长度,接近哈希表的长度。
处理冲突
冲突
两个不同的键,由于哈希方法返回的值相同,因而被映射到表的同一位置上。
一个好的哈希方法能减少冲突,但是不能彻底避免冲突,解决方法就是寻找下一个可用的地址来处理冲突。
解决办法
开放寻址法:
再哈希法:
链地址法:
哈希表的查找
假设哈希函数是:
H(key)=key%11
在关键16和27的位置插入值为b0和b1,根据哈希函数是有冲突的(都余5)
因此采用链地址法解决冲突:
例如查找关键字是27的值,找到了关键字是5的位置.
然后在循环这个链表,如果不为空(为空就查找失败)就继续循环这个链表。
总结: