数据结构简述
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构简述相关的知识,希望对你有一定的参考价值。
数据结构概述
常用的数据结构有栈,队列,链表,二叉树,红黑树,散列表和位图。
数据结构 | 优点 | 缺点 |
---|---|---|
栈 | 顶部元素的插入和取出快 | 除了顶部数据,其他元素都很慢 |
队列 | 顶部和尾部的元素插入和取出快 | 其他元素都很慢 |
链表 | 插入、删除快速 | 查找慢 |
二叉树 | 插入、删除、查找都快 | 删除算法复杂 |
红黑树 | 插入、删除、查找都快 | 算法复杂 |
散列表 | 插入、删除、查找都快 | 数据散列,对存储空间浪费 |
位图 | 节省存储空间 | 不方便描述的复杂的数据关系 |
栈
栈(堆栈)Stack,允许在同端进行插入(Push)删除(Pop)的特殊线性表。有栈顶(Top),栈底(Bottom),栈顶进行浮动。栈中元素个数为0,为空栈。是先进后出(FILO)线性表。
什么叫线性表
一个线性表是n个数据元素的有限序列。一个数据元素可以是若干个数据项组成,此时的数据元素成为记录,含有大量记录的线性表叫做文件。
线性表的顺序表示指用一组连续的存储单元(逻辑相邻物理上一定相邻)依次存储线性表中的数据元素。
线性表的链式表示指用一组任意的存储单元(逻辑相邻物理上不一定相邻)存储线性表中的数据元素,
队列
队列是一种只允许在表的前端(队头)进行删除操作(出队)且在表的后端(队尾)进行插入操(入队)作的线性表。没有元素的队列空队列。是一种先进先出(FIFO)线性表。
链表
链表是由一系列节点组成的数据结构,节点在运行过程中可以动态生成。每个节点包含两个部分,存储数据的叫做数据域,存储其他节点地址的叫做指针域。由于链表的数据是随机存储的,插入的时间复杂度O(1),效率高于线性表和顺序表;链表查找一个节点需要遍历链表中所有的元素,时间复杂度O(n),而线性表和顺表中查找一个节点的时间复杂度O(log n)和O(1)。
顺序表是什么有哪些?
不同结构的插入和查找的时间复杂度的计算和区别。
单向链表
单向链表(单链表)的链接方向是单向的,访问要从头部开始顺序读取。
一个单向链表的节点分为两个部分,1是数据区,用来保存数据,2是指针区,用来存储下一个节点的地址。,最后一个节点的指针是null。
双向链表
双向链表的每个节点的指针域都有两个指针,分别指向其的直接后继和直接前驱节点。这样我们可以从两个方向访问和处理节点数据。
循环链表
表中最后一个节点的指针域指向头结点,整个链表形成一个环。单向的。
是否有双向循环和单向循环链表之分?
散列表
散列表(Hash Table)也叫做哈希表。是根据数据的关键码值(Key-Value)对数据进行存取的数据结构。散列表通过映射函数把关键码值映射到表中的一个位置来加快查找。这个映射函数叫散列函数,存放记录的数组叫作散列表。
-
常用构建散列函数
- 直接定址法:取关键字或关键字的某个线性函数值为散列地址,即h(key)=key或h(key)=a*key+b,其中a,b为常数。
- 平方取值:取关键字平方后的中间几位数为散列地址
- 折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为散列地址
- 除留余数法:取关键字被某个不大于散列表长度m的数p除后得的余数为散列地址。h(key)=key/p, (p<=m)。
- 随机数法:选择一个随机函数,取关键字的随机函数值作为其散列地址,即h(key)=random(key)。
- JAVA HashCode实现:f(key) = s[0]*31^n-1 + s[0]*31^n-1+…+s[n-1]。
java hashcode实现的详细扩展
二叉排序树
二叉排序树(Binary Sort Tree)又是二叉查找树、二叉搜索树(Binary Search Tree)。二叉排序树满足以下条件。
- 若左子树不空,则左子树上所有节点的值均为小于它的根节点的值;
- 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;
- 左、右子树也分别为二叉排序树。
缺少平衡树,最优二叉树
红黑树
红黑树是一种平衡二叉查找树。红黑树的每个节点上会多出一个存储位表示节点的颜色,颜色只能是红色或黑色。
如何判定节点是红色还是黑色
特性:
- 每个节点的或是黑色或是红色
- 根节点是黑色
- 每个叶子节点都是黑色
- 如果一个节点是红色,那么他的子节点必须是黑色
- 从一个节点到该节点的子孙节点的所有路径上都包含相同数量的黑色节点
左旋
对A节点进行左旋 就是将A节点的右子节点设为A的父节点,即将A节点变为一个左节点。
右旋
对A节点进行右旋 就是将A节点的左子节点设为A的父节点,即将A节点变为一个右节点。
还有B-树,B+树,B*树
专栏导航
队列(queue)
栈(Stack)
线性表(linear_list)
遍历二叉树 非递归 JAVA 实现
树、二叉树、满二叉树、完全二叉树、遍历二叉树java实现
最优二叉树(赫夫曼数)
其他专栏
以上是关于数据结构简述的主要内容,如果未能解决你的问题,请参考以下文章