数据结构—树、堆、Hash等
chenchen216
这个作者很懒,什么都没留下…
展开
-
二叉树多种遍历的时间复杂度和空间复杂度
遍历通常分为前序遍历、中序遍历、后序遍历、层序遍历四种情况。对于遍历方式只是打印顺序而已,所以四种遍历复杂度均相同。1.非递归遍历(辅助栈)时间复杂度:O(N)空间复杂度:O(N)由于每个节点都要进栈和出栈,所以时间复杂度为O(N),同样空间复杂度也为O(N),N为结点数。2.递归遍历时间复杂度:O(N)空间复杂度:O(N)递归实现的本质也是系统...原创 2019-10-23 17:19:12 · 36533 阅读 · 0 评论 -
位操作——无参交换及其弊端
有参交换很常见,引入变量void swap(int *a ,int *b){ int tmp = *a; *a = *b; *b = tmp; }求和法当要比较的两个数据较大时,求和易发生溢出风险。void swap(int *p1,int *p2){ *p1 = *p1 +*p2; *p2 = *p1 -*p2; ...原创 2019-04-06 15:23:40 · 384 阅读 · 0 评论 -
树(Tree)——(七)平衡搜索二叉树AVL Tree代码实现篇
左单旋(RR)/*左旋转操作*//*pnode 为最小失衡子树的根节点*//*返回旋转后的根节点*/template<typename T>AVLTreeNode<T>* AVLTree<T>::leftRotation(AVLTreeNode<T>* proot){ AVLTreeNode<T>* prchild...转载 2019-03-29 12:50:39 · 163 阅读 · 0 评论 -
树(Tree)——(八)红黑树RB Tree理论篇
平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logN)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 那么创建一颗平衡二叉树的成本其实不小.这个时候就有人开始思考,并且提出了红黑树的理论,那么红黑树到底比...转载 2019-03-29 13:55:19 · 242 阅读 · 0 评论 -
数据结构——查找(提高篇)
前言个人感觉在求职中,数据结构里最常被问到就是排序和查找,由于这个是对数据处理最重要的地方,所以面试笔试需要好好准备。先来讲查找,这里我参考《大话数据结构》的知识点顺序,逐步代码实现。虽然我之前看视频学习时,也整理过,这次要加上B-Tree等,所以重新写个提高篇。目录前言1.顺序表查找(未排序)1.1顺序表查找算法1.2.顺序查找表算法-优化版2.有序表查找(先排序...原创 2019-04-02 22:59:18 · 1498 阅读 · 0 评论 -
剑指Offer第三十九题:平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:判断平衡的条件就是左右子树高度差不超过1,如果从根节点出发判断,就会有很多重复判断,太浪费资源,所以我们可以从叶子节点开始判断,从叶子节点我们就可以用后序遍历来实现。树高度的求法可以看我这篇博客:https://blog.csdn.net/weixin_42513339/article/details/81274663...原创 2019-04-12 13:06:46 · 111 阅读 · 0 评论 -
哈希表冲突及处理方法
一、哈希函数和哈希冲突的基本概念1.哈希函数:哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表成为哈希表。基本思想:首先在元素的关键字K和元素的位置P之间建立一个对应关系f,使得P=f(K),其中f成为哈希函数。创建哈希表时,把关键字K的元素直接存入地址为f(K)的单元;查找关键字K的元素时利用哈希函数计算出该元素的存储位置P=f(K).2.哈希冲突:当关...转载 2019-04-13 21:15:34 · 1591 阅读 · 0 评论 -
大量数据的排序,可以用哪些种排序算法?
归并排序 快速排序 堆排序对于内存足够大的大量数据排序,一般来说用归并排序比较好的,因为他的读取次数会比较少(在数据挖掘的理论里面,读取次数越少,排序方法越快),同时是稳定的; 但是如果内存空间不足,就自然要减少次数了,所以也可以用快速排序,快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; 也可以利用堆排序,当N很大时,并且有...转载 2019-04-17 14:42:51 · 4019 阅读 · 1 评论 -
B tree、B- tree、B+ tree、B*tree
目录1.B tree(B- tree)2.B+ tree(B+树)2.1为什么需要B+树,B+树比B树更好呢?2.1数据库索引采用B+树的主要原因3.B*tree(B*树)4.小结1.B tree(B- tree)B树(B tree)是一种平衡的多路查找树。2-3树和2-3-4树都是 B树的特例。节点最大的孩子数目称为B树的阶(order),因此,2-3树...转载 2019-04-15 09:50:42 · 238 阅读 · 0 评论 -
关于mid=(low+high)/2与mid=low+(high-low)/2的区别
----------------------------------这个在二分查找里经常写到,但是之前不重视。这两种用法里,用 mid=low+(high-low)/2 这种写法好,虽然数学上是一样的,但是mid=(low+high)/2 中的加法可能会发生溢出。...原创 2019-09-03 21:27:25 · 3435 阅读 · 2 评论 -
哈夫曼树
在学习这个前,只听过哈夫曼编码。:(哈夫曼树数用来寻找一棵最佳判定树,即总的比较次数最少的判定树。举例如下:这两棵查询分数等级的树,肯定是右边的比较好,效率要比前者高。我们称判定过程最优的二叉树为哈夫曼树,又称最优二叉树。一,什么是哈夫曼树哈夫曼树需要了解:权值:就是定义的路径上面的值。结点的带权路径长度:在一棵树中,假设其结点上附带有一个权值,通常...转载 2019-04-10 16:57:32 · 921 阅读 · 0 评论 -
数据结构——排序(提高篇)
前言与查找一样,写一篇对于排序的总结,主要参考《大话数据结构》关于查找提高篇——链接:https://blog.csdn.net/weixin_42513339/article/details/88980795目录前言1.排序相关概念1.1排序的稳定性1.2内排序和外排序2.冒泡排序(Bubble Sort)冒泡改进版3.简单选择排序4.直接插入排序...原创 2019-04-04 23:36:15 · 408 阅读 · 0 评论 -
树(Tree)——(二)链式存储
用代码实现前序、中序、后序,第一种方法就是使用递归,另一种是使用栈。将分别讲述。目录1. 递归实现main函数(C语言版本)2. 利用栈实现mystack.hmystack.cppmain函数3.补充:求树高度的函数 1. 递归实现main函数(C语言版本)#include <stdio.h>#if 0 //如下图示意图的树...原创 2018-07-29 20:05:21 · 421 阅读 · 0 评论 -
树(Tree)——(三)搜索二叉树(BST)插入、查找
目录搜索树的创建和插入(C++)迭代版 (未用递归):递归版:BST的查找:BST寻找最大最小值:查找父节点: 之前用到的二叉树是基本不用的,只是具备了二叉树的样子。二叉树的作用是为了方便查找,所以我们需要构建一个搜索二叉树。二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。 二叉搜索树不同于一般的二叉树,它是一种...原创 2018-07-29 22:01:34 · 924 阅读 · 0 评论 -
树(Tree)——(六)平衡搜索二叉树理论篇
目录平衡分类最小不平衡子树 AVL TreeAVL树的失衡调整的四种情况1.左单旋(RR) 关键代码:例:补充:2.右单旋(LL)关键代码:3.右左双旋(RL) 4.左右双旋(LR) 总结平衡:影响树的平衡的因素主要有,插入顺序,删除节点。一旦树失去了平衡性,其查找效率就会下降,甚至失去查找效率。 分类:AVL Tr...原创 2018-08-14 15:56:58 · 278 阅读 · 0 评论 -
树(Tree)——(四)搜索二叉树(BST)查找父节点队列版
续上次查找父节点的队列版本。若要看之前的方法点击这里代码如下:myqueue.h#include<stdio.h>#include<stdlib.h>struct TreeNode{ TreeNode* _left; TreeNode*_right; int _data;};struct Node{ Tree...原创 2018-08-12 14:57:22 · 1675 阅读 · 0 评论 -
树(Tree)——(五)搜索二叉树的节点删除和销毁
目录节点删除的三种情况:第一种情况:第二种情况:第三种情况代码实现:main函数节点删除的三种情况:节点删除总共分成三种情况:第一种情况:若为叶子节点则直接删除,如左图节点1,3 ,8或者右图的1,4,8。(若为单独一个根叶子要单独处理)若为单独一个根叶子第二种情况:若该节点,有一个节点,左或是右。因为只有一个节点,直接令祖父节点...原创 2018-08-13 14:17:30 · 20842 阅读 · 3 评论 -
堆(Heap)——(一)优先队列
堆可以利用数组、链表或者搜索二叉树实现,但是最好方法是利用完全二叉树。1.完全二叉树完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐,如下图重新构建一种树, 专注于插入和删除最大或最小。 即, 根节点总是最大或最小且结构满足完全二叉树。 满足这种结构的树称为堆。特点:结构性: 用数组表示完全二叉树 有序性: 任一节点的关键字是其...转载 2019-03-29 16:54:45 · 167 阅读 · 0 评论 -
哈希(Hash)与算法的衡量
对于map来说,背后就是平衡搜索二叉树,具体可见https://blog.csdn.net/weixin_42513339/article/details/88889306,空间复杂度为 O(logN)对于unorder_map来说,背后就是哈希,空间复杂度为 O(1),其中O(1)就是类似数组,给与下标就能快速找到。什么是哈希?某度定义:散列表(Hash table,也叫哈希...转载 2019-03-29 20:01:28 · 436 阅读 · 0 评论 -
排序算法总结和二分查找
目录1.冒泡法2.冒泡法改进版3.插入排序4.希尔排序5.选择排序6.选择排序改进版7.快速排序(利用递归)7.归并排序(利用递归)8.二分查找1.冒泡法时间复杂度:O(N^2)//冒泡void popSort(int * arr,int num){ for(int i =0;i<num-1;i++) { ...转载 2019-03-30 10:19:27 · 161 阅读 · 0 评论 -
多路查找树——2-3树和2-3-4树
目录2-3树定义2-3树的插入2-3树的删除PS2-3-4树定义2-3-4树插入2-3-4树删除PS2-3树定义定义:多路查找树,其中每一个结点都具有两个孩子(称为2结点)或三个孩子(称为3结点)。所有叶节点都在树结构的同一层,因此树的高度总是平衡的。一个2结点包含一个元素和2个孩子(或者没有孩子),且与搜索二叉树类似,左子树包含的元素小于...原创 2019-04-04 14:30:55 · 293 阅读 · 0 评论 -
数据结构常见算法可视化演示网站
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html原创 2019-04-04 20:17:48 · 3049 阅读 · 0 评论 -
树(Tree)——(一)基础知识
目录关于树的术语 儿子兄弟链式表示法二叉树概念和基本特征 二叉树的形态前序、中序、后序遍历特性树存在的主要意义就是为了方便查找,如二叉树就有二分的思想。 关于树的术语 1.结点的度(Degree):结点的子树个数。 (例如上面的图中A有三个节点,那么A的度为3)2.树的度:树的所有结点中最大的度数。 (上图树的度为3)3.叶结点( Leaf...原创 2018-07-29 15:30:41 · 1018 阅读 · 0 评论