算法与数据结构
Artisan_w
这个作者很懒,什么都没留下…
展开
-
Trie树
每个节点定义// 假设只包含小写字母可知,如果只包含小写字符串,可以设置子节点为new TrieNode[26];//每次都要从头部开始查//字符串的减去a后的值是数字值,例如a是97,b是98//如果这个值在索引上没有值,那就需要重新开辟一个TrieNode//继续往下迭代//迭代结束设置一个标识,这个地方可以有很多扩展//查找类似上面的新增//迭代的最后一个字符串需要有个结束字符才能代表当前已经有个一样的字符串了//这里就不需要有结束的标识了。原创 2024-03-21 15:03:54 · 450 阅读 · 0 评论 -
平衡二叉树
因此,在实际应用中,我们通常会使用更加复杂的平衡二叉查找树,如红黑树、AVL树等,以保证树的高度在一个可控范围内,从而保持较高的性能。对于搜索操作,我们可以按照二分查找的思路,在每个节点处比较搜索值和节点值的大小,根据比较结果选择进入左子树或右子树,直到找到目标节点或者到达叶子节点(如果没有找到目标节点,则搜索失败)。相对于普通的二叉查找树,平衡二叉树在维护数据的同时,能够自动地调整树的结构,使得树的高度始终保持在O(log n)的级别,从而提高了查找、插入、删除等操作的效率。原创 2023-10-13 11:24:36 · 84 阅读 · 0 评论 -
最小生成树---Prime算法
算法步骤首先需要了解Prime算法的基本思想:通过每次添加一个新节点到集合,直到所有点加入停止。原理:每次连出该集合到其它所有点的最短边保证最小生成树的权值最小1,首先随便选一个点加入集合2,在其余点能够与这个集合相连的条件下,遍历这个集合中的点到其它点的权值3,找出一个距离这个集合的任意一点距离最小的边4,把这条边加入到这个集合5,更新这个集合之后继续重复2步骤6,直到所有的点都加入了这个集合构造一个图Prime解决的是一个图的问题,我们首先要构造一个图,图的要素有三个:点的个数,点原创 2020-08-22 19:41:05 · 1581 阅读 · 0 评论 -
单链表反转
解题思路双指针原地变向法:通过两个指针pPrev与pCur来分别指向已经逆转的数据和将要逆转的数据,我们需要做的只要让pCur指向pPrev即可,但是由于如果将pCur指向pPrev,会导致pCur与原链表结构断开,因此需要一个temp暂时保存pCur的下一个结构,在完成当前的pCur指向pPrev之后,再让pCur指向我们需要逆转的数据。代码/**Definition for singly-linked list.public class ListNode {int val;原创 2020-07-23 15:14:02 · 122 阅读 · 0 评论 -
ConcurrentHashMap并发
ConcurrentHashMap和HashMap的实现方式类似,不同的是他采用分段锁的思想支持并发操作,所以线程是安全的。下面介绍ConcurrentHashMap是如何采用分段锁的思想实现多线程并发下的数据安全的。减小锁粒度ConcurrentHashMap是线程安全的,对于HashMap而言,最重要的方法是get和set方法,如果为了线程安全对整个HashMap加锁,在效率上会大打折扣;而ConcurrentHashMap在内部使用多个Segment,在操作数据的时候会给每个Segment都分别加原创 2020-07-22 16:33:33 · 392 阅读 · 0 评论 -
归并排序
归并排序是利用递归与分治技术将数据划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并为越来越大的有序序列。原理如下:对于一个给定的一组记录,首先将每两个长度为1的子序列进行归并,得到n/2个长度为2或者为1的有序子序列,,再将其两两归并,反复执行此过程,得到一个有序序列public class TestMergeSort { public static void main(String[] args) { int[] nums = new int[]{3原创 2020-07-02 17:20:36 · 94 阅读 · 0 评论 -
堆排序
堆排序的思想:对于给定的n个数据,初始时把这些记录看做一颗顺序存储的二叉树,然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素互换后,堆的最后一个元素即为最大记录;接着将n-1个元素重复调整为一个大顶堆,再将堆顶元素与当前堆的最后一个元素进行交换后得到最大记录,重复该过程直到调整的堆只剩下一个元素为止,该记录为最小记录,此时可以得到一个有序序列。堆排序主要有两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。首先需要构建堆,对于单个堆的构建 public static void原创 2020-06-29 17:12:43 · 131 阅读 · 0 评论 -
Map中getOrDefault方法
default V getOrDefault(Object key, V defaultValue) { V v; return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue; }代码如上所示,如果包含这个对象的key值则,返回这个对象对应键的值,否则返回0测试...原创 2020-05-28 16:50:15 · 586 阅读 · 0 评论 -
B树与B+树
B-Tree的特点1,叶节点具有相同的深度2,所有的索引元素不能重复3,叶节点的数据从左往右递增B+树的特点1,非叶子节点不能存储数据2,所有的索引元素不能重复3,所有的叶子节点用指针连接,提高区间访问性能数据结构仿真...原创 2020-04-06 14:15:08 · 306 阅读 · 0 评论 -
简单引用、浅拷贝与深拷贝
原文链接:https://blog.csdn.net/zhangjg_blog/article/details/18369201/简单引用new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用...原创 2020-03-27 13:27:13 · 269 阅读 · 0 评论 -
大小写字母的转化
方法1:利用toLower Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); System.out.println("原字符串:"+s); String S = s.toUpperCase(); System.out.println("转...原创 2020-03-24 20:01:16 · 2041 阅读 · 0 评论 -
动态规划-找零问题
给定一组硬币数,找出一组最少的硬币数,来找换零钱N。如何减小时间复杂度:不用全局变量来保存计算过的值,也不用递归的方法来实现,用一个一维数组,再用循环来实现import java.util.Scanner;public class cionMinNum { public static void main(String[] args) { Scanner scan =...原创 2020-03-22 20:54:56 · 438 阅读 · 0 评论 -
排序方法-快速排序
快速排序是一种时间复杂度为O(NlogN)的排序算法原创 2020-03-22 20:05:22 · 181 阅读 · 0 评论 -
解析算数表达式
步骤主要是两部:1.将算数表达式转换为后缀表达式2.求后缀表达式的值在之前首先要明确什么是后缀表达式:在我们写表达式时一般把操作符(+,-,,/)放在两个字符之间,例如A+B,A/B,这个被称为中缀表达式,而后缀表达式是将操作符放在字符后面,于是变成了AB+,AB/。如下表所示所示为典型的变换首先解决第一个问题:如何将中缀表达式转化为后缀表达式?首先解析3+45:解析3*(4+5)...原创 2020-03-16 19:33:22 · 559 阅读 · 0 评论 -
读书笔记-算法与数据结构(第二版java)
进行了一次笔试,深切的感受到了自己在数据结构方面的知识的零散,因此专门找一本书来系统的整理学习一下,最后发现Java数据结构和算法这本书系统性比较强,而且内容浅显易懂,因此通过这本书作为载体来进行学习,顺便记录一下重点。一:综述1.为什么要用数据结构?我们使用的数据结构和数据跟我们现实世界数据存储紧密相连,例如索引卡片,我们在上面记录了姓名,电话,住址。虽然我们可以很简单的将索引卡片转化为...原创 2020-03-16 15:11:41 · 332 阅读 · 0 评论 -
求最大公约数方法-辗转相除法
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。例如求m,n的最大公约数流程图代码递归算法 public int gcd(...原创 2020-03-12 13:34:01 · 1580 阅读 · 0 评论 -
数据结构-二叉树的遍历(递归方法)
遍历是按照某种策略访问树的每个节点,且只访问一次的过程。由于二叉树所具有递归性质,一颗非空的二叉树是由根节点、左子树和右子树组成的,因此,若能依次遍历这三个部分就能遍历整个二叉树。原创 2020-03-11 22:19:11 · 296 阅读 · 0 评论 -
数据结构--栈(Java)
1.栈的定义栈是通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为后进先出(Last In First Out,LIFO)的线性表。在栈中进行插入和删除操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。2.栈的基本运算(1).初始化栈:创建一个空栈;(2).判断是否为空;(3).入栈Push(S,x):将元素加入...原创 2020-03-11 14:37:20 · 297 阅读 · 0 评论 -
递归算法(java实现)
基本思想:递归是指子函数(或函数)直接或者间接调用自己的过程。递归的两个基本要素:递归体,即大问题如何化解为小问题。边界条件,递归到何时终止。例如:递归体的第二式是用较小的自变量函数值来表示较大自变量函数值的方式来定义n的阶乘。函数式的第一式给出这个函数一个初始值,是这个递归的边界条件。int functorial(int n){if(n == 0 ) return 1;i...原创 2020-03-10 15:17:14 · 319 阅读 · 0 评论 -
排序算法-希尔排序
希尔排序又称“缩小增量排序”,它是对直接插入排序算法的改进。基本思想:将整个待排序列分割成若干个子序列,然后分别进行插入排序,待整个序列中基本有序时,再对全体进行一次直接插入排序。...原创 2020-03-09 21:14:34 · 875 阅读 · 0 评论