算法设计
一些算法总结
I an
后端开发工程师
展开
-
阻塞检查机制
如何感知线程是否发生阻塞,在很多应用场景下这都是值得我们去思考的问题。如果线程因为各种原因长时间发生阻塞,则会影响系统执行效率,降低系统tps。为了感知线程阻塞问题,我们可以建立一套线程阻塞自感知机制,对线程状态进行监控,当检测到当前任务执行线程的任务执行时间过长时,自动触发告警,提醒开发人员系统存在线程阻塞,进行问题定位和排查。原创 2022-09-03 22:35:35 · 556 阅读 · 0 评论 -
8086汇编实现KMP算法(中南大学智能计组实验)
中南大学智能科学与技术专业计组实验题目:实现 KMP 算法,输入两个字符串(可以直接保存在内存中),实现快速匹配,用8086汇编实现 这个题目是所有实验题中最难搞得一个,这里附上代码,学弟学妹们需要的自取DATA SEGMENT TARGET DB "created by ian in 2021/7/8" ;define the target TARGET_LEN DW 26 ;length of原创 2021-07-09 09:54:17 · 1037 阅读 · 2 评论 -
求最大公约数
求两数的最大公约数的方法: 方法一: public int gcd(int a, int b) { int min=Math.min(a,b); while (min>0){ if(a%min==0&&b%min==0){ return min; } min--; } return min; }原创 2021-06-24 08:50:32 · 127 阅读 · 0 评论 -
动态规划:01背包问题
01背包问题是最基本的背包问题,其题意可大概描述为一共有N件物品,每件物品都有其相应的体积和价值,给你一个背包,背包有容量上限,怎样往背包中装物品,能让背包中的物品价值最高。 此类问题是典型的动态规划问题,动态规划的目标是背包中物品的总价值,动态规划的变量是物品的体积和价值,以及背包的容量上限,经过分析,我们可以定义一下dp状态: 原创 2021-06-06 11:39:10 · 7115 阅读 · 0 评论 -
用队列实现栈
本文所解决的问题是如何用队列来实现栈 我们采用双队列的思想,这两个队列地位是一致的,当栈非空时,一定是一个队列为空,另一个队列非空。当进行入栈操作时,我们找到非空队列,在该队列添加元素;当进行出栈操作时,我们同样找到非空队列,将该非空队列除队尾元素外的其余元素添加到另一队列,然后让队尾元素出队。class MyStack { Queue<Integer>queue1; Queue<Inte原创 2021-03-05 11:18:41 · 185 阅读 · 0 评论 -
用栈实现队列
本文所解决的问题是如何用栈来实现队列 我们采取双栈的思想。一个栈为输入栈,用作数据的输入,另一个栈为输出栈,用作数据的输出。当需要数据输入时,需要保证输出栈的数据已全部压入输入栈中;当需要数据输出时,也需要保证输入栈中的数据已全部压入输出栈中。class Queue { private final Deque<Integer>stack_in; private final Deque<In原创 2021-03-05 10:58:28 · 131 阅读 · 1 评论 -
自己实现一个最小堆
说明:用数组int[ ]queue来充当堆,用变量int length来记录队列的有效元素长度sort( ):实现堆排序(堆排序算法详解:点击此处)poll( ):弹出队列首元素add( ):往堆中添加元素peek( ):返回队列首元素class priorityQueue{ int[] queue=new int[5000]; int length=0; //实现堆排序 private void sort(){ for(int i=length/2-1原创 2021-02-11 23:13:52 · 183 阅读 · 0 评论 -
迪杰斯特拉算法
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,用一个数组int[ ]dist保存起点到其余各点的最短路径距离,采用贪心算法的策略,每次遍历到起点距离最近且未访问过的顶点的邻接节点并不断更新dist数组,直到扩展到终点为止。...原创 2021-02-04 23:39:45 · 2482 阅读 · 1 评论 -
堆排序算法(Java实现)
1.数据结构——堆(Heap) 堆是计算机科学中一类特殊的数据结构的总称,是可以看成一棵树的数组对象。 堆总是满足以下两条性质: 1.堆中的每一个节点都满足其值总是大于或小于它的所有子结点。2.算法思想堆排序(Heapsort)是指利用堆这种数据结构所设计原创 2020-12-12 13:05:51 · 433 阅读 · 0 评论 -
链表排序算法(Java实现)
插入排序 对链表进行插入排序,是最简单的一种链表排序算法,用于插入排序是迭代的,所以每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。 插入排序的时间复杂度为O(N^2),空间复杂度为O(1)cla原创 2020-11-22 21:04:13 · 2357 阅读 · 0 评论 -
归并排序(Java实现)
基本思想 归并排序,是创建在归并操作上的一种有效的排序算法。归并排序算法思想是建立在分治法之上的,思路简单,时间复杂度不会过于复杂,主要适用于总体无序,但子序列相对有序的情况。基本步骤 归并排序既可以采用递归思想,也可以采用迭代思想,无论采用哪种思想,其大致都可以分为三大步骤:分解序列:将序列进行二分序列排序:将二分后的各个子序列进行排序序列排序:合并各个子序列算法图示(递归)...原创 2020-11-07 23:07:30 · 142 阅读 · 0 评论 -
O(1) 时间插入、删除和获取随机元素(Java实现)
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。注意: 允许出现重复元素。insert(val):向集合中插入元素 val。remove(val):当 val 存在时,从集合中移除一个 val。getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。题目要求我们在时间复杂度在O(1)下执行上述所有操作,首先我们需要选择一个集合来存放数据,此处我们的选择是动态数组,对于动态数组来说,其在末尾插入元素的时间复杂度能够满足要求,就是原创 2020-10-31 09:34:37 · 357 阅读 · 0 评论 -
链表反转(Java实现)
对一个单链表进行反转,有两种方法可以实现,一种是迭代法,一种是递归法示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL1.迭代法:维护两个指针,curr指向当前需要修改next指针的节点,prev指向curr指向的节点的next指针修改后所指向的节点,从前向后遍历链表,同时进行链表的反转class Solution { public ListNode reverseList(List原创 2020-10-21 15:06:02 · 714 阅读 · 0 评论 -
用中序和后序(前序)遍历序列构造二叉树
~ ~ ~ ~ ~ ~ 这是一个经典的二叉树问题,给你一个二叉树中序遍历序列和二叉树后序遍历序列,或者二叉树中序遍历序列和二叉树前序遍历序列,让你逆向还原出一棵二叉树。 ~ ~ ~ ~ ~ ~ 在设计算法解决这个问题之前,我们需要明白的一点:想要逆原创 2020-09-26 19:38:35 · 807 阅读 · 0 评论 -
并查集的应用之判断环路
~ ~ ~ 并查集,顾名思义,就是集合的合并与元素的查找。是一种树形数据结构。 ~ ~ ~ 在用并查集处理有N个元素的集合应用问题时,我们首先需要初始化并查集——分别让这N个元素构成N个单元素集合。然后按照给定条件有序的合并这N个元素所在集合,其间要反复查找一个元素在哪个集合中。 ~ ~ ~ 并查集可以应用在无向原创 2020-09-19 09:39:03 · 1734 阅读 · 1 评论 -
快速排序(Java实现)
快速排序(Quick Sort),是一种效率很高的排序算法,是对冒泡排序的一种改进,它的基本思想是在数组中选择一个数作为pivot(排序中心),将数组元素分成比pivot小的和比pivot大的两部分,一部分是比pivot小的数组元素,另一部分是pivot大的数组元素(左边部分的数组元素比右边部分的数组元素小),然后再按此方法对两部分数组分别进行同样的快速排序算法,此过程可以用到递归进行处理。...原创 2020-09-12 20:15:34 · 241 阅读 · 0 评论 -
欧拉图(欧拉回路与欧拉通路)
在一个图中(有向图或无向图),如果能够从一个结点出发一次性通过所有边且每条边只能通过一次,在通过所有边后能够回到出发点,则该回路称为该图的欧拉回路;不能回到出发点,则该通路称为欧拉通路。含有欧拉回路的图称为欧拉图,含欧拉通路的称为半欧拉图。最简单的欧拉图:最简单的半欧拉图:如何用算法得到一张有向图的欧拉通路呢(无向图算法类似)?我们来看下面这张图:假设1是起点,则有效的欧拉通路是1–>3–>4–>5–>3–>1–>2;看似我们只需要用最普通的DFS算法(DF原创 2020-08-27 21:35:42 · 3068 阅读 · 0 评论 -
KMP算法(java实现)
kmp算法是一种改进的字符串匹配方法,该算法的核心是利用字符串匹配失败后的可用信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。什么是“字符串匹配失败”?首先,我们先要了解kmp主要的匹配机制——kmp的匹配机制是在BF算法上进行优化的,那么,什么是BF算法呢?BF(brute force)算法就是字符串的暴力匹配法:对主串的每个字符进行一一匹配,匹配的方式也是逐字符进行检查 public boolean BF(S原创 2020-08-24 20:19:21 · 916 阅读 · 1 评论 -
如何找到链表最中间的结点
维持两个指针,一个是快指针,一个是慢指针,对链表进行遍历,快指针每次走两个单位,慢指针每次走一个单位,当快指针到达终点时,若结点个数为奇数,慢指针指向最中间,若结点个数为偶数,慢指针指向中间偏右class Solution { public ListNode findMid(ListNode start){ ListNode left=start,right=start; while(right!=null&&right.next!=null){原创 2020-08-18 16:38:13 · 220 阅读 · 0 评论 -
二叉搜索树的遍历搜索(Java实现)
1.二叉搜索树的概念一棵二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以以链表的数据结构来表示,其中的每个结点就是一个对象。2.二叉树结点对象的属性(1)key(关键字,用于代表整个对象)(2)基本数据和信息(3)left、right和p,分别指向结点的左子结点,右子结点,父结点(父节点的使用较少时,可以省略) class TreeNode { int key; //关键字 TreeNode left; //左节点 TreeNode right; //右原创 2020-08-11 19:32:39 · 395 阅读 · 0 评论 -
字典树(Java实现)
字典树又称单词查找树,Trie树,是一种树形结构,字典树的优点是利用字符串的公共前缀来提高查询效率,最大限度的减少字符串在查询过程中的字符比较次数。(字典树的简单实现图)字典树的结构有三点主要规范:1.根节点不包含任何字符2.根节点以外的任何结点都只包含一个字符3.每个结点的子结点所包含的字符都不相同字典树的基本结构实现: class Trie{ /* * times用于记录该字符的存储次数(若为0说明没有存储该字符) * ch数组是子结点原创 2020-08-07 13:35:07 · 775 阅读 · 0 评论 -
图的搜索——BFS和DFS
图是一种重要的数据结构,许多图的算法一开始都会先通过搜索来获取图的结构或者图中结点所保存的信息,图的搜索技巧就是图的相关算法的核心。图的搜索算法有两种设计核心,分别是BFS(breadth first search)和DFS(depth first search),表示广度优先搜索和深度优先搜索。1.BFS搜索算法所谓广度优先算法,就是对图G的边以结点为单位进行系统性的探索来发现从源节点出发能到达的其他所有结点,广度优先算法的特点是搜索位置每到达一个点,就会挨个继续探索这个点的所有出边(边的指向是从该原创 2020-08-04 21:39:29 · 372 阅读 · 0 评论 -
二分法查找的死循环问题
二分法作为一种常用算法虽然简单,但对于边界的处理是非常复杂的,在稍微复杂一点的问题中一左一右两个指针很容易出现越界或者返回结果错误等情况,这里记录一种二分法的改良写法,让你不再为边界问题而苦恼class Solution { public int myBinarySearch(int[] nums, int target) throws Exception{ int left=0; int right=nums.length-1;原创 2020-07-29 23:47:47 · 763 阅读 · 0 评论 -
递归算法判断回文字符串
利用动态规划的思想,若一个字符串是回文字符串,那么它两头的字符一定相等,同时去掉两头的子字符串一定是回文字符串。利用好这一点,就可以设计递归方案,从目标字符串一路递归到只剩下一个字符(奇数字符串)或没有字符(偶数字符),此时,该子字符串一定是回文字符串,然后再以此结果回溯,就可以得到结果c++代码: bool PalinString(string obj) { if (obj == "" || obj.length() == 1)return true; else if (obj[0] ==原创 2020-07-22 20:44:55 · 3550 阅读 · 0 评论 -
C++程序解线性一次方程组
利用矩阵的思想解方程组,将线性一次方程组写成增广矩阵,编写代码将增广矩阵中的系数矩阵通过行与行相消转化为上三角矩阵。int main() //解十二元一次方程组 { srand((unsigned)time(NULL)); double a[12][13]; for (int i = 0;i < 12;i++) { for (int k = 0;k < 13;k++) { a[i][k] = ra原创 2020-06-22 11:25:58 · 1387 阅读 · 0 评论