算法

C数据结构与算法-基础整理-图-06:克鲁斯卡尔算法详解

对着背影说爱祢 提交于 2020-02-19 04:08:47
详解最小生成树中的克鲁斯卡尔算法 0x01.关于克鲁斯卡尔算法 Kruskal算法 是一种用来查找 最小生成树 的算法,由Joseph Kruskal在1956年发表。克鲁斯卡尔算法主要针对边集数组展开。 0x02.基础代码 这个算法主要是针对边集数组,先来看一下边集数组的结构: //边集数组 typedef struct { int begin; int end; int weight; }Edge; 通常用到邻接矩阵,所以还需要由邻接矩阵转化为边集数组。另外这个算法还需要按照边的权值升序排序。 void OperationEdge(Graph G, Edge* edges) { int i, j,k; k = 0; for (i = 0; i < G.numv; i++) { for (j = i+1; j < G.numv; j++)//只需要转化邻接矩阵的一半,无向图 { if (G.edge[i][j] != INTMAX && G.edge[i][j] != 0) { edges[k].begin = i; edges[k].end = j; edges[k].weight = G.edge[i][j]; k++; } } } for (i = 0; i < k-1; i++)//简单交换排序 { for (j = i + 1; j < k; j++) { if

JVM内存管理

一世执手 提交于 2020-02-19 02:17:09
什么是java内存管理? 首先jvm的运行时数据区域可以划分为堆,栈,方法区,程序计数器。栈又分为虚拟机栈和本地方法栈。 虚拟机栈中存放栈帧,每一个栈帧中存有局部变量表,操作数栈,动态连接等信息,java方法从开始到结束代表着栈帧的一次入栈出栈操作。本地方法栈是为native方法服务的。 程序计数器:当前线程执行字节码时的行号指示器。 堆:用来存放数组和实例化的对象。 方法区:用来存储类信息,final常量,static静态变量,即时编译器编译的代码等,其中还包括运行时常量池,用来存放字面量和符号引用。 其中堆内存比较重要,可能发生的问题是内存泄露或者是内存溢出。内存泄漏是指GC没有回收掉废弃对象导致一直占用空间。内存溢出是指堆内存已满。 垃圾回收策略: 引用计数法,可达性分析法。 标记清除算法,标记整理算法,复制算法,分代算法。 永久代的GC主要回收废弃变量和无用的类。 分代的原因是提高GC性能 每一次GC,90%的对象被回收 根据对象寿命可以分为新生代和老年代。新生代表示对象生命周期短,被回收几率高,主要是Minor GC,老年代表示对象寿命周期长,回收几率低。新生态中主要使用复制算法,老年代主要使用标记清除或标记整理算法。 新生代还可以分为Eden和Survivor区域。一块Eden和两块Survivor。复制算法的一种改进。

朴素贝叶斯算法

我与影子孤独终老i 提交于 2020-02-19 02:00:44
一、朴素贝叶斯综述 \quad 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单也是最常见的一种。 \quad 对于分类问题,其实谁都不陌生,日常生活中我们每天都进行着分类过程,例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作。 \quad 既然是贝叶斯分类算法,那么分类的数学描述又是什么呢? \quad 从数学角度来说,分类问题可做如下定义:已知集合 C = y 1 , y 2 , . . . , y n C=y_1,y_2,...,y_n C = y 1 ​ , y 2 ​ , . . . , y n ​ 和 I = x 1 , x 2 , . . . , x n I=x_1,x_2,...,x_n I = x 1 ​ , x 2 ​ , . . . , x n ​ ,确定映射规则 y = f ( x ) y=f(x) y = f ( x ) ,使得任意 x i ∈ I x_i\in I x i ​ ∈ I 有且仅有一个 y i ∈ C y_i\in C y i ​ ∈ C ,使得 y i ∈ f ( x i ) y_i\in f(x_i) y i ​ ∈ f ( x i ​ ) 成立。 \quad 其中

JVM垃圾回收机制和常用算法

孤街醉人 提交于 2020-02-18 22:20:22
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构、 JVM、集合、多线程、数据库这几点在面试的时候比较多。今天总结了几个JVM比较问的多的问题和答案希望可以帮到大家。 1、首先就是JVM垃圾回收机制和算法 这个应该是问得最多的几个问题之一了,大家都知道java是由sun公司发明的(后来由于经营不善被甲骨文收购了),Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也有所不同。 GC(Garbage Collector)在回收对象前首先必须发现那些无用的对象,如何去发现定位这些无用的对象?一共有两种搜索算法:引用计数器算法、根搜索算法,由于引用计数器算法已经被废弃,所已这里主要说明根搜索算法: 根搜索算法: 根搜索算法是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(Reference Chain),当一个对象没有被 GC Roots 的引用链连接的时候,说明这个对象是不可用的。 GC Roots 对象包括: a) 虚拟机栈(栈帧中的本地变量表)中的引用的对象。 b) 方法区域中的类静态属性引用的对象。 c) 方法区域中常量引用的对象。 d) 本地方法栈中 JNI(Native 方法)的引用的对象。

