数据结构与算法基础概念总结
2017-05-11 21:08
225 查看
线性结构—–线性表
定义
具有相同数据类型数据元素的有限序列顺序表
逻辑上相邻的元素物理位置上也相邻,即数组链式表
逻辑上相邻的元素物理位置上不一定相邻,节点包含数据域和指针域,指针域指向后继节点。有单向链表,双向链表,循环链表。顺序与链式比较
名称 | 存取方式 | 逻辑/物理结构 | 增删 | 查 | 空间分配 | 场景选择 |
---|---|---|---|---|---|---|
顺序表 | 顺序/随机存取 | 逻辑物理均相邻 | 平均需要移动半个表的数据,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/19996299http://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相关文章推荐
- 数据结构与算法基础概念总结
- 数据结构与算法基础概念总结
- 数据结构与算法基础概念总结
- 数据结构与算法基础概念总结
- 数据结构与算法基础概念总结
- 关于一些基础概念的复习和总结
- Java基础概念总结
- J2EE基础概念总结(转载)
- JVM基础概念总结:数据类型、堆与栈
- 一些基础概念的总结。。。。
- Apache Pig的一些基础概念及用法总结4(转)
- SQLServer事务与锁的基础概念总结
- D3D学习总结基础篇(二)--从古墓丽影的画面设置了解基础概念
- JVM基础概念总结:数据类型、堆与栈
- Apache Pig的一些基础概念及用法总结(转)
- Apache Pig的一些基础概念及用法总结2(转)
- J2EE基础--对象的概念总结(POJO,DTO,DAO)
- IPV4一些基础概念的总结
- JVM基础概念总结:数据类型、堆与栈
- linux设备驱动归纳总结(一):内核驱动的相关基础概念