算法

最长递增子序列 O(NlogN)算法

╄→гoц情女王★ 提交于 2020-01-28 13:40:22
今天回顾WOJ1398,发现了这个当时没有理解透彻的算法。 看了好久好久,现在终于想明白了。 试着把它写下来,让自己更明白。 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了。 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。 下面一步一步试着找出它。 我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。 此外,我们用一个变量Len来记录现在最长算到多少了 首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时Len=1 然后,把d[2]有序地放到B里,令B[1] = 1,就是说长度为1的LIS的最小末尾是1,d[1]=2已经没用了,很容易理解吧。这时Len=1 接着,d[3] = 5,d[3]>B[1],所以令B[1+1]=B[2]=d[3]=5,就是说长度为2的LIS的最小末尾是5,很容易理解吧。这时候B[1..2] = 1, 5,Len=2 再来,d[4] = 3,它正好加在1,5之间,放在1的位置显然不合适,因为1小于3,长度为1的LIS最小末尾应该是1,这样很容易推知,长度为2的LIS最小末尾是3,于是可以把5淘汰掉

GC

孤者浪人 提交于 2020-01-28 12:12:14
一. 概念 简介:GC(Garbage Collection,垃圾收集器)就是JVM中自动内存管理机制的具体实现。主要负责内存的动态分配和垃圾回收。 衡量GC性能的依据: ·吞吐量:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间) ·垃圾收集开销:吞吐量的补数,垃圾收集开销=垃圾收集时间/(运行用户代码时间+垃圾收集时间) ·暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间 ·收集频率:收集操作发生的频率 ·堆空间:Java堆区所占的内存大小 ·快速:一个对象从诞生到被回收所经历的时间 二. 垃圾收集器的分类 按照线程数,可分为: ·串行垃圾回收器 ·并行垃圾回收器 按照工作模式,可分为: ·并发垃圾回收器 ·独占式垃圾回收器 按照碎片方式,可分为: ·压缩式垃圾回收器 ·非压缩式垃圾回收器 按照工作的内存区间,可分为: ·年轻代垃圾回收器 ·老年代垃圾回收器 三. 垃圾收集器详解 各垃圾收集器名称及其工作的内存区间 直接连线的垃圾收集器代表可组合使用 各垃圾收集器介绍 收集器 算法 线程 Serial 复制算法 单线程 ParNew 复制算法 多线程 Parallel Scavenge 复制算法 多线程 CMS 标记-清除算法 多线程 Serial old 标记-整理算法 单线程 Parallel old 标记-整理算法 多线程 G1 标记-整理算法+复制算法

程序员必须掌握的核心算法有哪些?

痴心易碎 提交于 2020-01-28 11:09:35
原文地址: https://blog.csdn.net/m0_37907797/article/details/102661778 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列

jvm原理 jvm构成 gc垃圾回收

