网站开发制作培训学校,电子游戏十大正规官方网址,石家庄是哪个省,商贸有限公司是干嘛的一、常见的数据结构
数组#xff0c;栈#xff0c;队列#xff0c;链表#xff0c;散列表#xff0c;二叉树#xff0c;堆#xff0c;跳表#xff0c;图#xff0c;树。
1. 数组#xff1a;
数组的元素在内存中存储是连续存放的#xff0c;占有连续的存储单元栈队列链表散列表二叉树堆跳表图树。
1. 数组
数组的元素在内存中存储是连续存放的占有连续的存储单元连续的内存空间且容量固定定容只能存储一种类型的数据添加、删除操作慢因为要移动其他元素提供随机访问但插入删除操作慢。
访问的时间复杂度O1
插入/删除的时间复杂度On。
2. 栈
后进先出栈顶入栈栈顶出栈。栈常应用于实现递归功能方面的场景如斐波那契数列。
栈常由一维数组或链表表示分别叫做顺序栈和链式栈。
不同的出栈排列个数 常用的操作有入栈push出栈pop。
访问的时间复杂度On最坏
插入/删除的时间复杂度O1。 应用浏览器的倒退和前进检查符号是否成对出现如果是左括号就直接push到stack中否则将stack的栈顶元素与该括号做比较不相等就直接返回false翻转字符串维护函数调用等。 3. 队列
先进先出在多线程阻塞队列管理中非常适用。
队列用数组或链表实现分别叫做顺序队列和链式队列。
访问的时间复杂度On最坏
插入/删除的时间复杂度O1。 单队列顺序队列由数组实现会出现假溢出现象和链式队列。 循环队列解决假溢出和越界问题。循环队列判断队满的常用方法是①设置flag标志位②使用一个空闲位。 双端队列元素可以从队头出队和入队也可以从队尾出队和入队。 优先队列由堆实现。 ***循环队列中元素个数求法rear-frontm % m取余 其中rear队列尾指针front队列头指针m队列容量。
***循环队列中区分队空和队满的方法
1牺牲一个存储单元入队时少用一个队列单元
队满条件q.rear1%maxsize q.front
队空条件q.front q.rear
2增设表示元素个数的数据成员
队满条件q.size MaxSize
队空条件q.front q.rear
3增设tag数据成员
队满条件tag 1
队空条件tag 0
4.链表
物理存储单元上非连续的非顺序的存储结构每个元素包含两个节点数据域和指针域不需要初始化容量可以任意加减元素只需要改变前后2个元素节点的指针域指向地址即可。 ***如何判断链表是否有环 1穷举遍历设一个检测指针k和一个遍历指针qcount记录q走的步数q每走一步k就走q之前走过的节点若发现相同的节点就说明有环。qNULL时遍历完整个链表。时间复杂度是O(n^2)空间复杂度是O(1)。 2标记法设置一个标记变量每走一个节点就判断一次若visittrue则有环反之无环。时间复杂度是O(n)空间复杂度是O(n)。 5. 散列表哈希表
根据键key而直接访问在内存存储位置的数据结构。哈希表建立了关键字和存储地址之间的一种直接映射关系。
构造方法
1直接定址法直接取关键字的某个线性函数为哈希地址。
2除留余数法假定哈希表长度为m取一个不大于m但最接近于/等于m的质数P利用公式H(key)key%P将关键字转化为哈希地址。
3数据分析法设关键字是r进制数选取数码分布较为均匀的若干位作为哈希地址。
4平方取中法取关键字的平方值的中间几位作为哈希地址。
哈希冲突的解决方法
1开放寻址法线性探查法平方探查法双重散列探查法伪随机探查法。
2拉链法链地址法
3再哈希法 6. 非线性数据结构——图
图的存储使用①邻接矩阵二维矩阵如A[i][j]n权值或者A[i][j]0/1无线图的邻接矩阵是对称矩阵。邻接矩阵比较浪费空间。
②邻接表如下图所示在无向图中邻接表元素的个数边的条数*2在有向图中邻接表元素的个数边的条数。 7. 非线性数据结构——堆
堆不一定是完全二叉树任意一个节点的值都 ≥或≤所有子节点的值堆通常用数组表示。
堆的插入和删除效率高时间复杂度是Ologn初始化的时间复杂度是On。 ***若根节点的序号为1那么树中任意节点 i其左子节点序号为 2i右子节点为 2i1。 ①自底向上堆化会产生“气泡”浪费存储空间用于插入元素即先将元素放至数组末尾上浮。 ②自顶向下堆化用于删除堆顶元素将末尾元素放至堆顶再向下堆化下沉。 根的下标一定为0最后一个元素的下标一定为size-1. 已知一个节点下标为index那么他的双亲下标为index-1/2左孩子的下标为2*index1右孩子的下标为左孩子下标1。 8. 非线性数据结构——树
n个节点n-1条边。 高度该节点到叶子节点的最长路径所包含的边数。 深度根节点到该节点的路径所包含的边数。 层数节点的深度1。 二叉树链式存储或顺序存储第 i 层至多有 2^i-1 个节点深度为k的二叉树至多共有 2^(k1)-1 个节点满二叉树至少共有 2^k 个节点。
完全二叉树除最后一层外若其余层都是满的并且最后一层或者是满的或者是在右边缺少连续若干节点则这个二叉树就是 完全二叉树 。
平衡二叉树空或者左右子树的高度差绝对值不超过1且左右子树都是一颗平衡二叉树。平衡二叉树的常用实现方法有 红黑树、AVL 树、替罪羊树、加权平衡树、伸展树 等。
红黑树每个节点非红即黑根节点是黑色节点叶节点都是黑色的空节点。
二叉树的存储主要分为 链式存储 和 顺序存储 两种
1链式存储和链表类似二叉树的链式存储依靠指针将各个节点串联起来不需要连续的存储空间。
每个节点包括三个属性
数据 data。data 不一定是单一的数据根据不同情况可以是多个具有不同类型的数据。左节点指针 left右节点指针 right。 2 顺序存储利用数组进行存储数组中的每一个位置仅存储节点的 data不存储左右子节点的指针子节点的索引通过数组下标完成。根结点的序号为 1对于每个节点 Node假设它存储在数组中下标为 i 的位置那么它的左子节点就存储在 2i 的位置它的右子节点存储在下标为 2i1 的位置。如 树的存储方式图片来自树 | JavaGuide(Java面试 学习指南)
二叉树的遍历
1先序遍历根左右2中序遍历左根右3后序遍历左右根。
注由先序序列和后序序列不能重现一颗二叉树。先序、后序、层序序列的两两组合无法唯一确定一棵二叉树。
可以通过①先序中序②后序中序或者③层序中序 序列构造一颗二叉树。
二、常用算法
递归排序二分查找搜索哈希算法分治算法动态规划字符串匹配算法等。