算法

面试刷题25:jvm的垃圾收集算法?

依然范特西╮ 提交于 2020-04-06 11:05:52
垃圾收集是java语言的亮点,大大提高了开发人员的效率。 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别。 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪些?有哪些垃圾收集器? 答:jvm的垃圾回收首先需要标注出可回收的对象,采用的是可达图算法(从对象出发,绘制出出对象的引用关系图, 当从活动对象出发,在图中不可达的对象即可标注为可回收对象) jvm的垃圾回收算法有3种,列举如下: 1, 标记清除算法。(即把标注的可回收对象直接清理,这样会带来内存碎片化的问题,而且效率不高); 2,标记整理算法。(即把标注的可回收对象清理,在清理的过程中整理内存,解决了内存的碎片化问题); 3,标记复制算法。(把标注的对象清理,没有清理的对象复制到to区,然后互换引用,解决了内存碎片化的问题,但是需要维护对象关系带来一定代价) 垃圾收集器常见的有如下4种,随着jdk的版本迭代在不断增加。列举如下: 1,serialGC , 即单线程垃圾回收,优点是简单,缺点是会引起stop-the-world的问题,是早期版本的垃圾收集器 2,ParallelGC,即并行垃圾收集器,(新生代,老年代的收集是并行的),适合吞吐量比较的场景; 3,CMSGC,响应时间优先的垃圾收集器,适合web应用,会带来内存碎片化的问题。 4,G1GC,兼顾响应时间和吞吐量的垃圾收集器

过拟合和欠拟合

雨燕双飞 提交于 2020-04-06 09:37:59
本文首发自公众号: RAIS ​前言 本系列文章为 《Deep Learning》 读书笔记,可以参看原书一起阅读,效果更佳。 构建复杂的机器学习算法 上一篇文章中我们介绍了什么叫做机器学习算法极其具体的定义和所关心的问题,比较简单,接下来的文章我们将介绍一些设计学习算法的基本准则。 误差 泛化:机器学习的目的是在新的输入上具有良好的表现,而不是已有的数据,这很好理解,在新的数据上表现良好的能力叫做 泛化 。 在机器学习中,总是存在误差的,百分之百的确定的事件已经不是机器学习研究的范围了。既然如此,就一定存在误差,训练过程在训练集上误差称作 训练误差 ,泛化后的在新的输入上的误差称为 泛化误差 或 测试误差 。我们都希望误差尽可能的小,并且相比较而言泛化误差减小更重要(毕竟解决问题才是最重要的)。 这里会遇到一个问题就是我们往往只能得到训练数据集,没有什么好的办法提前获取模型交付生产环境后所新输入的数据,针对这样的问题,我们往往在收集统计训练数据时,尽量接近实际生产环境,并且假设数据之间是 独立同分布 的,称为 数据生成分布 ,基于这样的原因,我们会假设训练误差和测试误差两者的期望是一样的。因此我们针对数据集,具体的做法就会是先尽可能的减小 训练误差 ,让模型在已有的数据上表现良好,然后再尽可能减小 测试误差 与训练误差之间的差距,这样就会得到一个测试误差较低的模型。

数据结构与算法系列十三(选择排序)

浪子不回头ぞ 提交于 2020-04-06 08:22:31
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 上一篇: 数据结构与算法系列十二(插入排序) 中

达观数据:怎样评价推荐系统的结果质量?