双向链表&LRU缓存淘汰算法

三世轮回 提交于 2020-02-18 15:19:55
单链表的尾结点指针指向null,表示这就是最后的结点了。 循环链表是一种特殊的单链表,和单链表区别于首尾相接,其优点是从链尾到链头比较方便,适合于数据具有环型结构。 双向链表的每个数据结点都包含有三个域值(pre,data,next)。从双向链表中的任意结点开始,都能够很方便地访问到它的前驱结点和后继结点。特点:1.存储同样多的数据,要占用更多的内存。2.插入和删除需同时维护 next 和 pre 两个引用。3.支持双向遍历,这是双向链表操作的灵活性。 双向链表 1.添加元素。 与单向链表相对比双向链表可以在 O(1) 时间复杂度搞定,而单向链表需要 O(n) 的时间复杂度。 头插法: 将链表的左边称为链表头部,右边称为链表尾部。头插法是将右边固定,每次新增的元素都在左边头部增加。 尾插法: 将链表的左边称为链表头部,右边称为链表尾部。尾插法是将左边固定,每次新增都在链表的右边最尾部。 2.查询元素 双向链表的灵活性: 知道链表中的一个元素的下标就可以向左或者向右开始遍历查找需要的元素 。因此对于一个有序链表,双向链表的按值查询的效率比单链表高一些。因为,我们可以记录上次查找的位置 p,每次查询时,根据要查找的值与 p 的大小关系,决定是往前还是往后查找,所以平均只需要查找一半的数据。 3.删除元素( 单链表删除操作需要 O(n) 的时间复杂度,而双向链表只需要在 O(1)

05_特征选择

狂风中的少年 提交于 2020-02-18 15:16:46
特征选择是选择相关特征的子集用于机器学习模型构建的过程,数据越多,结果就越好,这并不总是事实。包含不相关的特征(对预测没有帮助的特征)和冗余的特征(与他人无关的特征)只会使学习过程不堪重负,容易导致过度拟合。 特征选择的好处: 不同的特征子集为不同的算法提供了最佳性能。所以它和机器学习模型训练不是一个单独的过程。因此,如果我们要为线性模型选择特征,最好使用针对这些模型的选择程序,如回归系数重要性或Lasso。如果我们要为树选择特性,最好使用树派生的重要性。 简化模型使得容易解释 减少训练时间,减少计算消耗 减少数据收集的时间 避免维度过高 提升泛化性能,降低过拟合的风险 1.Filter Method 过滤方法根据性能度量选择特征,而不考虑以后使用的ML算法。单变量滤波器根据一定的准则对单个特征进行评价和排序,而多变量滤波器则对整个特征空间进行评价。 特性: 基于模型选择变量,使用尽量少的计算资源,会使模型性能下降的特征。下列这些滤波方法都没有考虑特征之间的相互作用,可能会降低我们的预测能力。我个人只使用方差和相关性来过滤一些绝对不必要的特性。使用卡方检验或单变量选择方法时,需要记住的一点是,在非常大的数据集中,大多数特征将显示一个小的p_value,因此看起来它们具有很高的预测性。这实际上是样本量的影响。因此,在选择使用这些过程的功能时应该谨慎。一个非常小的p

04_特征工程

自作多情 提交于 2020-02-18 14:46:31
1.Feature Scaling 对数据的自变量或特征范围进行标准化的一种方法。在数据处理中,它也称为数据规范化,通常在数据预处理步骤中执行。 为什么要进行Feature Scaling: 如果输入范围变化,在某些算法中,对象函数将不能正常工作。 梯度下降收敛得更快,与特征缩放完成。梯度下降法是逻辑回归、支持向量机、神经网络等常用的优化算法。 涉及距离计算的算法如KNN、聚类算法也受特征量的影响。只要考虑欧几里德距离是如何计算的:取观测值之间差异平方和的平方根。变量之间的尺度差异会对这个距离产生很大的影响。 基于树的算法几乎是唯一不受输入大小影响的算法,我们可以很容易地从树的构建方式中看到这一点。当决定如何分割时,树算法会查找“特征值是否为X>3.0”这样的决策,并计算分割后子节点的纯度,因此不考虑特征的规模。 如何进行Feature Scaling: 如果你的特征不是高斯分布,比如,有偏态分布或者有异常值,归一化标准化不是一个好的选择,因为它会将大多数数据压缩到一个很窄的范围内。然而,我们可以将特征转换成高斯like,然后使用归一化-标准化。特征变换将在3.4节中讨论 在进行距离或协方差计算(如聚类、PCA和LDA等算法)时,最好使用Normalization - Standardization ,因为它可以消除尺度对方差和协方差的影响。 Min-Max scale与规范化

自然语言处理怎么最快入门?

为君一笑 提交于 2020-02-18 12:05:47
作者:微软亚洲研究院 链接:https://www.zhihu.com/question/19895141/answer/149475410 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对这个问题,我们邀请了微软亚洲研究院首席研究员 周明博士 为大家解答。 周明博士于2016年12月当选为全球计算语言学和自然语言处理研究领域最具影响力的学术组织——计算语言学协会(ACL, Association for Computational Linguistics)的新一届候任主席。此外,他还是中国计算机学会中文信息技术专委会主任、中国中文信息学会常务理事、哈工大、天津大学、南开大学、山东大学等多所学校博士导师。他1985年毕业于重庆大学,1991年获哈工大博士学位。1991-1993年清华大学博士后,随后留校任副教授。1996-1999访问日本高电社公司主持中日机器翻译研究。他是中国第一个中英翻译系统、日本最有名的中日机器翻译产品J-北京的发明人。1999年加入微软研究院并随后负责自然语言研究组,主持研制了微软输入法、对联、英库词典、中英翻译等著名系统。近年来与微软产品组合作开发了小冰(中国)、Rinna(日本)等聊天机器人系统。他发表了100余篇重要会议和期刊论文。拥有国际发明专利40余项。 ————这里是正式回答的分割线———— 自然语言处理

带锁的门—算法随笔

守給你的承諾、 提交于 2020-02-18 07:13:23
问题描述 带锁的门 走廊上n个带锁的门,从1到n一次编号,最初都关着,我们从门前经过n次,每次都从1号门开始,在第i次经过时,我们改变i的倍数的门锁状态,这样,最后一次经过时,那些门开着,那些门关着? 问题分析 首先举一个简单的例子分析 这里事先规定门开使用 1 标记,锁门使用 0 标记。 假设有4个带锁的门,从1到4编号,初始状态的序列是0000,首先第1次经过时,改变1的倍数的门锁的状态,门锁的序列改变为1111,然后第2次 经过时,改变2的倍数的门锁的状态,门锁的序列改变为1010,然后同理第3次,序列变为1000,第4次,序列变为1001. 最终的序列就是1001; 下面使用一般的思维分析 可以观察每一扇门的最终状态是由什么决定的。 第一扇门 因子(包括1和本身)只有一个 第二扇门 因子有两个 第三扇门 因子有两个 第四扇门 因子有三个 由上述可得因子是奇数个,门是开着的,因子是偶数个,门是关闭。 但是大多数情况下,每个数的因子是成对出现的,例如数15的因子有1和15,以及3和5,数12的因子有1和12,2和6,3和4,所以有偶数个因子。只有当这个数是完全平方数时,例如1,4,9,16,25,36等等,它的因子除成对出现的以外,还有它的整数平方根作为单独的因子,这些完全平方数的因子数为奇数。 所以最后一次经过后,只有编号为1,4,9,16,25,36,49,64,81

如何构建阿里小蜜算法模型的迭代闭环?

感情迁移 提交于 2020-02-18 05:22:08
导读:伴随着AI的兴起,越来越多的智能产品诞生,算法链路也会变得越来越复杂,在工程实践中面临着大量算法模型的从0到1快速构建和不断迭代优化的问题,本文将介绍如何打通数据分析-样本标注-模型训练-监控回流的闭环,为复杂算法系统提供强有力的支持。 新技术/实用技术点: 实时、离线场景下数据加工的方案选型 高维数据的可视化交互 面对不同算法,不同部署场景如何对流程进行抽象 01. 背景 技术背景及业务需求 小蜜系列产品是阿里巴巴为消费者和商家提供的智能服务解决方案,分别在用户助理、电商客服、导购等方面做了很多工作,双十一当天提供了上亿轮次的对话服务。其中用到了问答、预测、推荐、决策等多种算法模型,工程和算法同学在日常运维中会面临着如何从0到1快速算法模型并不断迭代优化,接下来将从工程角度介绍如何打通数据->样本->模型->系统的闭环,加速智能产品的迭代周期。 实现 实现这一过程分为2个阶段: 0->1阶段: 模型冷启动,这一阶段更多关注模型的覆盖率。 实现步骤: A. 抽取对话日志作为数据源 B. 做一次知识挖掘从日志中挑出有价值的数据 C. 运营人员进行标注 D. 算法对模型进行训练 E. 运营人员和算法端统一对模型做评测 F. 模型发布 1->100阶段: badcase反馈和修复阶段,主要目标是提升模型的准确率。 实现步骤: A. 运营端根据业务反馈(顶踩按钮)、用户不满意会话(如