一、时间复杂度&空间复杂度
时间复杂度
时间复杂度不计算时间,计算的是大概的运算次数。 算法的执行时间与原操的执行次数之和成正比
空间复杂度
空间复杂度不计算空间,计算的是大概定义的变量个数。
二、逻辑结构与物理结构
逻辑结构
逻辑结构是指数据对象中数据元素之间的相互关系,是人为了方便运用想象出来的模型。
集合——各个元素之间是“平等”的,类似于数学里面的集合
线性结构——数据结构中的数据元素是一对一关系的
树性结构——数据结构中的数据元素之间存在一对多的层次关系
图形结构——数据结构中的数据元素之间存在多对多的关系
物理结构
物理结构指数据的逻辑结构在计算机中的存储形式,是数据在计算机实实在在的存储方式。
顺序存储结构 ——把数据元素存放在地址连续的存储单元中,其数据间的逻辑关系和物理关系是一致的。
链式存储结构 ——把数据元素存放在任意的存储单元中,这组存储单元可以是连续的,也可以是不连续的。通过指针来找下一个数据元素的地址。
索引存储结构 ——B+ 树
散列存储结构——哈希存储
优缺点:
重点:链表存储结构和顺序存储结构的区别?
顺序存储结构:是以数据元素的相对物理位置来表示数据元素之间的逻辑关系的
链表存储结构 :以指针指向来表示数据元素之间的逻辑关系。
三、常见的数据结构
数组 —————— 一维数组、二维数组
链表 —————— 单链表、循环链表
栈 —————— 先进后出、递归、后缀表达式、函数调用
队列 —————— 先进先出、树的层次遍历、图的广度遍历
树 —————— 二叉树、森林、平衡二叉树、线索二叉树、遍历
图 —————— 有向图、无向图、最小二叉树、遍历、最短路径
数组和链表的区别
数组的静态分配事先定义长度,不能适应数据动态地增减,链表动态地进行存储分配,可以适应数据动态地增减
数组快速访问数据元素,插入删除不方便;链表查找访问数据不方便,插入删除数据发布
头指针和头结点的区别
头指针是指在第一个结点之前的指针,它是一个链表存在的标志,是必须存在必不可少的。
头结点是第一个结点之前的结点,它是为了方面在第一个结点之前进行元素的插入和删除操作,它不是必需的,并且数据域也可以不存放信息。
四、受限线性表/特殊线性表(栈、队列、串)
队列:
队列就像我们平时排队一样,按照数据到达的顺序进行排队,每次新插入的一个结点排在队尾,删除一个结点只能从头才能出队。简言之,对元素的到达顺序,按照“先进先出”的原则。
栈:
栈的特点正好与队列相反,按照数据进栈的逆序出栈,即“先进后出”,每次入栈将元素放在栈顶,出栈时也只能从栈顶出栈,与队列类似,一般用定长数组存储栈元素,而不是动态的申请结点空间。进栈一般被叫做压栈,出栈被叫做弹栈。
串:
串是特殊线性表,限制数据元素为字符,并且串的操作和线性表有较大差别,线性表操作大多以数据元素为操作对象,而串大多以串的整体或模式串作为操作对象。
串的模式匹配
串的模式匹配指子串在主串中的位置,包括暴力匹配算法和KMP算法。
暴力匹配算法:从主串的第一个字符开始,与子串的第一个字符比较,一旦出现不匹配的字符,则主串往后移动一个位置,子串移动子串的第一个位置,并与主串对齐
KMP算法
KMP算法是在简单模式匹配的基础上对串的模式匹配进行优化。
主要的思路是每趟比较过程中让子串先滑动到一个合适的位置。
当发生不匹配时,不同于简单模式匹配的右移一位,而是移动到适合的位置。
这里所移动的位置依靠与NEXT[]数组,求next[]数组的方法是比较前后缀相同元素。
补充:两个栈实现队列
入队:把全部元素入栈1,出栈1压入栈2,实现与队列相同的顺序。
出队:在栈2 中以此出队即可。
插入新的元素:不应该在栈2内还有元素时,将栈1中插入的元素入栈,而是等栈2所有元素都出队后,再将栈1 中的元素压入栈2。
五、树
对于树这种数据结构而言,最显著的特点就是有且只能有一个根节点(空树除外),每个节点可以有多个子结点,除了根结点,其他结点只能有一个父结点。树的种类繁多,一般谈论的最多的是二叉树,每个结点有不超过两个的子结点。
二叉树&度为2的树
二叉树的特点:
1、每个结点最多有两颗子树,结点的度最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。
4、二叉树可以是空树、只有一个根结点、根结点只有左子树、根结点只有右子树、根结点左右子树都有。
度为2 的树:树的结点的最大的度为2.
平衡二叉树 & 二叉排序树
二叉排序树(Binary Search Tree,BST,也叫二叉搜索树),构造一棵二叉排序树也很简单,大于根节点的放在根节点的右子树上,小于根结点的放在根结点的左子树上(等于根结点的视情况而定)。如果写程序的话,可以采用递归的方式,而且由于不存在重叠子问题的情况,因此递归的性能已经足够好(不考虑栈溢出的情况)。
二叉排序树在通常情况下可以达到O(lgn)的静态、动态操作的时间复杂度,但是存在一种特殊情况,若输入的本来就是有序的,这时二叉树就退化成了链表。为了消除二叉树对于输入的敏感特性,引入了平衡二叉树(AVL),事实上平衡二叉树应该叫平衡二叉排序树也合理。平衡二叉树只要保证每个节点左子树和右子树的高度差小于等于1就可以了。
哈夫曼树
树的带权路径长度最小的二叉树,也称最优二叉树。
B树 & B+树
https://blog.csdn.net/qq_40599849/article/details/123386603?spm=1001.2014.3001.5501
红黑树
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树相比于BST和AVL树有什么优点?
红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。
相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。
红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高,所以在插入和删除中所做的后期维护操作肯定会比红黑树要耗时好多,但是他们的查找效率都是O(logN),所以红黑树应用还是高于AVL树的. 实际上插入 AVL 树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用 AVL树(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则红黑树是比较快的