算法与数据结构基础

算法与数据结构基础

数组
数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get和set操作时间上都是O(1)的;缺点是:add和remove操作时间上都是O(N)的。

链表
链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。

队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。


栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。

集合
集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

散列表
散列表也叫哈希表,是根据关键键值(Keyvalue)进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数。


树(tree)是包含n(n>0)个节点的有穷集合,其中:每个元素称为节点(node);有一个特定的节点被称为根节点或树根(root)。除根节点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。

二叉树
二叉树是一种基础而且重要的数据结构,其每个结点至多只有二棵子树,二叉树有左右子树之分,第i层至多有2^(i-1)
个结点(i从1开始);深度为k的二叉树至多有2^(k-1)个结点,对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。

满二叉树、完全二叉树
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点;
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树;
满二叉树是完全二叉树的一个特例。

二叉查找树
二叉查找树,又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 左、右子树也分别为二叉排序树;
  • 没有键值相等的节点。

二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。
二叉查找树的时间复杂度:它和二分查找一样,插入和查找的时间复杂度均为O(log2n),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡二叉树设计的初衷。

平衡二叉树
平衡二叉树又被称为AVL树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。它的出现就是解决二叉查找树不平衡导致查找效率退化为线性的问题,因为在删除和插入之时会维护树的平衡,使得查找时间保持在O(log2n),比二叉查找树更稳定。


堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定。

算法的基本概念

1、算法
是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。(算法(algorithm)就是解决特定问题的方法。描述一个算法可以采用文字叙述,也可以采用传统流程图、N-S图或PAD图等,但要在计算机上实现,则最终必须采用一种语言编写为程序)

2、算法的基本特征
1)确定性,算法中每一步骤都必须有明确定义,不允许有多义性;
2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止;
3)可行性,算法原则上能够精确地执行;
4)拥有足够的情报。
(输入:一个算法可以有0个、1个或多个输入量,在算法被执行之前提供给算法。
输出:一个算法执行结束后至少要有一个输出量,它是利用算法对输入量进行运算和处理的结果。)

3、算法的组成要素
一个算法由数据对象的运算和操作以及其控制结构这两部分组成。

4、算法的基本运算和操作
算术运算,逻辑运算,关系运算,数据传输。

5、算法的基本控制结构
顺序,选择,循环。

6、算法基本设计方法
列举法、归纳法、递推、递归、减半递推技术。
算法复杂度的概念和意义(时间复杂度与空间复杂度)

算法效率的度量——算法的复杂度:时间复杂度和空间复杂度。
1)算法时间复杂度:指执行算法所需要的计算工作量。通常,一个算法所用的时间包括编译时间和运行时间。
2)算法空间复杂度:指执行这个算法所需要的内存空间。包括算法程序所占的空间,输入的初始数据所占的空间,算法执行过程中所需的额外空间。
空间复杂度和时间复杂度并不相关。

数据结构的定义
数据:数据是客观事物的符号表示,是能输入到计算机中并被计算程序识别和处理的符号的总称,如文档,声音,视频等。
数据元素:数据元素是数据的基本单位。
数据对象:数据对象是性质相同的数据元素的集合。
数据结构:是指由某一数据对象中所有数据成员之间的关系组成的集合。

数据的逻辑结构与存储结构
1、数据结构可分为数据的逻辑结构和存储结构
1)数据的逻辑结构是对数据元素之间的逻辑关系的描述,与数据的存储无关,是面向问题的,是独立于计算机的。它包括数据对象和数据对象之间的关系。
2)数据的存储结构也称为数据的物理结构,是数据在计算机中的存放的方式,是面向计算机的,它包括数据元素的存储方式和关系的存储方式。

2、存储结构和逻辑结构的关系
一种数据的逻辑结构可以表示成多种存储结构即数据的逻辑结构和存储结构不一定一一对应。

3、常见的存储结构有
顺序,链接,索引等。采用不同的存储结构其数据处理的效率是不同的。

数据结构的图形表示
⑴集合结构:该结构的数据元素间的关系是“属于同一个集合”。
⑵线性结构:该结构的数据元素之间存在着一对一的关系。
⑶树型结构:该结构的数据元素之间存在着一对多的关系。
⑷图形结构:该结构的数据元素之间存在着多对多的关系,也称网状结构。

线性结构与非线性结构的概念。
1、线性结构的条件(一个非空数据结构):
(1)有且只有一个根结点;
(2)每一个结点最多有一个前件,也最多有一个后件。
2、非线性结构:不满足线性结构条件的数据结构。(树形结构和图形结构统称为非线性结构)

栈、队列、双向链表是线性结构,树、二叉树为非线性结构。

线性表的定义;线性表的顺序存储结构及其插入与删除运算。
1、线性表是由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。

2、在复杂线性表中,由若干项数据元素组成的数据元素称为记录;由多个记录构成的线性表称为文件。

