数据结构和算法
掌握基本的数据结构和算法,提升编程内功
mischen520
JAVA高级架构师
展开
-
java实现暴力匹配算法详解
从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符。循环结束后通过判断指向子字符串的索引大小判断是否匹配到,即如果匹配到,则索引大小应该为子字符串长度大小,否则就没有匹配到。如果后边的字符匹配不成功,则重置长字符串索引为当前开始索引的下一个,重置子字符串索引为0,重复前边的步骤。如果第一个字符就不相等,则通过指针后移依次判断长字符串后边的字符是否和第一个字符相等,直到字符串末尾。一旦在长字符串中匹配到子字符串的第一个字符,就依次再比较后边的字符。原创 2022-12-08 20:38:30 · 623 阅读 · 0 评论 -
java实现贪心算法代码示例
什么是贪心算法?贪心算法(greedy algorithm,又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 。算法思路贪心算法一般按如下步骤进行:①建立数学模型来描述问题 。②把求解的问题分成若干个子问题。③对每个子问题求解,得到子问题的局部最优解。④把子问题的解局部最优解合成原来解问题的一个解。贪心算法是一种对某些求最优解问题的更简单、更原创 2022-12-05 20:15:25 · 739 阅读 · 0 评论 -
动态规划算法详解
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。原创 2022-12-01 20:40:22 · 462 阅读 · 0 评论 -
java解决汉诺塔问题
【代码】java解决汉诺塔问题。原创 2022-12-01 08:14:40 · 132 阅读 · 0 评论 -
分治算法详解
这样,就把16个硬币的问题分成两个8硬币的问题来解决。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。不难发现,在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。原创 2022-11-30 20:00:44 · 567 阅读 · 0 评论 -
java实现插入排序
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即它们的位置保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的;插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。原创 2022-11-29 18:51:00 · 212 阅读 · 0 评论 -
java实现选择排序
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。选择排序是不稳定的排序方法。原创 2022-11-28 20:46:10 · 219 阅读 · 0 评论 -
java实现冒泡排序
如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。原创 2022-11-28 20:11:21 · 150 阅读 · 0 评论 -
java迷宫寻找最短路径
利用广度优先遍历算法的特点,由于迷宫每次只能走一格,所以对于任意一个节点,bfs第一次到达该点时一定是最短路径。原创 2022-11-24 20:36:27 · 1209 阅读 · 0 评论 -
java使用栈实现简单计算器功能
②如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果入数栈,然后将当前的操作符入符号栈;如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。4.当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行;1.通过一个index值(索引),来遍历表达式;5.最后在数栈只有─个数字,就是表达式的结果。①如果发现当前的符号栈为空,就直接入栈;2.如果发现是一个数字,就直接入数栈;原创 2022-11-20 11:34:44 · 461 阅读 · 0 评论 -
栈实现综合计算器
②如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果入数栈,然后将当前的操作符入符号栈;如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。4.当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行;1.通过一个index值(索引),来遍历表达式;5.最后在数栈只有─个数字,就是表达式的结果。①如果发现当前的符号栈为空,就直接入栈;2.如果发现是一个数字,就直接入数栈;原创 2022-11-20 11:26:22 · 103 阅读 · 0 评论 -
什么是栈?栈的特点和应用场景
栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。1、子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。3、表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。原创 2022-11-19 09:22:56 · 1809 阅读 · 0 评论 -
java使用数组模拟栈
允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。1、子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容,下面我们就用数组模拟栈的出栈,入栈等操作。实现思路分析,并画出示意图。原创 2022-11-19 09:19:13 · 210 阅读 · 0 评论 -
什么是一致性哈希算法?一致性哈希算法原理刨析
hash 环的倾斜在极端情况下,仍然有可能引起系统的崩溃,为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点,一个实际物理节点可以对应多个虚拟节点,虚拟节点越多,hash环上的节点就越多,缓存被均匀分布的概率就越大,hash环倾斜所带来的影响就越小,同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射。圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……原创 2022-11-13 10:45:28 · 435 阅读 · 0 评论 -
什么是哈希算法?什么是哈希冲突以及怎样解决哈希冲突?
哈希算法有很多种,一般来讲哈希越长的算法,安全性也就越高,安全度足够高的哈希,或者说没有任何人能够成功实现碰撞的哈希,才有资格被考虑用在加密场合,而这类的哈希算法也被叫做加密哈希算法。这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…哈希函数的目的是将任意长度的输入转换为固定长度的输出,这就意味着,不同的输入可能会转换成相同的输出,这就导致了「哈希冲突」,也叫「哈希碰撞」。原创 2022-11-13 09:34:36 · 1090 阅读 · 0 评论 -
什么是稀疏数组?稀疏数组主要解决什么问题?
稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。如下图:左边是原始数组,右边是稀疏数组。原创 2022-11-09 08:16:33 · 161 阅读 · 0 评论 -
详解负载均衡算法
1、轮询法将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。2、随机法通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。3、源地址哈希法源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要原创 2022-07-07 08:45:36 · 209 阅读 · 0 评论 -
给定一个字符串,查找第一个不重复的字符(最优解法)
package com.mischen.it.test;/** * @ClassName TestInterview * @Description DOTO 给定一个字符串,查找第一个不重复的字符 * @Author mischen * @Date 2021/9/30 0030 7:22 * @Version 1.0 **/public class TestInterview { static String str = new String("asdsdasfbft");原创 2021-10-03 08:05:11 · 1485 阅读 · 0 评论 -
不对称密码加密算法
原创 2021-08-28 08:50:47 · 175 阅读 · 0 评论 -
对称密钥体制及典型算法
原创 2021-08-28 08:47:13 · 670 阅读 · 0 评论 -
二叉树的特点?
(1)树执行查找、删除、插入的时间复杂度都是O(logN)(2)遍历二叉树的方法包括前序、中序、后序(3)非平衡树指的是根的左右两边的子节点的数量不一致(4)在非空二叉树中,第i层的结点总数不超过 , i>=1;(5)深度为h的二叉树最多有个结点(h>=1),最少有h个结点;(6)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;...原创 2021-07-08 20:55:24 · 209 阅读 · 0 评论 -
什么是二叉树?
原创 2021-07-08 20:45:12 · 136 阅读 · 0 评论 -
利用Collections.sort给对象排序,查找对象里面自己想要的值(核心代码逻辑实现)
直接上代码,根据我多年的工作经验,下面这段代码经过改编,有可能会经常用到,如下:package com.itmuch.cloud.test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * @author...原创 2020-03-27 23:16:21 · 695 阅读 · 0 评论 -
java中的安全加密
11.1 数字签名 2.验证过程发送者:将报文通过 hash 算法生成摘要,用私钥加密生成签名。 接收者:使用公钥解密数字签名,得到摘要 A,再对报文进行 Hash 算法得到摘 要 B,比较 A 和 B,一致则表示没有被修改。 11.2 数字证书 数字证书则是由证书认证机构(CA, Certificate Authority)对证书申请者真 实身份验证之后,用 CA 的根证...原创 2020-03-23 22:01:39 · 733 阅读 · 0 评论 -
java 中垃圾收集的方法有哪些?
1. 标记-清除: 这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被 回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题:1.效率不 高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在 分配较大的对象时,由于没有充足的连续内存而提前触发一次 GC 动作。 2. 复制算法: 为了解决效率问题,复制算法将可用内存按容量...原创 2020-03-21 09:14:29 · 822 阅读 · 0 评论 -
MD5加密算法示例
工具类代码示例:package com.mischen.it.util;import java.security.MessageDigest;/** * */public class MD5Util { /** * 私有构造方法,将该工具类设为单例模式. */ private MD5Util() { } private...原创 2020-02-01 10:22:41 · 484 阅读 · 0 评论 -
一致性hash在java中的实际运用
/** * 获取路由到的内存队列 * @param productId 商品id * @return 内存队列 */ private ArrayBlockingQueue<Request> getRoutingQueue(Integer productId) { RequestQueue requestQueue = RequestQueue.getInstan...原创 2020-01-11 17:08:26 · 195 阅读 · 1 评论 -
连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
题目描述•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。输入描述:连续输入字符串(输入2次,每个字符串长度小于100)输出描述:输出到长度为8的新字符串数组示例1输入abc123456789输出abc000001234567890000000...原创 2019-08-18 15:42:36 · 2925 阅读 · 0 评论 -
写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
题目描述写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。输入描述:第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。输出描述:输出输入字符串中含有该字符的个数。示例1输入ABCDEFA输出1...原创 2019-08-18 08:03:22 · 1440 阅读 · 0 评论 -
计算字符串最后一个单词的长度,单词以空格隔开(java)
import java.util.Scanner;public class Demo { public static void main(String[] args){ Scanner in=new Scanner(System.in); String s=in.nextLine(); print(s); } public...原创 2019-08-17 10:00:12 · 707 阅读 · 0 评论