放肆的年华 提交于 2020-04-06 05:52:39
推荐系统是互联网发展至今最常见也重要的技术之一。如今各类APP、网站、小程序等所有提供内容的地方,背后都有推荐系统在发挥作用。 开发好一套真正优秀的推荐系统非常有价值,但也非常艰巨。达观数据是国内推荐系统主要第三方供应商,一直在摸索中前进。 在想办法开发出强大的推荐系统服务好客户时,也一直在思考推荐系统的评估方法。 众所周知业界有一句俗话:“没有评价就没有进步”,其意思是如果没有一套科学的评价推荐系统效果的方法,那就找不到优化改进的方向,打造优秀的推荐系统就无从谈起。 笔者在几年前写过《 怎样量化评价搜索引擎的结果质量 》一文并首发于InfoQ(也可见知乎 https://zhuanlan.zhihu.com/p/30910760 )。和搜索引擎相比,移动互联网时代的推荐系统应用面更广阔,评价指标也更复杂。 评价指标像一把尺子,指引着我们产品优化的方向。到底怎样才能科学合理的评价推荐系统的结果质量?从各类文献资料和网上文章里能看到数十种评估公式,让人眼花缭乱。这些指标各自有什么优缺点,应该怎样取舍?本文从我们的实践经验出发,对此进行一些深入的分析,期望对大家有所裨益(达观数据 陈运文)。 针对不同的推荐场景,一定要因地制宜的选择合适的评估方法 推荐场景是制定评价指标时最为关键的,脱离了推荐场景来谈评测指标就像无水之鱼。所谓“推荐场景”, 与所推荐的内容类型、展现方式

Python数据预处理:机器学习、人工智能通用技术(1)

僤鯓⒐⒋嵵緔 提交于 2020-04-06 04:54:40
Python数据预处理:机器学习、人工智能通用技术 白宁超 2018年12月24日17:28:26 摘要: 大数据技术与我们日常生活越来越紧密,要做大数据,首要解决数据问题。原始数据存在大量不完整、不一致、有异常的数据,严重影响到数据建模的执行效率,甚至可能导致模型结果的偏差,因此要数据预处。数据预处理主要是将原始数据经过文本抽取、数据清理、数据集成、数据处理、数据变换、数据降维等处理后,不仅提高了数据质量,而且更好的提升算法模型性能。数据预处理在数据挖掘、自然语言处理、机器学习、深度学习算法中起着重要的作用。( 本文原创,转载必须注明出处 .) 1 什么是数据预处理 数据预处理简而言之就是将 原始数据 装进一个 预处理的黑匣子 之后,产生出 高质量数据 用来适应相关技术或者算法模型。为了大家更明确的了解数据预处理,我们举个新闻分类的例子: 将原始的数据直接进行分类模型训练,分类器准确率和召回率都比较低。因为我们原始数据存在很多干扰项,比如 的 , 是 等这些所谓停用词特征对分类起的作用不大,很难达到工程应用。 我们将原始数据放假预处理黑匣子后,会自动过滤掉干扰数据,并且还会按照规约的方法体现每个词特征的重要性,然后将词特征压缩变换在数值型矩阵中,再通过分类器就会取得不错的效果,可以进行工程应用。 总结 :数据预处理前的数据存在不完整、偏态、噪声、特征比重、特征维度、缺失值

BBR拥塞控制算法

柔情痞子 提交于 2020-04-06 00:33:23
BBR拥塞控制算法是Google最新研发的单边TCP拥塞控制算法 Linux 内核4.9 已引入这个BBR算法,本人在CAC测试Ubuntu 14.04 安装Linux 4.9内核,延迟优化效果和TCP连接速度提升效果明显好于锐速! Ubuntu更新内核、开启BBR:https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AFTCP-BBR%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95 BBR算法科普:http://blog.csdn.net/dog250/article/details/52830576 http://www.zrblog.net/15718.html 来源: https://www.cnblogs.com/crac/p/6220548.html

一致性Hash算法原理白话

拥有回忆 提交于 2020-04-05 23:18:05
1、技术背景 1.1、技术举例:Memcache 1.2、技术瓶颈 memcached服务器端本身不提供分布式cache的一致性,由客户端实现提供。以余数分布式算法为例。 余数分布式算法是根据添加进入缓存时key的hash值通过特定的算法得出余数,然后根据余数映射到关联的缓存服务器,将该key-value数据保存到该服务器 1.2.1、假设有3台缓存服务器以及它们对应的余数值 Node A:0,3,6,9 Node B:1,4,7 Node C:2,5,8 1.2.2、此时添加一台服务器Node D 服务器对应的余数值发生变化,如下 Node A:0,1,2 Node B:3,4 Node C:5,6 Node C:7,8,9 根据上面的变化,发现只有余数值为0,4,5所对应的缓存服务器没有发生改变,也就是说其它余数值对应的缓存服务器发生了改变,即缓存失效,如果大量缓存失效会严重影响系统的性能,也就是缓存动荡。针对这样大片缓存失效的技术瓶颈,于是提出了一致性hash算法。缩小失效缓存范围。 2、一致性Hash算法 2.1、将hash值范围看成一个0~2 32 的圆。 2.2、将服务器节点的hash值映射到该圆上。 2.3、对数据进行缓存时,计算key的hash值,然后找到该值在圆上的位置,顺时针进行查找,将数据保存到第一个查找到的服务器。 2.4、添加一个缓存服务器,如图

Hash一致性算法底层原理

浪子不回头ぞ 提交于 2020-04-05 23:17:27
大纲 Hash取余算法 判定哈希算法好坏的四个定义 一致性Hash算法的两大设计 Hash取余算法 hash( Object.key) %N,hash值随Object.key、N的变化而变化。 如果有节点(集群中节点增减太正常)发生变化,几乎重新分配,意味着所有已经分配好的数据都要迁移到新的节点上。 一致性Hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义 : 1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布在所有的缓冲(Cache)中去,这样可以使得所有的缓冲空间得到利用。很多哈希算法都能够满足这一条件。 2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应该能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会映射到旧的缓冲集合中的其他缓冲区。 3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上去,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度

基于三维GIS技术的矢量地图动态LOD渲染方法研究现状

两盒软妹~` 提交于 2020-04-05 22:58:05
“地图是人类文化的杰作,它融科学、艺术于一体,作为描述、研究人类生存环境的一种信息载体是人类生产与生活中不可缺少的一种工具。”这是陈述彭院士为《中国地图学年鉴》作序的开场语。Taylor也曾指出“当涉及应用人脑来识别空间联系中的模式与相互关系时,地图学的认知方法是唯一的过程”。地图存在于我们生活的方方面面,应用广泛且己经产生了巨大的社会效应和经济效益,其重要性不言而喻。地图是地图可视化的结果,地图可视化作为现代地图学的核心一直是 三维GIS (ztmapinfo.com) 的研究热点。地图可视化将电子设备的视觉传输能力和人类的视觉思维能力协同起来,将复杂多样的空间信息转化为图形图像并进行交互处理,为人们直观地观察地理现象及分析和探索地理规律提供了有力的工具。随着计算机技术和图形硬件的发展,利用计算机技术来辅助制作电子地图逐渐成为主流趋势。上世纪80年代科学计算可视化己被提出并迅速发展,其理论和方法对空间信息的表达和分析产生了重要影响。国际地图制图协会于1995年成立了一个地图可视化委员会,并与计算机图形学会开始了“Carto-Project”,研究项目,该项目使图形学技术有效地应用在地理学及地图学领域,为空间信息可视化提供了良好的技术支撑。 随着云计算、物联网、基于位置的服务等技术的飞速发展,使得数据的种类和存储规模以前所未有的速度增长。数据的规模化效应给地图可视化带来了极大的挑战

GC 算法与种类

旧时模样 提交于 2020-04-05 22:01:25
对于垃圾收集(GC), 我们需要考虑三件事情:哪些内存需要回收?如何判断是垃圾对象?垃圾回收算法有哪些? 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭; (2)栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具有确定性。 在这几个区域不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟随着回收了。 2、GC的工作区域(哪些内存需要GC回收?) (1)垃圾回收重点关注的是堆和方法区部分的内存。 因为一个接口中的多个实现类需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间才能知道会创建哪些对象,这部分内存的分 配和回收都是动态的,所以垃圾回收器所关注的主要是这部分的内存。 二、垃圾对象的判定 Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,要先确定这些对象是否还有用,哪些还活着。对象死去的时候才需要回收。 1、引用计数法 引用计数法的逻辑是:在堆中存储对象时,在对象头处维护一个counter计数器,如果一个对象增加了一个引用与之相连,则将counter++。 如果一个引用关系失效则counter–。如果一个对象的counter变为0