数据结构简单笔记

2017-05-16  本文已影响49人  简简简简简书

数据结构

定义

我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,所对应元素进行排序)而执行的相应操作,这个相应的操作也叫算法。

数据结构是专门研究数据存储的问题。
数据的存储包含两方面:个体的存储和个体关系的存储。
算法是对存储数据的操作。

衡量算法的标准

线性结构

把所有的节点用一根线穿起来

数组(连续存储)

什么叫数组

元素类型相同,大小相等

数组的优缺点
优点:
存储元素的效率非常高

缺点:
事先必须知道数组的长度
需要大块连续的内存块
插入删除元素的效率很低

链表(离散存储)

定义

n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首届点没有前驱节点,未见点没有后续节点

确定一个链表需要几个参数

只需要头指针就可以推算出链表的其他所有参数

分类

算法

算法:狭义的算法是与数据的存储方式密切相关的
,广义的算法是与数据的存储方式无关

泛型:利用某种技术达到的效果就是不同的存储方式,执行的操作是一样的

链表的优缺点

优点:
空间没有限制
插入删除元素很快
缺点:
存储速度很慢

线性结构的两种常见应用----栈

定义

一种可以实现“先进后出”的存储结构,栈类似于箱子

分类

算法

应用

线性结构的两种常见应用----队列

定义

一种可以实现“先进先出”的存储结构

分类

静态队列通常都必须是循环队列

循环队列

1.静态队列威慑么必须是循环队列

当静态队列不断入队出队的时候,由于队列特性“先进先出”,头尾不断向前移动,导致队列中的地址只能使用一次(假溢出),所以引入循环队列。

2.循环队列需要几个参数确定

front和rear

1).队列初始化
frontrear的值都是零
2).队列非空
front代表的是队列的第一个元素
rear代表的是队列的最后一个有效元素的下一个元素
3).队列为空
frontrear的值相等,但不一定为零

3.循环队列入队伪算法

rear = (rear + 1) % 数组的长度

4.循环队列出队伪算法

front = (front + 1) % 数组的长度

5.循环队列是否为空

如果front和rear的值相等,队列一定为空

6.循环队列是否为满
(rear + 1) % 数组长度?=front

队列应用

所有和时间有关的操作都与队列有关

递归

定义

一个函数自己直接或间接调用自己

举例

递归满足的三个条件

递归与循环

递归:易于理解,速度慢,存储空间大
循环:不易于理解,速度快,存储空间小

递归的基本思想

某件规模为n的事情如果想完成,必须要你借助他n-1的规模完成。

定义

有且只有一个称为根的节点,有若干个互不相交的子树,这些子树本身也是树。
树是由节点和边组成,每个节点只有一个父节点但可以有多个子节点,但根节点没有父节点。

深度:从根节点到最底层节点的层数
叶子节点:没有子节点的节点
非终端节点:实际就是非叶子节点
度:子节点的个数

分类

一般的树:任意一个节点的子节点的个数都不受限制
二叉树:任意一个节点的子节点个数最多只有两个,且子节点的位置不可更改
森林:n个互不相交的树的集合

存储

二叉树存储:

连续存储:如果用数组的方式存储,必须要是完全二叉树

链式存储

一般二叉树的存储

一个普通的树转化成的二叉树一定没有右子树

森林的存储

操作

二叉树

分类

二叉树操作

遍历

  1. 先序遍历:

先访问根节点
再先序访问左子树
再先序访问右子树

  1. 中序遍历

中序访问左子树
再访问根节点
中序访问右子树

  1. 后序遍历

后序访问左子树
后序访问右子树
再访问根节点

已知两种遍历序列求原始二叉树

通过先序和中序或者中序和后续乐意还原出原始二叉树,但是通过先序和后续无法还原出原始的二叉树

应用

上一篇 下一篇

猜你喜欢

热点阅读