- 完全二叉树
空树是完全二叉树。
特点一:
只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现;
特点二:
对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1 即度为1的点只有1个或0个 - 满二叉树
空树不是满二叉树。
每个节点都存在左右孩子 并且左右子树深度要相同,满二叉树像正三角型。 - 数组和链表的区别:
数组(顺序结构)和链表(链式结构)都是线性结构。
但链表添加元素更快O(1)(不需要移动元素),但是查找元素需要遍历O(n)。数组在最后添加元素较慢O(n),但是查找元素较快O(1)(内存中连续存放,每个元素占用内存相同,直接通过下表可以访问)。
数组元素在栈区,链表元素在堆区。
数组在内存中连续,链表在内存中不连续。 - 堆区和栈区比较
栈区和堆区的区别:
1)申请方式: 栈区内存由系统自动分配,函数结束时释放;堆区内存由程序员自己申请,并指明大小,用户忘释放时,会造成内存泄露,不过进程结束时会由系统回收。
2)申请后系统的响应: 只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则将报异常提示栈溢出;堆区,空闲链表,分配与回收机制,会产生碎片问题(外部碎片)–>(固定分区存在内部碎片(分配大于实际),可变分区存在外部碎片(太碎无法分配))。
3)申请效率:栈由系统自动分配,速度较快,程序员无法控制;堆是由new分配的内存,一般速度较慢,而且容易导致内存碎片,但是用起来方便! - 哈希表(散列)和数组、链表的比较:
数组查找容易,但是添加和删除麻烦。
链表添加和删除容易,但是查找慢。
哈希表结合两者的特征:
一对一的查找效率很高。一个key对应一个链表时候查询效果较差。
另,哈希表用到数组,数组特点是创建后扩容难,必须先知道表中要存多少数据。 - hashmap,冲突解决方法:开放地址法、再hash、缓冲区、拉链法(常用)。
- bitmap,连续的内存,bit级别操作。
- 图,应用场景比如计算两地的机票价格,查询A 到B地铁路线图等,图分为有向图和无向图。图的实现方法:邻接矩阵(费空间,但是顶点较多且之间链接密集时候好用)、邻接表、逆邻接表、十字链表(是邻接表和逆邻接表的结合)。
- hashmap和hashtable ,hashmap的key不可以重复,hashtable的value不可以重复。hashmap手写。######待续
- hash树和字典树,搬运 ,话说谁搞了这么多变种。
哈希树的思想:质数3可以分辨3类结果。哈希树每层依次用质数2,3,5,7,11…来分辨,所以从2起的连续质数,连续10个质数就可以分辨大约M(10) =23571113171923*29= 6464693230 个数,已经超过计算机中常用整数(32bit)的表达范围 - 最小堆,维护完整流程。
最小堆的构建:先按照二叉树方法从头挂载节点,无需考虑数字大小,得到一颗完全二叉树。
最小堆的排序:深度优先,从最深的叶子开始排序(根节点要大于两个叶子节点,同根叶子节点之间不考虑大小),若叶子节点大于根节点则元素交换。
最小堆插入元素:先插入到完全二叉树最深的节点,然后排序。
最小堆删除元素:删除元素是指删除根节点。根节点删除,将最深的节点移动到堆顶,然后排序(和两个叶子比较,交换,比较…)。
数据结构概论笔记
最新推荐文章于 2023-10-11 23:31:22 发布