数据结构和算法分析
文章平均质量分 53
Pluto372
记录自己的学习笔记,同时方便自己忘了可以容易复习
展开
-
java使用Map缓存
缓存什么是缓存?平常的开发项目中,多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。缓存的使用场景:在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中,相对从数据库中读取,读缓存效率会有很大提升。在集群环境下,常用的分布式缓存有Redis等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。使用map缓存方案:基于ConcurrentHashMap实现数原创 2021-10-12 15:18:25 · 7253 阅读 · 4 评论 -
java获取MAC地址
public class IpAddressUtils { private static final String INTRANET_IP = getLocalIpAddress(); public static String getLocalMacAddress(String ip) {//没有缓存的地址,则查询 String mac_s = ""; try { byte[] mac; NetworkInte原创 2021-08-10 10:07:54 · 398 阅读 · 0 评论 -
自定义注解给属性加密
1、创建注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface EncryptionSM4 {//可以给个默认值,然后根据不同的值采用不同加密方式//String type() default "SM4";}2、在属性上加入注解需要加密的字段//三个实例类注意//请求报文@Datapublic class FallbackRequestModel implements Seri原创 2021-08-02 15:52:27 · 821 阅读 · 0 评论 -
java实现单链表的基本功能
链表1、链表的基本概念1、链表一般分为:单向链表双向链表环形链表2、基本概念链表实际上是线性表的链式存储结构,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的,链表的长度不是固定的,链表数据的这一特点使其可以非常的方便地实现节点的插入和删除操作链表的每个元素称为一个节点,每个节点都可以存储在内存中的不同的位置,为了表示每个元素与后继元素的逻辑关系,以便构成“一个节点链着一个节点”的链式存储结构,除了存储元素本身的信息外,还要存储其直原创 2021-06-24 17:49:02 · 172 阅读 · 2 评论 -
二叉树的增删以及遍历(java)
简介二叉树的相关概念,如,树高度,节点层数,节点度数,路径,叶节点,分支节点,根节点,父节点,左节点,右节点,兄弟节点,祖先节点,子孙节点,左子树,右子树等基本概念,不再赘述。本文主要讲解二叉树的创建,删除,以及四种遍历方式。二叉树二叉树是一个递归的数据结构,每个节点最多有两个子节点。通常二叉树是二分查找树,每个节点它的值大于或者等于在它左子树节点上的值,小于或者等于在它右子树节点上的值,如下图二叉树的遍历方式有4种:前序遍历:root -> left -> right中序遍原创 2021-06-24 16:23:30 · 223 阅读 · 1 评论 -
雪花算法生成id
代码如下:/** * 雪花算法生产id */public class IdWorker { //因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。 //机器ID 2进制5位 32位减掉1位 31个 private static long workerId; //机房ID 2进制5位 32位减掉1位 31个 private static long datacenterId;原创 2021-04-15 16:06:50 · 283 阅读 · 0 评论 -
整数反转
LeetCode算法题题目描述:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = 123输出:321示例 2:输入:x = -123输出:-321示例 3:输入:x = 120输出:21思路分析:刚开始看到这个题目的时候,我脑海里浮现了好几种解题思路,用栈,亦或者将其转换为字符串原创 2021-04-09 16:48:30 · 152 阅读 · 5 评论 -
Java单链表反转
在力扣上看到一个题,面试的过程中也遇到过,今天和大家分享一下这个题方法一:迭代假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。我们需要反转两个节点之间的连接,所以需要定义两个指针,就是 pre 和curr令curr = headpre = null令curr.next = pre 就反转过去了但原创 2021-03-12 18:04:55 · 240 阅读 · 1 评论 -
使用map判断数组中的重复元素和个数,以及不重复元素的个数
编写程序随机生成一个100个整数元素(元素小于100)的数组,然后计算出这100个元素中有多少个不重复的元素?每个元素分别重复了多少次?思路分析1、循环数组,添加到map中2、因为map存储的是键值对,同时键值不能重复,所以我们把数组中的元素当做键,个数当做值。代码如下public class Test { public static void main(String[] args) { int[] arr = new int[100]; Random ra原创 2021-03-06 12:04:28 · 3450 阅读 · 3 评论 -
哈希表的简单实现
哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。所以哈希表是由数组和链表组成的例题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时, 要求查找到该员工的 所有信息.要求:不使用数据库,速度越快越好=>哈希表(散列)添原创 2021-01-27 09:25:25 · 241 阅读 · 0 评论 -
查找算法
二分法查找二分法查找又叫折半查找,当数据量很大适宜采用该方法。注意采用二分法查找时,数据需是排好序的。假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。java代码:public class BinarySearch { public static void main(String[] args) { int[] arr = {8,6,1,9原创 2021-01-25 18:35:57 · 184 阅读 · 2 评论 -
八皇后问题
八皇后问题八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。回溯算法定义回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索原创 2021-01-12 21:49:06 · 1318 阅读 · 2 评论 -
逆波兰表达式
逆波兰表达式1、前言看这边文章之前,我们首先要知道什么是逆波兰表达式。逆波兰表达式又叫做后缀表达式,是波兰的以为逻辑学家于1929年首先提出的一种表达式的表示方法。逆波兰表达式把运算量写在前面,把运算符写在后面。我们知道逆波兰表达式又叫做后缀表达式,那么你是不是就有这样的猜想?是不是还有前缀表达式,没错,不仅仅有前缀表达式,还有中缀表达式,而中缀表达式是我们见过最多的一种。前缀表达式:前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。比如:- × + 3 4 5 6中缀表达式就是常见的运算原创 2021-01-11 23:00:49 · 777 阅读 · 0 评论 -
约瑟夫问题
约瑟夫问题约瑟夫问题有时也称为约瑟夫斯置换,类似问题又称为约瑟夫环。又称“丢手绢问题”.问题由来据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人原创 2021-01-07 22:45:48 · 477 阅读 · 0 评论 -
排序——快速排序
快速排序快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。排序原理:1、首先设定一个分界值,通过该分界值将数组分成左右两部分;2、将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;3、然后,左边和右边的数原创 2020-11-21 14:54:11 · 326 阅读 · 1 评论 -
归并排序
归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。算法描述把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。动画演示:需求:排序前:{8,4,5,7,1,3,6,2}排序后:{1,2,3,4,5,6,7,8}原创 2020-11-21 13:54:20 · 1154 阅读 · 1 评论 -
递归算法
递归算法定义:定义方法时,在方法内部调用方法本身,称之为递归。例:public void test(){ System.out.println("断剑重铸之日,骑士归来之时"); test();}作用:它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。注意事项:在递归中,不能无限制的调用自己,必须要有边界条件,能够让递归结束,因为每一次递归调用都会在栈内存开辟新的原创 2020-11-21 12:54:47 · 289 阅读 · 1 评论 -
希尔排序
希尔排序前言之前几篇文章中讲述了基础排序,包括冒泡排序,选择排序还有插入排序,并且对他们在最坏情况下的时间复杂度做了分析,发现都是O(N^2),而平方阶通过我们之前学习算法分析我们知道,随着输入规模的增大,时间成本将急剧上升,所以这些基本排序方法不能处理更大规模的问题,接下来我们学习一些高级的排序算法,争取降低算法的时间复杂度最高阶次幂。希尔排序:希尔排序(Shell Sort)是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。插入排序上一篇文章学习插入排序的时候,原创 2020-11-21 12:13:13 · 265 阅读 · 0 评论 -
插入排序
插入排序插入排序(Insertion sort)一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法,是一种简单直观且稳定的排序算法。基本思想:插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。应用:插入排序适用于已经有部分数据已经排好,并且排好的部分越大越好。一般在输入规模大原创 2020-11-20 16:37:30 · 644 阅读 · 0 评论 -
简单选择排序
简单选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:1、第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置。2、然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。3、以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。需求:排序前:{4,6,8,7,9,2,10,1}排序后:{1,2,4,5,7,8,9,10}画图分析:...原创 2020-11-20 14:47:02 · 13071 阅读 · 6 评论 -
冒泡排序
简单排序在我们的程序中,排序是非常常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些订单,按照订单的日期进行排序;再比如查询一些商品,按照商品的价格进行排序等等。所以,接下来我们要学习一些常见的排序算法。冒泡排序(Bubble Sort)冒泡排序是一种计算机科学领域的比较简单的排序算法,顾名思义在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样需求:排序前:{4,5,6,3,2,1}排序后:{1,2,3,4,5,6}排序原理:1原创 2020-11-20 11:14:18 · 165 阅读 · 0 评论