3、非空线性表的结构特征:
(1)有且只有一个根结点a1,它无前件;
(2)有且只有一个终端结点an,它无后件;
(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
结点个数n称为线性表的长度,当n=0时,称为空表。

4、线性表的顺序存储结构具有以下两个基本特点:
(1)线性表中所有元素所占的存储空间是连续的;
(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)*k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。

5、顺序表的运算:查找、插入、删除。

线性表的顺序存储结构是随机存取的存储结构,线性表的链式存储结构是顺序存取的存储结构。

线性链表
线性链表是线性表的链式存储结构,数据结构中的每一个结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。结点由两部分组成:(1) 用于存储数据元素值,称为数据域;(2) 用于存放指针,称为指针域,用于指向前一个或后一个结点。
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。

链式存储方式既可用于表示线性结构,也可用于表示非线性结构。

线性单链表中,HEAD称为头指针,HEAD=NULL(或0)称为空表。
在这里插入图片描述
双向链表有两个指针:左指针(Llink)指向前件结点,右指针(Rlink)指向后件结点。(D是数值域(data))
在这里插入图片描述
循环链表:循环链表与单链表的不同的是它的最后一个结点的指针域存放的是指向第一个结点的指针而单链表存放的是空指针。
在这里插入图片描述
线性链表的基本运算:查找、插入、删除。

堆是一棵完全二叉树(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边),定义为:具有n个元素的序列(h1,h2,…hn),当且仅当满足(hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,…,n/2)时称之为堆。

大顶堆
堆顶元素(即第一个元素)为最大项,并且(hi>=h2i,hi>=h2i+1)

小顶堆
堆顶元素为最小项,并且(hi<=h2i,hi<=2i+1)

堆和栈的区别
堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

堆中内存需要手动申请和手动释放,栈中内存由OS自动申请,自动释放,存放着参数局部变量等内存。

堆中频繁调动malloc和free,会产生内存碎片,降低程序效率。栈采用先进后出原则,不会产生内存碎片。

堆的分配效率较低,栈的分配效率较高。

栈的效率更高的原因:
栈是操作系统提供的数据结构,计算机底层对栈提供了一系列支持:分配专门的寄存器存储栈的地址,压栈和入栈有专门的指令执行;而堆是由c/c++函数库提供的,需要一些列来分配内存合并内存和释放内存的算法,因此效率较低。

1、栈的基本概念
栈是一种特殊的线性表,只允许在表的一端进行插入和删除的线性表;插入,删除的一端为栈顶,另一端为栈底;当表中没有元素时为空栈。
栈是一种后进先出(或先进后出Last In First Out)的线性表。栈具有记忆功能。栈的实例:火车调度,子弹夹。

2、栈的存储结构
顺序存储结构:用一组地址连续的存储单元即一维数组来存储;
链式存储:用线性链表来存储;

3、栈的基本运算
(1) 入栈运算,在栈顶位置插入元素;
(2) 退栈运算,删除元素(取出栈顶元素并赋给一个指定的变量);
(3) 读栈顶元素,将栈顶元素赋给一个指定的变量,此时指针无变化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

队列

1.队列的基本概念
队列是一种特殊的线性表,只允许在表的一端插入,在另一端删除,允许插入的一端是队尾(rear),允许删除的一端为队头(front);当表中没有元素是空队列;队列是一种先进先出的线性表。(FIFO)

2、队列的存储结构
顺序存储:一维数组。
链式存储:线性链表。

3、队列的运算:
(1) 入队运算:从队尾插入一个元素;
(2) 退队运算:从队头删除一个元素。

4、队列的顺序存储结构一般采用循环队列的形式。循环队列s=0表示队列为空;s=1且front=rear表示队满。

5、计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。(队列长度(元素个数)=(N+rear-front)%N)

树的基本概念

  • 树是一种非线性结构,是n个结点的有限集。当n=0 时为空树,n>0时为非空树。
  • 结点的度:结点所拥有的子树的个数。
  • 叶子结点:度为0的结点。
  • 分支结点:除叶子结点以外的结点。
  • 结点的层次:根结点在第一层,同一层上左右结点的子结点在下一层。
  • 树的深度:所处层次最大的那个结点的层次。
  • 树的度:树中所有结点的度的最大值。

二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。
二叉树及其基本性质
1、二叉树的概念
二叉树是一种特殊的树形结构,每个结点最多只有两棵子树,且有左右之分不能互换,因此,二叉树有五种不同的形态。

2、二叉树的性质
性质1:在二叉树的第k层上,最多有2^(k-1)(k≥1)个结点。
性质2:深度为m的二叉树最多有2 ^ m - 1个结点。
性质3:在任意一棵二叉树中,度为0的结点(叶子结点)总是比度为2的结点多一个。
性质4:具有n个结点的二叉树,其深度不小于[log2n]+1,其中[log2n]表示为log2n的整数部分。

满二叉树与完全二叉树
满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2^(k-1)个结点,且深度为m的满二叉树有2 ^ m-1个结点。
完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
满二叉树是完全二叉树,而完全二叉树一般不是满二叉树。

完全二叉树的性质
性质1: 具有n个结点的完全二叉树的深度为[log2n]+1。
性质2: 完全二叉树中度为1的结点数为0或1。
在这里插入图片描述
二叉树的遍历
1、前序遍历
先访问根结点、然后遍历左子树,最后遍历右子树;并且,在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。前序遍历图4可得:ABCDFHEG

2、中序遍历
先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。中序遍历图4可得:BAFHDCGE

3、后序遍历
先遍历左子树、然后遍历右子树,最后访问根结点;并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。后序遍历图4可得:BHFDGECA

前根左右、中左根右、后左右根

顺序查找
顺序查找是从表的一端开始,依次扫描表中的各个元素,并与所要查找的数进行比较。
在下列两种情况下也只能采用顺序查找:
(1)如果线性表为无序表,则不管是顺序存储结构还是链式存储结构,只能用顺序查找。
(2)即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。

二分查找
二分查找的条件
(1)用顺序存储结构
(2)线性表是有序表

对于长度为n的有序线性表,在最坏情况下,二分法查找只需比较log2n次,而顺序查找需要比较n次。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值