算法

最短路径算法整理

淺唱寂寞╮ 提交于 2020-01-31 04:51:51
最短路径 1.概念 单源最短路径 单源最短路径实际是计算源点到其他各个顶点的最短路径的长度,常见算法有dijkstra算法 全局最短路径 全局最短路径实际是计算每个源点到其他各个顶点的最短路径的长度,我们可以调用dijkstra算法N次(这样没有Floyd算法快),常见解决全局最短路径的方法是Floyd-Warshall算法,但是Floyd-Warshall算法不能解决负边问题。为了解决负边问题,我们使用Bellman-Ford算法,或者SPFA(Shortest Path Faster Algorithm),SPFA是Bellman-Ford队列优化算法的别称 注意点 很多人看到dijkstra、Floyd-Warshall、SPFA、Bellman-Ford会比较头疼。那就仅先掌握2种算法,优先掌握dijkstra、Floyd-Warshall算法,毕竟,这两个收录在教科书内,理论上来说会比较重要。而在PAT解题过程中,也是优先使用Dijstra算法(PAT往往不会因为短路问题超时)。 2.Dijkstra Dijkstra算法解决单源带权最短路径十分有效。步骤如下: 令S = {源点s + 已经确定了最短路径的顶点vi} 对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点,即路径{ S -> (vi 包含于 S) -> v}的最小长度

Java基础知识之入门介绍笔记

孤人 提交于 2020-01-31 02:40:12
Java体系:JDK初步、Java Web编程、J2EE(企业级应用)、J2ME(移动设备)、移动增值(SP运营商)等。 Java基础与数据结构及算法之间的关系? Java中有完善的数据结构及封装好的算法方法。在中型互联网公司数据结构和算法是面试必须掌握的。数据结构与算法的学习的侧重点:搜索的算法,排序的算法,时间复杂度,链表。 Java Web 包含的内容有HTML、CSS、JSP、Servlet、数据库、JDBC及一些后端的框架。 J2EE包含了Java Web的内容。Sun公司推出的J2EE框架有EJB 2.0、EJB 3.0。 ------------------------------分割线-------------------------- 学习方法:完成习题(Java基础习题集)、运用自学的能力:读、写(3w行代码)、查、背。 ------------------------------分割线-------------------------- 浩瀚知识的分类: 实际开发中经常使用的(牢牢掌握),占比10%~20%。 不经常使用用时就能查得到的(了解),占比80%。 八辈子用不着一回的(运用自己的能力去查),占比1%~10%; ------------------------------分割线-------------------------- 总结:乐观的努力

(算法练习)——BFS(广度优先搜索)

倖福魔咒の 提交于 2020-01-31 01:57:49
《算法笔记》P276 感觉这一题最有意思的是判断元素的上下左右四个位置 代码: # include <stdio.h> # include <queue> using namespace std ; const int maxn = 100 ; struct node { int x , y ; } Node ; int n , m ; //矩阵的大小为n*m int matrix [ maxn ] [ maxn ] ; //01矩阵 bool inq [ maxn ] [ maxn ] = { false } ; //记录位置{x,y}是否已入过队 int X [ 4 ] = { 0 , 0 , 1 , - 1 } ; //增量数组 int Y [ 4 ] = { 1 , - 1 , 0 , 0 } ; bool judge ( int x , int y ) { //判断坐标{x,y}是否需要访问 //越界返回false if ( x >= n || x < 0 || y >= m || y < 0 ) return false ; //当前位置为0,或{x,y}已入过队,返回false if ( matrix [ x ] [ y ] == 0 || inq [ x ] [ y ] == true ) return false ; //以上都不满足,返回true return

算法-归并排序

﹥>﹥吖頭↗ 提交于 2020-01-31 01:55:17
PS:公众号「让我遇见相似的灵魂」,回复对应关键字【获取算法竞赛资料】。 左手代码,右手吉他,这就是天下:如果有一天我遇见相似的灵魂 那它肯定是步履艰难 不被理解 喜黑怕光的。如果可以的话 让我触摸一下吧 它也一样孤独得太久。 不一样的文艺青年,不一样的程序猿。 归并 分治 确定分界点, 中心点 递归左边、右边 归并——合二为一(重难点) 特点 稳定的 时间复杂度:nlog2^n妥妥的 #include<iostream> using namespace std; const int N = 1e6 + 10; int n; //temp辅助数组存排序结果 int q[N], temp[N]; void merge_sort(int q[], int l, int r){ if(l >= r) return; //分界点(l+r)/2 int mid = l + r >> 1; //递归 merge_sort(q, l, mid), merge_sort(q, mid + 1, r); //k已排序个数,i左边起点,j右边起点 int k = 0, i = l, j = mid + 1; while(i <= mid && j <= r) if(q[i] <= q[j]) temp[k ++] = q[i ++]; else temp[k ++] = q[j ++]; /

初识算法

