算法

最小生成树prim算法(模板)

我是研究僧i 提交于 2020-03-14 03:48:52
prim算法适合稠密图,即边数较多而点较少的情况,时间复杂度为 O ( n 2 ) O ( n 2 ) ,堆优化的情况下,如果点数为m,边数为n,可以达到 O ( n l o g m ) O ( n l o g m ) .思想很简单,就是每次寻找一条由已加入集合的点和与它们相邻的没加入集合的点的权值最小边,进行n-1次就找出来了,也是贪心的思想,实现就是随便找一个初始节点,然后建一个最小堆(边小的先pop出来),把该节点的vis值置为1,遍历该节点相邻的节点,如果没有被vis标记过,就加入边到堆中,扫完了以后处理堆中数据,如果弹出的边被标记过就pop,没有就取出来,把边通往的节点置为key,下次就加入key节点有关没有标记过的边。循环n-1次,把每一次堆弹出边的值累加起来就是最小生成树的值了 #include<bits/stdc++.h> using namespace std; const int maxn=1005; struct Edge{ int to,dist; Edge(int t,int d):to(t),dist(d){} bool operator<(const Edge& e)const{ return dist>e.dist; } }; int n,m; bool vis[maxn]; vector<Edge> g[maxn]; priority_queue

一句话设计模式

别等时光非礼了梦想. 提交于 2020-03-14 02:55:07
创建型 1.抽象工厂模式(AbstractFactory)   提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类 2.创建者模式(Builder)   将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 3.工厂方法模式(FactoryMethod)   定义一个用于创建对象的接口,让子类决定实例化哪一个类,使得一个类的实例化延迟到其子类 4.原型模式(Prototype)   用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 5.单例模式(Singleton)   保证一个类仅有一个实例,并提供它的一个全局访问点 结构型 6.适配器模式(Adapter)   将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的类一起工作 7.桥接模式(Bridge)   将抽象部分与它的实现部分分离,使它们都可以独立地变化 8.组合模式(Composite)   将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 9.装饰模式(Decorator)   动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 10.外观模式(Facade)   为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 11

8.机器学习之聚类算法

倾然丶 夕夏残阳落幕 提交于 2020-03-14 01:43:39
分类 是在一群已经知道类别标号的样本中,训练一种分类器,让其能够对某种未知的样本进行分类,分类算法属于一种有监督的学习。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。分类的目的就是使用分类对新的数据集进行划分,其主要涉及分类规则的准确性、过拟合、矛盾划分的取舍等。 ———————————————— 聚类 是在一群未知类别标号的样本上,用某种算法将他们分成若干类别,这是一种无监督学习。给定一组数据点,我们可以用聚类算法将每个数据点分到特定的组中,理论上属于同一组的数据点应该有相似的属性和/或特征,而属于不同组的数据点应该有非常不同的属性和/或特征。所以在给定的数据集中,我们可以通过聚类算法将其分成一些不同的组。 聚类是一种将数据点按一定规则分群(分组)的机器学习技术。其主要研究数据间逻辑上或物理上的相互关系。聚类分析本身不是一个特定的算法,而是要解决的一般任务。它可以通过各种算法来实现,这些算法在理解群集的构成以及如何有效地找到它们方面存在显着差异。由聚类所组成的簇是一组数据对象的集合,这些对象与同一簇中的对象彼此类似,与其他簇中的对象相异。其分析结果不仅可以揭示数据间的内在联系与区别,还可以为进一步的数据分析与知识发现提供重要依据。 监督学习: 当我们根据一组给定的预测因子变量或自变量去预测一个目标变量时

从数组到HashMap之算法解释

旧巷老猫 提交于 2020-03-13 19:42:48
作者: Xcafe 编辑日期:20161228 博客: https://my.oschina.net/xcafe 一 数组是什么?   忘了在哪本书里曾看到过类似这样的一句话“所有的数据结构都是数组的演化”,想想其实是有道理的,因为计算机的内存其实就是线性的存储空间。   Java示例代码:int[] array = new int[5]   忽略对象头信息和数组长度信息,JVM执行时会在堆中分配20个字节的内存空间,看起来就是这样的:      这样的数据结构可以很方便地通过数组下标存取数据,但在查找时需要遍历数组,平均时间复杂度为O(n/2)。   当数据量很大或者查找操作频繁的时候,这样的遍历操作几乎是不可接受的。那么,如何才能够在更短的时间内快速找到数据呢? 二 二分查找   假如数组内的元素是已经排序的,那么很自然的方式就是使用二分查找。   譬如有一个整形数组的长度为1000,数组内的整数从小到大排列,如果我想要知道6000是否在此数组中。那么我可以先查看array[500]的数字是否为6000,array[500]的数字比6000小,那么就查看array[750]位置的数字……依次类推,那么最多经过10次,就可以确定结果。   此算法的时间复杂度为O(logN)。   然而,大部分情况下数组元素都是无序的,而排序所需要的时间复杂度O(NlogN

