数据结构
天射手座
万丈高楼平地起,勿在浮沙筑高台。
展开
-
通过PriorityQueue类构造大顶堆(最大堆)和小顶堆(最小堆)
概念回顾:1、大顶堆:头部为堆中最大的值2、小顶堆:头部为队中最小的值3、PriorityQueue:一个具有优先级的队列,该优先级使得队列始终按照自然顺序进行排序,队列的头部为最小值。构造小顶堆:PriorityQueue small=new PriorityQueue<>();构造大顶堆:PriorityQueue small=new PriorityQueue&l...原创 2020-01-13 01:32:17 · 4654 阅读 · 2 评论 -
res.add(new ArrayList<String>(item)); 和 res.add(item)区别
item定义:ArrayList item=new ArrayList();共同点:都是向res这个ArrayList中填加了一个名为item的链表不同点:res.add(new ArrayList(item))开辟一个独立地址,地址中存放的内容为item链表,后续item的变化不会影响到resres.add(item)将res尾部指向了item地址,后续item内容的变化会导致re...原创 2019-11-22 10:18:23 · 882 阅读 · 0 评论 -
理解next数组的计算方式
i 0 1 2 3 4 5 6 7 8 9 10 11s a b a b a a a b a b a anext[i] -1 0 0 1 2 3 1 1 2 3 4 5先计算前缀next[i]的值:...转载 2019-01-21 20:52:30 · 3812 阅读 · 2 评论 -
字符串数组的几种输出方式以及注意点
假设我们需要输出 a[80] 和 b[80],可以采用以下输出方式:1、puts(a); puts(b);//puts()函数自带换行2、printf("%s,%s", a, b);//在printf函数中a和b不能加上中括号,此处表示的是数组首地址不能采用的输出方式:putchar(a, b);puts(a, b);//putchar和puts函数中不能使用多个参数...原创 2019-01-21 21:23:25 · 10616 阅读 · 1 评论 -
广义表的head与tail计算
假设有广义表L=(A,B,C)则表头是A,表尾是(B,C)文字定义:当广义表L非空时,称第一个元素为L的表头;称广义表L中除去表头后其余元素组成的广义表为LS的表尾head(L)=A;tail(L)=(B,C);tail(tail(L))=(B,C);head(tail(tail(L)))=B;...原创 2019-01-21 22:20:43 · 11005 阅读 · 4 评论 -
32位系统和64位系统各种数据类型占用的空间(字节数)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012611878/article/details/52455576 &amp;lt;/div&amp;gt; &amp;lt;div id=&quot;content_views&quot; class=&quot;markdown_转载 2019-01-21 22:50:59 · 6203 阅读 · 0 评论 -
树、森林及二叉树之间的相互转换
一、树转换为二叉树1、在所有兄弟结点之间加一条连线。2、对树中每个结点,只保留它与第一子结点(从左到右数)的连线,删除它与其他孩子结点之间的连线。3、调整位置,使得结构关系清晰二、森林转换为二叉树1、把每棵树转换为二叉树。2、第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。三、二叉树转换为树/森林将以上步骤反向执行即可...原创 2019-01-28 09:40:54 · 168 阅读 · 0 评论 -
平衡二叉树的最少最多节点数
对于高度为n的平衡二叉树:最少需h(n)个结点,做多需要2^n-1个结点。h(n)=h(n-1)+h(n-2)+1h(0)=0 h(1)=1 h(2)=2原创 2019-01-28 10:31:21 · 20040 阅读 · 5 评论 -
如何将字符进行Huffman编码
以alibaba为例:1、将每个字符在字符串中的出现频率进行从小到大统计:a:3 b:2 l:1 i:12、构建依据频率的带权重的二叉树:3、根据二叉树读出每个字符的Huffman码:a:0b:11l:100i:1014、将上面的Huffman码替换掉原来的alibaba:0100101110110...原创 2019-01-23 08:44:56 · 2386 阅读 · 0 评论 -
已知入栈顺序,总结出栈顺序的规律
规律:出栈的每一个元素的后面,其中比该元素先入栈的一定按照入栈逆顺序排列。举例说明:已知入栈顺序: 1 2 3 4 5判断出栈顺序: 4 3 5 1 2结果:不合理,原因是出栈元素3之后有 5 1 2 这三个元素,其中1 2 是比3先入栈的,根据规律,这两个出栈的顺序必须和入栈顺序相反,也就是 2 1 出栈,不可能按照1 2 顺序出栈。已知入栈顺序: 1 2 3 4 5判断出栈顺序:...原创 2019-01-23 09:33:12 · 31954 阅读 · 2 评论 -
堆和栈的区别
一、内存分配栈:系统自动分配,分为动态分配和静态分配,物理地址上连续的堆:由程序指令负责调配,只有静态分配,物理地址上是不连续的二、运行速度栈:运行速度较快堆:运行速度较慢...原创 2019-01-23 09:56:34 · 139 阅读 · 0 评论 -
辨析前缀、中缀和后缀表达式
前缀表达式、中缀表达式、后缀表达式的区别在于运算符放的位置不同,可以通过下面一个简单例子来理解:前缀表达式:±/12345(运算符在操作数之前)中缀表达式:1+2-34/5(运算符在操作数中间)后缀表达式:12345±*/(运算符在操作数之后)...原创 2019-01-23 10:05:41 · 201 阅读 · 0 评论 -
如何计算时间复杂度
时间复杂度指的是时间复杂度是总运算次数表达式中受n的变化影响最大的那一项,也可以理解为O(在最差情况下需要计算的次数)。例如:二重循环 for(i=0;i&amp;lt;n;i++){ for(j=0;i&amp;lt;n;j++){ } }//最多需要计算n*n次,因此时间复杂度为O(n^2) for(i=0;i&amp;lt;n;i++){ ...原创 2019-02-20 10:26:32 · 161 阅读 · 0 评论 -
二叉树中度和结点的关系
k:总度数k+1:总结点数n0:度为0的结点数n1:度为1的结点数n2:度为2的结点数关系式:k=n2*2+n1;k+1=n2+n1+n0;将上面两式相减得到:n0=n2+1;原创 2019-08-24 10:25:30 · 4945 阅读 · 0 评论 -
字符串的子串计算方法
字符串的任意片段都是子串:对于字符不重复的长度为n的字符串:子串公式(n*(n+1))/2 + 1-重复计算的字符串数量。示例:字符串的子串,就是字符串中的某一个连续片段。截取一个字符串长度需要一个起始位置和结束位置。字符串“software”有8个字符,可是设置间隔的位置有9个,使用C(9,2)=36即可求得字符串“software”的所有子串。因为空串也是子串,故还需要加上1,总共3...原创 2019-08-24 10:31:24 · 18535 阅读 · 4 评论 -
堆和栈的特点、区别
堆:**要点1:**堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。**要点2:**堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。栈:**要点1:**栈中主要存放一些基本数据类型的变量(byte,short,int,long,flo...原创 2019-08-24 10:46:57 · 871 阅读 · 0 评论 -
值类型和引用类型的区别
值类型是现金,引用类型是存折值类型保存在栈上,保存的是对应的数值(由于栈的特点是需要提前确定分配的空间大小,适合保存不经常改变的量)引用类型保存在堆上,保存的是对应的实例的保存地址(堆的特点就是动态编译,比较灵活)值类型:8种基本数据类型引用类型:除了8种基本数据类型的其他类型,如:Interger Double Float String 数组...原创 2019-08-24 11:04:26 · 114 阅读 · 0 评论 -
关于堆排序的总结理解
本文将从相关预备知识、堆排序步骤、总结三方面阐述堆排序。一、预备知识:堆:一种树形序列,所有的堆都必须符合两个条件:(1)完全二叉树(2)父节点总是小于或大于子节点。图形表达和数字表达的转换:图一也写成12-8-10-6-4-7-9,图二也写成2-6-6-6-4-7-9二、堆排序步骤:(1)升序进行堆排序:(第一轮)不断调换相邻节点位置,直到父节点总是大于子节点。达成目的后,将首尾...原创 2019-01-21 18:24:04 · 1810 阅读 · 1 评论 -
四种存储结构
1、随机存储:可以直接根据下标(地址)访问到该元素。2、顺序存储:必须依次根据从前从后的顺序依次访问,访问A元素,需要经过A之前的元素。3、索引存储:建立索引表,根据索引表的地址提示进行访问。4、散列存储:建立散引表,根据散引表的地址进行访问。...原创 2019-01-21 16:25:13 · 9428 阅读 · 0 评论 -
线性结构与非线性结构辨析
线性结构:元素之间存在一一对应的关系,即除了首尾元素,其它元素的前后元素都是唯一的。非线性结构:每个元素都可能和0/1/多个元素之间对应,如二叉树,多维数组等。...原创 2019-01-21 15:53:07 · 1464 阅读 · 0 评论 -
单链表和双链表的区别
一、方向不同单链表只有指向下一个结点的指针双链表既有指向下一个结点的指针,也有指向上一个结点的指针二、适用情况不同单向链表更适合元素的增加与删除双向链表更适合元素的查询工作三、读取不同单链表只能单向读取双链表可以双向读取...原创 2019-01-23 18:34:33 · 9225 阅读 · 0 评论 -
通过示意图理解各种链表的存储结构
转载 2019-01-23 20:50:44 · 1351 阅读 · 0 评论 -
链表带头结点和不带头结点的区别、优缺点
头结点:在单链表的第一个结点之前附加一个结点,称为头结点。(通常头结点的data域可以为空)。带头结点的优点:1、更快删除/插入第一个结点2、统一空表和非空表的处理...原创 2019-01-23 21:38:47 · 8519 阅读 · 3 评论 -
树的一些重要概念
节点的度:一个节点含有的子树的个数称为该节点的度;树的度:一棵树中,最大的节点的度称为树的度;叶节点或终端节点:度为零的节点;非终端节点或分支节点:度不为零的节点;父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的层次:从根开始定义起,根为第1层...原创 2019-01-24 01:23:29 · 200 阅读 · 0 评论 -
循环队列和循环栈的队尾指针和队头指针指向位置的区别
循环队列:队头指针:指向队首元素的前一个位置队尾指针:指向队尾元素循环栈:队头指针:指向队首元素队尾指针:指向队尾元素的后一个位置...原创 2019-01-24 08:42:04 · 25082 阅读 · 0 评论 -
如何理解三维数组
array[a][b][c]含义:可以理解为该数组有a页,每一页都有一个b行c列的二维数组原创 2019-01-14 04:03:29 · 6569 阅读 · 3 评论 -
链式存储与顺序存储的区别
一、存储地址链式存储:储存单位的地址不一定是连续的顺序存储:储存单位的地址必须是连续的二、存储空间利用率与分配链式存储:利用率低,动态分配顺序存储:利用率高,静态分配三、修改内容速度链式存储:修改速度快顺序存储:修改速度慢三、查询内容速度链式存储:查询速度慢顺序存储:查询速度快...原创 2019-01-14 02:53:41 · 6775 阅读 · 3 评论 -
关于排序中的快速排序
记忆要点:从两头往中间搜索,右边找小,找到和基准数互换位置;左边找大,找到和基准数互换位置PS:右边先开始原创 2019-01-19 09:23:57 · 131 阅读 · 0 评论 -
线索二叉树的线索
n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。这些空指针域也叫做线索。原创 2019-01-24 21:16:24 · 1272 阅读 · 0 评论 -
二叉树的叶子结点数量计算
已知总结点数为NN为偶数:叶子节点为N/2N为奇数:叶子节点为N/2+1原创 2019-01-24 21:44:21 · 5404 阅读 · 1 评论 -
行主序、列主序概念辨析以及基地址的含义
行主序:在数组中按照a[0][0]、a[0][1]、a[0][2]…a[1][0]、a[1][1]、a[1][2]…依次存储数据列主序:在数组中按照a[0][0]、a[1][0]、a[2][0]…a[0][1]、a[1][1]、a[2][1]…依次存储数据基地址:即数组首元素地址,数组的起始地址。...原创 2019-01-19 23:05:18 · 7621 阅读 · 0 评论 -
链表和数组的区别
区别一:物理地址存储的连续性数组的元素在内存中是连续存放的。链表的元素在内存中不一定是连续存放的,通常是不连续的。区别二:访问速度数组的访问速度很快,因为数组可以根据数组可以根据下标进行快速定位。链表的访问速度较慢,因为链表访问元素需要移动指针。区别三:添加、删减元素速度数组的元素增删速度较慢,因为需要移动大量的元素。链表的元素增删速度较快,因为只需要修改指针即可。...原创 2019-01-20 01:20:50 · 6244 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历、后序遍历、层次遍历
一、前序遍历根节点->左子树->右子树二、中序遍历左子树->根节点->右子树三、后序遍历左子树->右子树->根节点四、层次遍历按照深度,以从上到下、从左到右的顺序进行遍历特殊情况分析:1、后序遍历序列与中序遍历序列相同说明该二叉树无右结点...原创 2019-01-24 22:27:28 · 990 阅读 · 0 评论 -
线索二叉树
如上图所示,在二叉树中,每一个结点都包含三个基本信息:结点自身的数据信息,结点指向左子节点和右子节点的指针。然而从空间利用率上说,对于非满二叉树,我们发现经常会有结点空指针的情况出现,造成大量的空间浪费,为了更高效地利用空间,提高运行效率,我们针对二叉树进行改进,提出了线索二叉树,即二叉树的线索化。图中为一个二叉树,其中用红色圆圈标注出来的都是结点的空指针线索二叉树的改进原理与方法通...原创 2019-01-25 00:18:12 · 179 阅读 · 0 评论 -
关于链表和数组常用操作的时间复杂度
数组:1、查找复杂度:O(1)2、添加/删除复杂度:O(n)链表:1、查找复杂度:O(n)2、添加/删除复杂度:O(1)原创 2019-01-21 13:18:20 · 6701 阅读 · 2 评论 -
判断循环队列的队空、队满以及队列中元素个数的计算
front表示队头指针(指向队列内首元素)rear表示队尾指针(指向队列内尾元素的下一个位置)m表示队列的容量队空:front=rear队满:front=(rear+1)%m队列内元素个数:(rear - front + m) % m...原创 2019-01-21 13:34:02 · 16643 阅读 · 0 评论 -
线性表、顺序存储和链式存储的关系
线性表是一种逻辑结构顺序存储和链式存储是存储结构顺序表和链表两者比较:1、顺序表可以顺序存取/随机存取,链表只能顺序存取2、顺序表存储内容在物理储存地址上也相邻,链表通过指针指向,故链表不一定3、顺序表存取速度慢,查询速度快;链表存取速度快,查询速度慢。...原创 2019-01-18 09:05:53 · 1807 阅读 · 0 评论