末鹿安然 提交于 2020-01-30 22:31:53
算法效率的度量(只关注事前分析估算法) 我们在估算时,要抛开计算机硬件软件有关因素,只依赖于问题的规模(用整数量n表示),也就是说这个复杂度是一个函数。 一个算法是由控制结构(顺序,分支,循环)和原操作(指固有数据类型的操作)构成的,算法时间取决于两者的综合效果。 要比较同一问题的综合算法,就要选取一种对于所研究问题来说是基本操作的原操作进行比较 时间复杂度和空间复杂度 对于计算机而言,运算加减法最为方便 分析算法时:我们只关注 最坏情况复杂度以及平均复杂度 其中最坏情况复杂度最具代表性 复杂度的渐进表示法 掌握算法的上界 大O,下界 大欧米噶 本节重点 复杂度计算法则: 若两个算法分别有复杂度T1=Of1 ,T2=Of2 若两个算法拼接在一起,T1+T2=max{f1,f2} 若两个算法镶嵌在一起,T1×T2=f1×f2 若T是关于n的k阶多项式时,T=O(N的n次方) 一个for循环的复杂度:循环次数×循环体代码的复杂度 If-else 结构复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者最大 (感觉自己菜的安详,不想学习还不想玩游戏??? 来源: CSDN 作者: 又是一个新的人类? 链接: https://blog.csdn.net/weixin_45704695/article/details/104118873

算法-快速排序

拥有回忆 提交于 2020-01-30 22:23:44
PS:公众号「让我遇见相似的灵魂」,回复对应关键字【获取算法竞赛资料】。 左手代码,右手吉他,这就是天下:如果有一天我遇见相似的灵魂 那它肯定是步履艰难 不被理解 喜黑怕光的。如果可以的话 让我触摸一下吧 它也一样孤独得太久。 不一样的文艺青年,不一样的程序猿。 快排 分治 确定分界点,下标中点 递归左、右 合并归并 难点 时间复杂度 on 特点 不稳定的(除非变成二元组) #include <iostream> using namespace std; const int N = 1e6 + 10; int n; int q[N]; void quick_sort(int q[], int l, int r){ if (l >= r) return; //如果递归是j,此处不能写r,否则有边界问题。 int x = q[l], i = l - 1, j = r + 1; while (i < j ){ do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if(i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j + 1, r); } int main(){ scanf("%d", &n); for (int i = 0; i < n; i++)

算法训练——数组排序去重

独自空忆成欢 提交于 2020-01-30 22:20:57
//数组排序去重 #include<stdio.h> #include<stdlib.h> int comp(const void*a,const void*b)//用来做比较的函数。 { return *(int*)a - *(int*)b; } int main(){ int a[10]; for(int i=0;i<10;i++) scanf("%d",&a[i]); qsort(a,10,sizeof(int),comp); printf("%d\n",a[0]); for(int i=1;i<10;i++){ if(a[i]!=a[i-1]) printf("%d\n",a[i]); else continue; } return 0; }    来源: https://www.cnblogs.com/Hqx-curiosity/p/12243729.html

算法笔记-个位数统计

只谈情不闲聊 提交于 2020-01-30 22:06:53
编写程序,输入一个整数,统计不同数字出现的次数。(算法笔记-p60) #include<cstdio> #include<cstring> int main(){ char str[1010]; gets(str); int len = strlen(str); int count[10]={0}; for(int i=0;i<len;i++){ count[str[i]-'0']++; } for(int i=0;i<10;i++){ if(count[i]!=0){ printf("%d:%d\n",i,count[i]); } } return 0; } 注意点: (1).引用头文件#include<cstring> (2)因为不确定输入的整数的位数,所以选用字符型,以字符数组的形式输入; (3)以count[]数组记录数字0-9的出现次数; (4)将字符型的数字转换为整数的数字,c-'0'; (5)将大写字母R转换为小写字母r,'R'-'A'+'a'。 来源: CSDN 作者: 畹在水中芷 链接: https://blog.csdn.net/qq_33782655/article/details/104116080

JVM内存管理和GC

匆匆过客 提交于 2020-01-30 18:55:46
JVM内存管理以及垃圾回收。 1、虚拟机垃圾收集所关注的区域 垃圾收集只关注 堆 和 方法区 两个运行时数据区域 其他区域程序计数器、虚拟机栈、本地方法栈这些都是随线程而生,随线程而亡的。 2、自动垃圾手机的前提是要知道哪些内存可以被释放和回收。 对于实例收集监测主要有两种基本算法, 引用计数 和 可达性分析 1、引用计数算法 为对象添加一个引用计数器,没被引用一次计数器加一,引用被释放则计数器减一。当计数器为0的时候即表示对象可被回收。 缺点 引用计数存在一个基本难题,也就是很难处理循环引用的问题 2、可达性算法。 (1) 将对象及其引用关系看做一个图,选定活动的对象作为GC Roots,然后跟踪引用链条,如果一个对象和GC Roots之间不可达,也就是不存在引用链条,那么就可认为这个对象是可回收对象。 (2) 那么哪些对象可以被选 做为GC Roots呢 ? 1、JVM会把虚拟机栈中引用的对象。 2、本地方法栈中引用的对象。 3、静态属性引用的对象。 4、常量。 3、常见的垃圾手机算法。 (1)标记-清楚(Mark-Sweep)算法。 这个算法分两步走“标记”和“清除”,标记出所有要回收的对象,然后进行清除。这是最基础的收集算法,其他收集算法都是基于他再改进的。 缺点 标记和清除过程效率有限,另外就是不可避免出现碎片化问题。 (2)复制算法 背景 为了解决方法(1)的效率问题。

算法训练——未名湖边的烦恼

会有一股神秘感。 提交于 2020-01-30 18:35:19
//未名湖边的烦恼 //递归 #include<stdio.h> int fun(int m,int n){ if(m<n) //还鞋数小于租鞋数 return 0; if(n==0) return 1; return (fun(m-1,n) + fun(m,n-1)); } int main(){ int m,n; scanf("%d%d",&m,&n); int num = fun(m,n); printf("%d",num); return 0; }    来源: https://www.cnblogs.com/Hqx-curiosity/p/12243151.html