試著忘記壹切 提交于 2020-01-28 10:41:03
JVM 文章目录 JVM JVM是什么? JVM怎么实现跨平台的? 浅谈JRE JDK JVM的位置 JVM的构成 运行时数据区 栈 堆 方法区 程序计数器 本地方法栈 类加载机制 什么是类加载机制? 类加载器 双亲委派机制 JVM调优 JVM的生命周期 GC垃圾回收机制 垃圾回收的原因 GC常见算法 可达性分析算法 标记清除算法 复制算法 标记整理算法 终极算法 ( 分代收集算法 ) JVM是什么? ​ JVM是Java Virtual Machine(Java 虚拟机 )的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM怎么实现跨平台的? JVM 只能认识字节码,也就是他只认识xxx.class 这种类型的文件,并将它们解释到系统的 API 调用。针对不同的系统有不同的 jvm 实现,有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,但是同一段代码在编译后的字节码是一样的。引用上面的例子,在 Java API 层面,我们调用系统声音设备的代码是唯一的,和系统无关,编译生成的字节码也是唯一的。但是同一段字节码,在不同的 jvm 实现上会映射到不同系统的 API 调用,从而实现代码的不加修改即可跨平台运行。 浅谈JRE JDK JRE(Java Runtime

mysql 优化 sql查询优化

落花浮王杯 提交于 2020-01-28 10:12:29
1.永远是小表驱动大表 优化原则: 2.优化order by 语句 order by子句,尽量使用Index方式排序,避免使用FileSort方式排序。尽可能在索引列上完成排序操作,遵照索引建的最佳左排序 优化策略: *增大sort_buffer_size参数设置 *增大max_length_for_sort_data参数设置 order by 关键字优化: 1.Order by 时select*是一个大忌只Query需要的字段,这点非常重要,在这里的影响是: (1)当Query的字段大小总和小于max_length_for_sort_data,而且排序字段不是TEXT|BLOB类型,会用改进后的算法-----单路排序,否则用老算法----多路排序 (2) 两种算法的数据都有可能超出sort_buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是用单路排序的风险会很大一些,所以要提高sort_buffer_size。 2.尝试提高sort_buffer_size **不管用哪种算法,提高这个蚕食都会提高效率,当然要根据系统的能力去提高 3.尝试提高max_length_for_sort_data 提高这个参数,会增加用改进算法的概率,但是如果设的太高,数据总容量超过sort_buffer_size的概率就增大,明显症状是高的磁盘I/O活动和低的处理器使用率

机器学习实战08:树回归

ε祈祈猫儿з 提交于 2020-01-28 04:46:17
树回归 优点:可以对复杂和非线性的数据建模。 缺点:结果不易理解。 适用数据类型:数值型和标称型数据。 连续和离散型特征的树的构建 在树的构建过程中,需要解决多种类型数据的存储问题,可以使用一部字典来存储树的数据结构,该字典将包含以下4个元素: (1)待切分的特征 (2)待切分的特征值 (3)右子树。当不再需要切分的时候,也可以是单个值 (4)左子树。与右子树类似 树包含左键和右键,可以存储另一棵子树或者单个值。字典还包含特征和特征值这两个键,它们给出切分算法所有的特征和特征值。 树的每个分枝还可以再包含其他树、数值型数据甚至是向量。 函数createTree ( ) 的伪代码: 找到最佳的待切分特征: 如果该节点不能再分,将该节点存为叶节点 执行二元切分 在右子树调用createTree ( ) 方法 在左子树调用createTree ( ) 方法 将 CART 算法用于回归 回归树假设叶节点是常数值,这种策略认为数据中的复杂关系可以用树结构来概括。为成功构建以分段常数为叶节点的树,需要度量出数据的一致性。 使用树进行分类,可以在给定节点时计算数据的混乱度。 首先计算所有数据的均值,然后计算每条数据的值到均值的差值。为了对正负差值同等看待,一般使用绝对值或平方值来代替上述差值。上述做法有点类似于前面介绍过的统计学中常用的方差计算。唯一的不同就是,方差是平方误差的均值(均方差)

弗洛伊德算法【全源最短路径】

筅森魡賤 提交于 2020-01-28 01:58:34
弗洛伊德算法 全源最短路径 #include<cstdio> #include<algorithm> using namespace std; const int inf=1000000000; const int maxv=200; int n,m; int dis[maxv][maxv]; void Floyd() { for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(dis[i][k]!=inf&&dis[k][j]!=inf&&dis[i][k]+dis[k][j]<dis[i][j]) { dis[i][j]=dis[i][k]+dis[k][j]; } } } } } int main() { int u,v,w; fill(dis[0],dis[0]+maxv*maxv,inf); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { dis[i][i]=0; } for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); dis[u][v]=w; } Floyd(); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d ",dis[i][j]

算法-12-排序算法应用

被刻印的时光 ゝ 提交于 2020-01-28 01:54:13
目录 1、排序比较 2、算法稳定性 3、指针排序 4、Arrays.sort() 5、找出重复元素 6、找出中位数(第k小的数) 1、排序比较 2、算法稳定性 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的。 应用场景:对于记录有大量位置和时间的一个列表库,每条数据的插入都是按照时间顺序插入的,我们现在要对该数组按照地点给来进行排序,拥有稳定性的排序算法在排序之后,时间还具有一定的有序性。上面的各个排序算法比较,记录各自的稳定性。 3、指针排序 在 Java 中,指针操作是隐式的。除了原始数字类型之外,我们操作的总是数据的引用(指针), 而非数据本身。指针排序增加了一层间接性,因为数组保存的是待排序的对象的引用,而非对象本身。 使用引用的另一个好处是我们不必移动整个元素。对于元素大而键小的数组来说这带来的节 约是巨大的,因为比较只需要访问元素的一小部分,而排序过程中元素的大部分都不会被访问到。 对于几乎任意大小的元素,使用引用使得在一般情况下交换的成本和比较的成本几乎相同(代价 是需要额外的空间存储这些引用)。如果键值很长,那么交换的成本甚至会低于比较的成本。研 究将数字排序的算法性能的一种方法就是观察其所需的比较和交换总数,因为这里隐式地假设了 比较和交换的成本是相同的。由此得出的结论则适用于 Java 中的许多应用,因为我们都是在将引 用排序。 4

数据结构与算法概要

廉价感情. 提交于 2020-01-27 22:25:34
数据结构 + 算法 = 程序 数据结构 就是关系(数据元素相互之间存在一种或多种特定关系的集合),包括:   1.逻辑结构       集合结构: 元素同属一个集合,但无关联。      线性结构: 元素之间是一对一的关系,连成线,每个元素是一个节点。      树形结构: 一对多的层次关系。      图形结构: 多对多。   2.物理结构   定义:研究如何把数据元素(后简称元素)存储到计算机的存储器中。   存储器是主要 针对内存 而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用 文件结构 来描述。   元素的存储形式有两种: 顺序存储 和 链式存储 。     顺序存储结构:元素存放在地址连续的存储单元,数据间的逻辑关系和物理关系一致。     链式存储结构:元素存放在任意的存储单元,不一定连续,不能反映逻辑关系,需要用一个指针存放元素地址,通过地址找元素位置。 算法 五个基本特性: 输入 、 输出 、 有穷性 、 确定性 和 可行性 。(有没有输入都可以,但必须有输出;无二义; 每步都可实现)  另:操作系统普遍存在缓冲区溢出现象 要求: 正确性 (1.无语法错误;2.合法输入可产生满足要求的输出;3.非法输入可产生满足规格的说明;4.故意刁难的测试输入有满足要求的输出结果)、 可读性  、 健壮性 、 时间效率高和存储量低 。   来源: https://www