您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法基础概念总结

2017-05-11 21:08 204 查看

线性结构—–线性表

定义

具有相同数据类型数据元素的有限序列

顺序表

逻辑上相邻的元素物理位置上也相邻,即数组

链式表

逻辑上相邻的元素物理位置上不一定相邻,节点包含数据域和指针域,指针域指向后继节点。有单向链表,双向链表,循环链表。

顺序与链式比较

名称存取方式逻辑/物理结构增删空间分配场景选择
顺序表顺序/随机存取逻辑物理均相邻平均需要移动半个表的数据,O(N)按值查找:无序O(N),有序二分查找O(logN);按索引查找:O(1)固定空间分配固定空间,随机访问场景
链式表顺序存取逻辑物理不一定相邻修改指针域即可,O(1),不过在链表中间插入或者删除需要先查找到相应元素,算上这部分时间就是O(N)顺序访问O(N)按需分配不确定空间分配,插入/删除操作较多的场景(虽然有查找的时间,但是比较操作相对顺序表的移动操作更廉价)

操作受限的线性表

只允许在一端进行插入和删除操作的线性表,FILO,顺序栈,链式栈

队列

只允许在一端插入,而在另一端删除的线性表,FIFO

顺序存储:顺序队列、循环队列

链式存储:单链表队列、双端队列(双入双出,双入单出,单入双出)

非线性结构—–树

树的定义

图定义:树是无简单回路的有向连通图。

递归定义:树由根节点r和子树组成,每个子树的根节点都被来自r的边所连接

路径、路径长、深度、高度、度

从节点n1到nk的路径定义为n1,n2…nk这个节点序列,路径长为节点序列中边的条数。

深度和高度是基于路径的概念来定义的:节点n的深度为从根节点到n的唯一路径的长。节点n的高度定义为从节点n到一个叶子节点的最长路径的长。

节点的度:某节点孩子节点的个数

二叉树

定义

二叉树是每个节点都拥有不超过两个儿子的树。

遍历

先序遍历:先根后左右儿子

中序遍历:先左儿子,再根,再右儿子

后序遍历:先左右儿子,再根

层序遍历:先根,再根的左右儿子根节点…需要借助队列

复原

由先序序列和中序序列,后序序列和中序序列可以唯一的确定一棵二叉树,之所以都需要中序序列,是因为先序和后序只能确定根节点,而中序序列根据根节点的位置可以确定左右子树。

满二叉树

树高度为h,含有2^h - 1个节点的二叉树,树中每一层都含有最多的节点。

完全二叉树

从插入元素的角度来说,完全二叉树就是按层序从上到下,从左往后插满每个节点,最后一层可以不插满

二叉查找树

一棵二叉树,其左子二叉树上的所有节点值都小于根节点,右子二叉树上的所有节点值都大于根节点。

二叉平衡树

二叉树上任一节点的左子树和右子树的深度之差不超过1

B树

多路平衡查找树,m阶B树需要满足以下特性:

根节点:至少有两棵子树

中间节点(非根非叶节点):子树数目要求大于等于(m/2)(向上取整),小于等于m

叶结点:所有叶结点都在同一层次上

表达式树相关

叶子节点存操作数,非叶子节点存操作符。

表达式树的中序遍历得中缀表达式,后序遍历得后缀表达式。

中缀表达式转后缀表达式:借助栈。读取中缀表达式,遇到操作数直接输出,遇到操作符即准备入栈,入栈前先比较栈顶操作符与当前操作符的优先级,如果栈顶优先级高或者平级,输出直至低优先级,然后再入栈。对于括号:左括号具有最高优先级,括号内的操作符出入栈跟之前一样,遇到右括号将操作符依次出栈直到左括号。注:括号不输出。

后缀表达式求值:借助栈。读取后缀表达式,操作数直接入栈,遇到操作符弹出两个操作数进行计算,结果入栈,继续读取…以此类推,直至结束

后缀表达式构建表达式树:借助栈。操作数作为单节点入栈,遇到操作符,以操作符作为根节点,弹出两个操作数作为右、左儿子,最后将操作符节点入栈…以此类推,直至结束

散列表

键值对的集合,通过散列函数计算键对应的值的存放位置,之后可以通过键直接访问值。

散列函数

将关键字映射到相应位置的函数。如果两个不同的key值,经散列后位置相同,这种情况称为冲突或者碰撞。

每次对散列表的操作,都需要经过散列函数,散列函数的选择应该简单以节省时间、散列均匀以避免碰撞。

装填因子

散列表中元素的个数与该表大小的比值。

碰撞处理

分离连接法

将同一个散列值的不同元素保存在同一个链表里,并将后进入的元素放在链表的前端。

开放定址法

出现碰撞以后,用新的函数继续找位置,直到找到空的位置为止

- 线性探测:线性函数查找,会出现一次聚集

- 平方探测:二次函数查找,会出现二次聚集

再散列(扩容)

当散列表中元素的数量达到装填因子时,新建一个大的散列表,将原散列表中的元素重新计算散列值并放入新的散列表中

尾递归

https://www.zhihu.com/question/20761771/answer/19996299

http://stackoverflow.com/questions/33923/what-is-tail-recursion

http://www.cnblogs.com/Anker/archive/2013/03/04/2943498.html

广义表

http://blog.csdn.net/fanzheng220112583/article/details/7719228
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法 递归