数据结构与算法
文章平均质量分 65
DanceDonkey
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java反射-反射API、类加载过程
Java反射API是Java语言实现动态性的关键,它允许动态的创建对象、赋值、以及调用对象的方法,同时反射也是实现动态代理的关键,涉及到反射相关的几个类主要有 Class、ClassLoader,Field、Method、Constructor、Proxy等。因为在Java中一切皆对象,当然,编译后的class字节码文件也会被JVM创建出一个唯一的Class类型对象,类就是类,对象就是对象,对象有属性可以调方法,任何对象也不例外,无需把这些对象想复杂化。这个时候仅仅是完成了类的加载过程,之后才是创建对象。原创 2023-07-12 23:07:41 · 341 阅读 · 0 评论 -
Java中基本数据类型与引用数据类型
new User()后,在堆内存中根据User类的属性大小,计算出所需内存空间,然后将内存地址赋值给u变量,例如堆内存的地址为0x002,而u这个变量地址是0x003,那么在输出u时,会先根据u的地址0x003找到这个地址保存的值,发现这个地址保存的值依然是一个地址,则会进一步找0x002,进而找到0x002对应的对象,从而进行输出。堆内存中的对象是所有线程共享的,如果这个对象是在方法栈中创建的,则一般不会有线程安全问题,但是如果这个对象是作为某个对象的属性,则此时可能会有线程安全问题。原创 2023-01-06 10:13:20 · 289 阅读 · 0 评论 -
广义表与迪杰斯特拉算法
广义表的深度等于每个元素的括号数量的最大值 + 1,例如(a,(b,c)),第一个元素a的括号数量0,第二个元素(b,c)括号数量为1,则最大值 = 1 ,深度 = 1 + 1 = 2。过了,如果没有,则直接填充该顶点的dist和path,这里必须注意,path是累加的路径长度,而不仅仅是从v2出发的路径长度,要加上v2已经保存的路径长度。第四次循环: 依然找到未被标识为true,且路径最短的顶点,找到了v4,v4的邻接表是v5,v7,v7没有被标识过,此时直接把v7的path标识v4,原创 2022-09-27 16:30:31 · 349 阅读 · 0 评论 -
平衡二叉树四种旋转情况
新插入节点X位于最小不平衡子树的左节点的左节点上,至于x是c的左节点还是右节点无所谓,只关心最上面三个节点的关系,当然,x也可以是c节点。LL型调整的是B这个中间节点,让B右旋一次。LR型为新插入的节点位于最小不平衡子树的左节点的右节点上(x也有可能就是c节点),此时需要先将C节点先左旋再右旋,要旋转两次最终的目的是要将C节点代替A的位置。插入新节点之后,若导致了树不平衡,此时首先需要找到最小不平衡树的根节点,记作A,A的左右子节点记作B,B的左右子节点记作C,此时A和C就是祖孙关系。原创 2022-09-21 17:26:20 · 540 阅读 · 0 评论 -
数据结构-循环队列实现
这里为什么是rear+1后取余,因为rear指向的是一个空地址,假设一个长度为5的队列已经存了4个元素,此时rear指向4,如果继续插入元素 4+1 % 5 = 0 == front , 表示队列已满,如果不加1, 4 % 5 = 4,将新元素插入4这个位置,此时移动rear指针,rear = (rear + 1) % maxsize = 0,此时rear == front,此时满足了队列为空的条件,但是此时队列是满的。2.循环队列的判满条件:(rear + 1) % maxsize == front。..原创 2022-08-17 14:37:14 · 799 阅读 · 0 评论 -
C语言中指针的使用
代码】C语言中指针的使用。原创 2022-08-12 15:22:37 · 154 阅读 · 0 评论 -
线索二叉树以及哈夫曼树
线索二叉树分为中序线索二叉树,前序线索二叉树,后序线索二叉树。中序线索二叉树就是根据中序遍历的结果,把中序遍历的结果看成一个线性表,对于线性表来说,每一个节点都会有一个前驱节点和一个后继节点。上图二叉树的中序遍历结果是:DBAGECF。D没有前驱节点,F没有后继节点。如果想找一个节点的前驱节点,例如想找E的前驱节点,只能从根节点开始再进行一次中序遍历,用两个指针,一个指向当前节点,一个指向当前节点的上一个遍历的节点。对普通二叉树结构进行改造,升级为线索二叉树。...原创 2022-08-12 15:15:53 · 489 阅读 · 0 评论 -
常用的排序算法的时间复杂度以及稳定性
排序算法分为一般排序和高级排序,高级排序算法往往效率超高,除此之外,排序算法的稳定性也是可参考的一个指标之一。原创 2022-08-08 14:06:38 · 2360 阅读 · 0 评论 -
数据结构-查找算法以及查找结构
但是如果是平衡二叉树,则直接删除某个节点后,可能会导致树的不平衡性,此时需要从调整的节点开始向上找到第一个不平衡的子树,找到这个子树的根节点以后,继续找到当前根节点高度最高的子节点(可能是左子树,也可能是右子树), 继续找从高度最高的子节点开始找,找到高度最高的后代节点,一共需要找2次,此时确定出当前后代节点相对于最开始的根节点的位置,是RR,LL,RL,还是LR,然后进行相应的旋转即可。3.1.4如果被删除的节点既有左节点又有右节点,则需要递归的找出最节点中最大的或右节点中最小的子节点来充当此节点。...原创 2022-08-05 13:27:17 · 476 阅读 · 0 评论 -
数据结构-图的相关术语以及应用
例如在图1中,A,B两点是强连通的,A是可以直接到B的,虽然B是不能直接到A的,但是可以通过BCA到达A,所以AB两点是强连通的。强连通图就是在一个有向图中,任意两个顶点之间都是强连通的,所以n个顶点的强连通图,至少需要n条有向边来连接(形成回路即可)。生成树:在一个有向图中,生成树必须包含所有的顶点,同时用尽可能最少的边将这些顶点连接。一个n个顶点的无向图至少需要n-1条边实现生成树。最小生成树:每条边是带权的,在生成树中每条边的权值是最小的。连通分量:图的所有极大连通子图,极大连通子图就是尽可能包含多的原创 2022-07-29 14:51:17 · 740 阅读 · 0 评论 -
树以及二叉树的常用性质以及遍历
一个节点有几个度,就是看这个节点有几个分支,如A节点的度为2,B节点的度为1,而D节点的度为3.树的度为这个树所有有最大的度的那个节点的度,例如在上图中,树的度为3(取决于D节点的度)。度为0的节点为叶子节点,度非0的节点为非叶子节点,如G,H,I是叶子节点.而C,D,E不是叶子节点。一个子节点上级节点,在一个树中,除了根节点以外,其他节点都有唯一的一个父节点祖先节点依次递归所有父节点,例如,节点H的祖先节点有DBA,E的祖先节点有CA后代节点就是表示树的层级,一共有几层,上图树共有4层。...原创 2022-07-22 16:53:35 · 1674 阅读 · 0 评论 -
C++实现二叉树存储以及层序遍历
代码】C++实现二叉树存储以及层序遍历。原创 2022-07-20 13:48:19 · 430 阅读 · 0 评论 -
Java实现KMP算法的字符串匹配
KMP算法的时间复杂度可以控制在o(m+n),核心就是kmp算法可以让主串的指针不回溯,主串的指针一直向前移动,而动态的变化模式串的指针。求出最长相等前后缀的长度,最终求出当前字符的下个指针应该是(字串长度)-(字串长度-(模式串匹配的长度))+1。求某个字符前面字符的公共前后缀的长度,定义两个指针,主串指针不断移动,如果与模式串不匹配,则模式串指针重置为1。这里注意,当遇到不匹配字符时,要获取这个字符处的next指针,如果指针是0,则应该让主串指针和模式串指针同时++。...原创 2022-07-20 11:31:19 · 788 阅读 · 0 评论 -
C++串的常用操作以及朴素匹配算法
串,即字符串,用单引号或双引号表示的一组字符序列子串包含于主串。对串的主要操作如下1.获取某个子串在主串中的起始位置2.获取主串的长度3.获取从第index位置开始的字符后的子串位置4.复制主串5.赋值字串6.比较两个字串的大小串的两种实现方法顺序方式实现(静态存储和动态存储),链式方式实现(这种方式实现的串需要用malloc函数申请存储空间,同时在销毁时,调用free函数)...原创 2022-07-19 21:45:26 · 856 阅读 · 0 评论 -
C++实现链表与顺序表、栈,队列
顺序表的查找时间复杂度为o(1),找到了头节点的地址,可直接根据数据类型计算出第i处节点的地址直接查找到,而链表的查找时间复杂度为o(n),因为链表只能从头节点开始一个一个的进行遍历,顺序表的增加和删除的时间复杂度为o(n),这个n主要是集中在移动节点上,因为要新增节点,首先要把该节点往后的节点依次后移。而链表的删除和增加的时间复杂度为o(n),虽然链表的也是o(n),但是链表的n主要是花费在指针移动上,指针移动的速度可远远比顺序表移动元素的速度快多了。c++实现逆波兰表达式求值。...原创 2022-07-19 21:39:58 · 394 阅读 · 0 评论 -
C++栈解决括号匹配问题、逆波兰表达式问题
(15/(7-(1+1)))*3)-(2+(1+1)),将某个中缀表达式转换为逆波兰表达式,如果是+-*运算倒是对顺序没什么有要求,但是如果是除法运算,则必须严格按照原式的除法顺序,如果是正常的加减乘,可以先写操作数,再写运算符,如果是除法,则要将操作数按原顺序写,如果是有小括号的优先级,则可以先写操作数,将操作符往右写。1.栈中越先保存的运算符,说明在原式中先被运算了,此时如果当前的运算符和栈中弹出的运算符的优先级是相等的,那么应该先将栈中的运算符加入到后缀表达中。......原创 2022-07-19 21:37:35 · 696 阅读 · 0 评论 -
C/C++指针类型与引用类型的基本使用
指针数据类型,自己本身保存的是其他变量的地址,通过指针数据类型可以操作其保存的地址的那个变量的值;在函数调用时,不管是基本数据类型还是结构体等类型,都会在内存中重新创建一个变量,也就是说,在调用的函数里面修改了变量的值不会影响调用者的函数。但是如果是使用的指针类型,则在调用函数时不会创建新变量,对指针或指针变量的修改会影响调用者函数的变量结构体数据类型指针传递 ,如果是结构体指针类型,则还是一样的效果修改指针,会修改对应的值,也会影响到调用者的指针变量的值,但是结构体类型指针在取值和赋值时要用 ->.原创 2022-07-12 14:40:11 · 1393 阅读 · 1 评论 -
伪代码实现几种常见的时间复杂度算法
2n +5 = O(n)n^2 + 2n +5 = O(n^2)2n^2 + 2n +5 = O(n^2)2n^3 +5 = O(n^3)5 = O(1)O(1) < O(log2n (log以2为底n的对数) ) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)O(log2n)如果i是每次i*3的话,那么执行次数就是 log3^1003.O(n)O(nlog2n)O(n^2)O(n^3)o原创 2022-06-30 10:28:05 · 1936 阅读 · 0 评论 -
kruskal算法求加权无向图的最小生成树
kruskal算法概述:按照边的权重(从小到大)处理它们,将边加入最小生成树中,加入的边不会与已经加入最小生成树的边构成环,直到树中含有V-1条边为止。kruskal的核心思想就是默认把图中每个顶点都当做一个树,创建一个队列,保存最小生成树所有的边,同时将该图中所有的边全部存入到一个最小优先队列中,然后依次从队列中弹出最小边,然后判断这个边连接的这两个顶点是否已经处于同一个数中了,如果处于同一个树中了,则跳过本次循环,否则合并这两个顶点到同一个树中,然后将该条边添加至最小生成树的边中。并查集AP.原创 2022-05-27 21:32:42 · 882 阅读 · 0 评论 -
高级排序-堆排序
一、堆的数据结构堆也是一种二叉树数据结构,也可以说是一种完全二叉树,但不一定是一颗满二叉树。满二叉树,当一个树的深度为n(n >= 1)时,该棵树共有2^n - 1个节点的树称为满二叉树完全二叉树,当一个树的深度为n(n >= 1)时,需满足该课树前 n-1层为2^(n-1) - 1个节点,如果最后一层的节点数不等于2^(n-1)次方个节点,则为完全二叉树,且最后一层的节点需要从左往右排列,则称为完全二叉树。图二为不完全二叉树,因为最后一层的叶子节点没有满足从左往右排列。原创 2022-05-14 22:22:17 · 296 阅读 · 0 评论 -
双向链表的反转算法
在双向链表中使用尾插法速度是非常快的,达到了O(1)级别,因为链表内部维护了一个tail属性,指向了最后一个元素,那么在插入的时候直接将tail指向的尾节点重新指向新插入的节点,新插入的节点再和原尾节点指向的节点做双向关联即可.算法一public void reverse(){ TowWayList<T> list = new TowWayList<>(); for(int i = length - 1;i >= 0;i++){ list.add(getNode原创 2022-05-10 15:05:22 · 3016 阅读 · 0 评论 -
关于ArrayList指定下标插入元素问题
如果创建了一个初始容量为5的集合,然后添加了2个元素,在添加第三个元素时指定索引插入 ArrayList<Integer> integers = new ArrayList<>(5); integers.add(1); integers.add(10); integers.add(3,20); System.out.println(integers.size()); for (Integer原创 2022-05-09 21:20:36 · 3332 阅读 · 0 评论
分享