算法
文章平均质量分 61
金州饿霸
这个作者很懒,什么都没留下…
展开
-
算法设计与分析/动态规划——最长公共子序列LCS及模板
一,问题描述给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA二,算法求解这是一个动态规划的题目。对于可用动态规划求解的问题,一般有两个特征:①最优子结构;②重叠子问题①最优子结构设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,原创 2021-10-20 17:36:27 · 242 阅读 · 0 评论 -
动态规划——矩阵连乘问题
动态规划简介动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结原创 2021-10-20 12:11:17 · 930 阅读 · 0 评论 -
图的五种最短路径算法
本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法。1)深度或广度优先搜索算法(解决单源最短路径)从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一条则为最短路径。下面是核心代码:void dfs(int cur,int dst){ if(minpath<dst) return;//当前走过的路径大雨之前的最短路径,没有必要再走下去了 if(cur.原创 2021-10-16 23:43:39 · 5420 阅读 · 0 评论 -
无序数组中找到左侧比他小右侧比他大的数
无序数组中找到左侧比他小右侧比他大的数,要求时间复杂度在O(n)。思路是单独创建一个标记数组,先从左往右遍历(i=0开始),找最大,如果是当前的最大,max标记位置和当前游标有max=i,则设置标记数组位置+1;同理,从len-1的位置,找最小,即从右往左遍历(i=len-1开始),找最小,如果是当前的最小,min标记位置和当前游标min=i,并把标记数组位置+1;最终标记数组中如果既是比左侧大的数又是比右侧小的数的值为2,用标记数组过滤一次原数组就可以得到。时间复杂度为3n,空间为n...原创 2021-10-13 11:31:23 · 710 阅读 · 0 评论 -
大整数相乘(分治法)
分治法的原理讨论问题时,先来了解一下什么是分治法。分治法的意思就是,分而治之,也就是把一个问题,拆分成几个小问题,最后再汇总解决的方法通过大整数相乘问题来了解分治法假如现在我们要求两个大整数相乘的乘积,如1234 * 1234(这里为了了分析简便,所以不举形如1234567891234567这样的大整数,不必要在此纠结),那么按照我们小学学的乘法,就是用乘数的每一项去和1234相乘,这样很明显,算法的时间复杂度是O(n^2),效率很低下,那么有没有一种更好的方式?我们可以使用分治..原创 2021-09-17 12:10:24 · 1748 阅读 · 0 评论 -
关于回文数的一些题目
一什么是回文数所谓回文数,就是说一个数字从左边读和从右边读的结果是一模一样的,比如12321。二判断一个字符串是否是回文字符串代码://判断一字符串是否是回文字符串 #include <iostream>#include <string>using namespace std;int fun(string s){ int i, len = s.size()-1;wsertyuiop for(i = 0; i < len; i++, len--..原创 2021-03-18 11:08:28 · 1074 阅读 · 0 评论 -
KMP字符串模式匹配算法
一简单的字符串匹配算法1算法思想:分别用计数指针i和j指示主串S和模式串T中当前正待比较的字符串位置。从主串S的第一个字符起,与模式串T的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起,重新和模式的字符比较;以此类推,直至模式T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功,函数值为与模式T中第一个字符相等的字符在主串S中的序号,否则匹配不成功,函数值为0。2实现代码:S="ababcabcac",T="abcac",结果应该为6。...原创 2020-07-31 20:00:07 · 923 阅读 · 0 评论 -
让人眼前一亮的算法------唯一ID生成器snowflake
分布式全局唯一ID生成器很多场景需要使用全局唯一ID,用来标识唯一一条消息,唯一一笔交易,唯一一个用户,唯一一张图片等等。传统数据库表的自增主键是很简单的一种实现方式,前提是你没有分库,也没有分表,如果你分表了,id就会重复,失去唯一性:当然,通过数据库的一些配置,使不同的分表以不同的起始值但是相同的步长自增,可以绕开这个限制:但是,如果哪天发现数据量增大,原先的分表不够用...原创 2020-01-09 21:37:08 · 321 阅读 · 0 评论 -
让人眼前一亮的算法------时间轮
从定时任务说起 自然界中定时任务无处不在,太阳每天东升西落,候鸟的迁徙,树木的年轮,人们每天按时上班,每个月按时发工资、交房租,四季轮换,潮涨潮落,等等,从某种意义上说,都可以认为是定时任务。大概很少有人想过,这些“定时”是怎样做到的。当然,计算机领域的同学们可能对此比较熟悉,毕竟工作中的定时任务也是无处不在的:每天凌晨更新一波数据库,每天9点发一波邮件,每隔10秒钟抢一次火车票。。。...原创 2020-01-09 21:25:46 · 288 阅读 · 0 评论 -
让人眼前一亮的算法------一致性Hash
背景随着时代的发展,数据量与日俱增,相比纵向扩展单机的性能,人们更倾向于横向扩展,将多台一般的廉价机器组成集群来充当超级计算机,节省了大量的成本,代价是极大地增加了系统的复杂性。为了应对这些复杂性,一批又一批分布式领域的技术相继诞生,其中不乏一些看过之后令人拍案叫绝的精彩的想法。从存储来说,数据量大的时候,一台机器不能胜任时,那么通常的做法是将数据分片,存储到多台机器上,通过集群的方式完成数...原创 2020-01-09 20:29:09 · 154 阅读 · 0 评论 -
让人眼前一亮的算法------布隆过滤器
问题假设你现在要处理这样一个问题,你有一个网站并且拥有很多访客,每当有用户访问时,你想知道这个ip是不是第一次访问你的网站。这是一个很常见的场景,为了完成这个功能,你很容易就会想到下面这个解决方案:把访客的ip存进一个hash表中,每当有新的访客到来时,先检查哈希表中是否有改访客的ip,如果有则说明该访客在黑名单中。你还知道,hash表的存取时间复杂度都是O(1),效率很高,因此你对你的方案...原创 2020-01-09 19:37:36 · 177 阅读 · 0 评论 -
求斐波那契数列的三种方法------递归法、for循环法、快速幂矩阵法
1 递归法求斐波那契数列,时间复杂度O(n^2),实现代码如下:#include <iostream>using namespace std;int Fib(int n) { if(n <= 2) return 1; else { return Fib(n-1) + Fib(n-2); } } int main(){ int n, result; ...原创 2020-01-05 08:25:17 · 3308 阅读 · 0 评论 -
Dijkstra算法分别用"邻接矩阵图"和"邻接表图"实现
一 邻接矩阵图:/** * Java: Dijkstra算法获取最短路径(邻接矩阵) * * @author skywang * @date 2014/04/24 */import java.io.IOException;import java.util.Scanner;public class MatrixUDG { private int mEdgNu...原创 2018-12-18 15:43:42 · 1109 阅读 · 0 评论 -
Dijkstra算法----- Java代码实现
转载于:http://www.cnblogs.com/skywang12345/迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集...转载 2018-12-18 10:43:09 · 453 阅读 · 0 评论 -
二叉树的遍历C++代码实现
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。二叉树的遍历方式常用的有四种:前序遍历、中序遍历、后序遍历和层序遍历。二叉树结点的定义代码如下://Definition for binary treestruct TreeNode { int val; TreeNode *left; TreeN...原创 2018-11-16 15:07:36 · 2682 阅读 · 0 评论 -
PAT (Advanced Level) 1064 Complete Binary Search Tree
1064 Complete Binary Search Tree (30 分)A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:The left subtree of a node contains only nodes with key...原创 2018-11-16 14:58:41 · 142 阅读 · 0 评论 -
C++中栈和队列的基本操作
使用标准库的栈和队列时,先包含相关的头文件#include<stack>#include<queue>定义栈如下:stack<int> s;定义队列如下:queue<int> q;栈提供了如下的操作:s.empty() 如果栈为空返回true,否则返回false s.size() ...原创 2018-11-15 21:27:23 · 240 阅读 · 0 评论 -
数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历
最近也是在准备笔试,由于没有系统的学过数据结构,所以每次在考到二叉树的遍历的时候都是直接跪,次数多了也就怒了,前些天也是准备论文没时间整这些,现在提交了,算是稍微轻松点了,所以花了半天的时间来学了下二叉树。现在记下来,以便后序查阅。一、二叉树的遍历概念 1. 二叉树的遍历是指从根结点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。(1). 前(...原创 2018-11-16 09:44:55 · 889 阅读 · 1 评论 -
PAT (Advanced Level) 1011 World Cup Betting
1011 World Cup Betting (20 分)With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battles for the World...原创 2018-11-15 21:17:47 · 132 阅读 · 0 评论 -
PAT (Advanced Level) 1008 Elevator
1008 Elevator (20 分)The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified...原创 2018-11-15 20:09:06 · 104 阅读 · 0 评论 -
利用冒泡排序对日期进行排序
package jave;/*日期排序*/public class DataSort { public static void main(String[] args) { Date[] days = new Date[5]; days[0] = new Date(2006, 5, 4); days[1] = new Date(2006, 7, 4); days[2] ...原创 2018-09-18 16:53:56 · 1023 阅读 · 0 评论 -
你所必须知道的三种基本求两个数最大公约数的算法
1 迭代法求最大公约数/*迭代法求最大公约数*原理:m n r;将r赋值给n,n赋值给m */ #include <iostream>using namespace std;int Gcd(int m, int n) { int r; r = m%n; while(r) { m = n; n = r; r = m%n; } return n;...原创 2018-09-30 20:14:00 · 1374 阅读 · 0 评论 -
头插法和尾插法建立单链表
/*头插法和尾插法建立单链表*/ #include <iostream>using namespace std;typedef int ElemType;typedef struct LNode { ElemType data;//定义数据域,存放元素值 struct LNode *next; }LinkList; //头插法建表(从尾部一个一个往前插入)v...原创 2018-09-29 20:39:27 · 1351 阅读 · 1 评论 -
PAT (Advanced Level) Practice 1031 Hello World for U (20 分)
1031 Hello World for U (20 分)Given any string of N (≥5) characters, you are asked to form the characters into the shape of U. For example, helloworld can be printed as:h de ll rlowoThat ...原创 2018-10-14 17:42:13 · 112 阅读 · 0 评论 -
PAT(Advanced Level)1001 A+B Format
1001 A+B Format (20 分)Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).Input Spe...原创 2018-10-19 16:11:34 · 286 阅读 · 0 评论 -
单词长度右对齐输出
题目:输入两个单词,以空格分隔,并在接下来的一行分别输出他们的长度,并于上一行的两个单词右对齐/*输入两个单词,以空格分隔,并在接下来的一行分别输出他们的长度,并于上一行的两个单词右对齐*/ #include <iostream>#include <string> using namespace std;int main(){ string s1, s2, ...原创 2018-10-19 21:28:12 · 190 阅读 · 0 评论 -
实现顺序表各种基本运算的算法
编写一个头文件SqList.h,实现顺序表的各种基本操作,并在此基础上设计一个主程序(exp2_1.cpp)完成如下功能:初始化顺序表L 依次采用尾插法插入a,b,c,d,e元素 输出顺序表L 输出顺序表L的长度 判断顺序表L是否为空 输出顺序表L的第3个元素 输出元素a的位置 在第4个元素位置上插入f元素 输出顺序表L 删除L的第3个元素 输出顺序表L 释放顺序表 ...原创 2018-10-17 20:41:07 · 18118 阅读 · 6 评论 -
实现单链表各种基本运算的算法
编写一个头文件LinkList.h,实现单链表的各种基本运算,并在此基础上设计一个主程序(exp2_2.cpp)完成如下功能:初始化单链表h 依次采用尾插法插入a,b,c,d,e元素 输出单链表h 输出单链表h的长度 判断单链表h是否为空 输出单链表h的第3个元素 输出元素a的位置 在第4个元素位置上插入f元素 输出单链表h 删除h的第3个元素 输出单链表h 释放单链表h...原创 2018-10-17 20:44:09 · 19509 阅读 · 0 评论 -
PAT (Advanced Level) 1006 Sign In and Sign Out
At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in's and out's, you...原创 2018-10-20 17:00:13 · 169 阅读 · 0 评论 -
插入类排序-----直接插入排序
//直接插入排序:将第一个数据看成有序表,将后面的数据一次插入表中# include<stdio.h>//时间复杂度 O(n^2) 稳定 void InsertSort(int a[], int n){ int i, j; for(i = 1; i <= n; i++){ if(a[i] < a[i-1]){ //若插入的第i个数大于它的前一个数i-1,就直...原创 2018-10-26 20:44:16 · 142 阅读 · 0 评论 -
插入类排序-----希尔排序
//希尔排序:取增量d1的分为一组,共分成d1组分别进行插入排序,然后每组对应元素放在一起,然后取d2...知道d=1 //希尔排序的代码可以近乎看成把1换成dk/*我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元...原创 2018-10-26 20:45:05 · 105 阅读 · 0 评论 -
归并类排序-----归并排序
/*归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。*/# include<stdio.h> //时间复杂度 O(nlogn) 稳定 //合并两个已经排好顺序的数组 void Merge(int a[], int start, int mid, int en...原创 2018-10-26 20:46:02 · 778 阅读 · 0 评论 -
交换类排序-----冒泡排序
冒泡排序://冒泡排序# include<stdio.h>//时间复杂度 O(n^2) 稳定 void BubbleSort(int a[], int n){ for(int i = 1; i <= n; i++) //每一趟结束都把一个最大的数放到最下面 for(int j = 1; j <= n-i; j++) if(a[j] >...原创 2018-10-26 20:48:38 · 230 阅读 · 0 评论 -
交换类排序-----快速排序
//快速排序# include<stdio.h>//时间复杂度 O(nlogn) 不稳定 void QuickSort(int a[], int n){ int low, high, p, t; if(n < 2)//只有一个数,不用交换 return; p = a[n/2]; //p取数组a的中间的数 for(low = 0, high = n-1;; lo...原创 2018-10-26 20:49:28 · 124 阅读 · 0 评论 -
选择类排序-----简单选择排序
//简单选择排序:遍历一次找到最小与第一个元素互换位置,再从第二个元素开始遍历找到最小与第二个元素互换位置... # include<stdio.h>//时间复杂度 O(n^2) 稳定void SelectSort(int a[], int n){ for(int i = 1; i < n; i++){ //第一趟共比较n-1次 int k = i; //k总是...原创 2018-10-26 20:51:00 · 124 阅读 · 0 评论 -
选择类排序-----堆排序
/*堆排序:初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最大(或最小)的元素,这时堆的根节点的数最大(或者最小)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列*...原创 2018-10-27 09:32:47 · 179 阅读 · 0 评论 -
二分查找
对数进行查找:package jave;/*二分查找*/public class BinarySearch { public static int binarySearch(int[] a, int num) { if(a.length == 0) return -1; int startPos = 0; int endPos = a.length - 1; i...原创 2018-09-20 17:57:28 · 168 阅读 · 0 评论