面试基础:KMP字符串查找算法

故事扮演 提交于 2020-03-13 16:38:33
字符串的一种基本操作是子字符串查找:给定一端长度为N的文本字符串text和一个长度为M(M<N)的模式字符串pattern,在文本字符串中查找和该模式字符串相同的子字符串。 在这互联网时代,字符串查找的需求在很多情景都需要,如在文本编辑器或浏览器查找某个单词、在通信内容中截取感兴趣的模式文本等等。 子字符串查找最简单的实现肯定是暴力查找: public static int search(String text, String pattern) { int N = text.length(); int M = pattern.length(); for (int i = 0; i < N-M; i++) { int j; for (j = 0; j < M; j++) { if (text.charAt(i+j) != pattern.charAt(j)) break; } if (j == M) return i; } return -1; } 可以看到,暴力查找的最坏时间复杂度为O(N*M),实际应用中往往文本字符串很长(成万上亿个字符),而模式字符串很短,这样暴力算法的时间复杂度是无法接受的。 为了改进查找时间,人们发明了很多字符串查找算法,而今天的主角KMP算法(D.E.Knuth,J.H.Morris和V.R.Pratt发明,简称KMP算法)就是其中的一种。

2.机器学习之KNN

☆樱花仙子☆ 提交于 2020-03-13 15:02:33
K-最近邻(k-Nearest Neighbor,KNN)分类算法,kNN算法的核心思想是: 如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 。打个比方:你们想了解我是个怎样的人,然后你们发现我的身边关系最密切的朋友是一群逗逼,所以你们可以默认我也是一个逗逼。 例如:如下图所示,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,因此绿色圆被赋予红色三角形那个类;如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。 数据分析当中KNN通过测量不同特征值之间的距离来进行分类的。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,所选择的邻居都是已经正确分类的对象,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签;即利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。 一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后

雪花算法

牧云@^-^@ 提交于 2020-03-13 11:16:00
场景:分布式ID生成器 组成结构:首位无效符+时间戳差值、机器(进程)编码、序列号 特点:自增、有序;可按时间进行排序,标识机器节点,序列号是同一毫秒生成的id数量 修正:可以根据自身项目修改,比如机器编码改成自定义业务属性、 缺点:机器节点的时钟不同 则全局来说不是递增的 来源: https://www.cnblogs.com/hzq3554055/p/12001303.html

sqlserver一个循环圆的算法

时间秒杀一切 提交于 2020-03-13 00:53:24
在sqlserver中没有数组的概率,我们就把数组的形式改成临时表的形式,临时表分为两列,第一列就是id,即为数组的下标;第二列为值,即为数组的值; 上sql ALTER PROCEDURE [dbo].[miao] @start datetime as begin set nocount on if exists(select * from sysobjects where name ='#temp_clss') --查找命令 drop table #temp_clss --删除 命令 if exists(select * from sysobjects where name ='#temp_cls_dat') --查找命令 drop table #temp_cls_dat --删除 命令 create table #temp_clss(id int,cls varchar(20)) insert into #temp_clss values (0,'中') insert into #temp_clss values (1,'中') insert into #temp_clss values (2,'中') insert into #temp_clss values (3,'早') insert into #temp_clss values (4,'早') insert into

【从0到1学算法】快速排序

谁说胖子不能爱 提交于 2020-03-12 21:34:19
系列文章导航: 【从0到1学算法】二分查找法 【从0到1学算法】大O表示法 【从0到1学算法】 数组和链表 【从0到1学算法】选择排序 【从0到1学算法】递归 今天我们将学习快速排序,是最快的排序算法之一,速度比选择排序快得多! 一、分而治之 在学习快速排序前,先上开胃菜,快速排序中用到的算法--分而治之(divide and conquer, D&C,分治法)。只能解决一种问题的算法毕竟用处有限,而D&C提供了解决问题的思路。当面对新问题束手无策时,不妨自问:使用分而治之能解决吗?来个示例:假设你是农场主,有一块土地。 你要将这块土地均匀分成方块(正方形),且分出的方块要尽可能大。显然,下面的分法都不符合要求。 使用D&C解决问题分为两个步骤: 找出基线条件,这个条件必须尽可能简单。 不断将问题分解(或者说缩小规模),直到符合基线条件。 下面就来使用D&C找出解决方案。首先,找出基线条件。最容易处理的情况是,一条边的长度是另一条的整数倍。比如下图,一边是50m,另一边是25m,那么最大方块为25mx25m。 接下来是缩小问题规模,首先找出这块地可容纳的最大方块。 划出了两块640mx640m的方块,同时余下一小块地。接下来我们将继续对余下的小块地使用相同的算法。 适用于这小块地的最大方块,也适用于整块地的最大方块(可参阅欧几里算法)。问题规模缩小了