算法

【分类算法】K-NN

↘锁芯ラ 提交于 2020-01-21 01:53:37
目录 K-NN的定义 K-NN的注意事项 K-NN 与K-Means 代码实现 总结 K-NN的定义 今天,我们来分享一个“街知巷闻”入门级别的分类算法 —— K-NN 。相信提到这个词的时候小伙伴们都有:噢~是它。这里题外话一下,为什么说K-NN是“街知巷闻”入门级别呢?其实他有如下特点: 算法思想非常简单 对数学以来少,非常适合初学者 虽然它的体量小,却可以走完监督学习的整个流程 可以通过它来入门监督学习,然后扩展其他算法 首先说一下,K-NN属于分类算法,那么分类算法是属于监督学习。所以K-NN是监督学习算法,它需要带label的数据。关于分类和聚类,我在过去的文章有讲过,大家可以回看一下。 什么是分类算法? / 什么是聚类算法? 那么到底什么是K-NN呢?看过过去文章的都知道,我比较喜欢通过拆解算法名字来初步理解算法是做什么的。K-NN,全称叫做:K-Nearest Neighboors,中文翻译:K-最近的 邻居们。假设我们的数据如下图,有很多个点。首先解释 Nearest 的,看到远近就应该想到距离。那么常用的距离计算方式我们有欧式距离、马氏距离、名氏距离甚至绝对值距离也是OK的。而 Neighboors 就是邻居们的意思。但在数据里面,我们一般用点来表示。所以也可以理解为是附近的点。那么K是一个正数,它代表多少个点。 所以整个K-NN的理解就是: K个最近的邻居点

深入浅出学算法113-细胞

青春壹個敷衍的年華 提交于 2020-01-20 22:02:08
深入浅出学算法113-细胞 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字 则为同一细胞,求给定矩形阵列的细胞个数。如: 阵列 4 10 0234500067 1034560500 2045600671 0000000089 有4个细胞。 输入 第一行输入2个整数n和m(均不大于60) 然后输入n行 每行m个数字(0到9之间,中间没有空格) 输出 输出一个整数,表示细胞数 样例输入 4 10 0234500067 1034560500 2045600671 0000000089 样例输出 4 题解: 搜索 源代码: #include<bits/stdc++.h> using namespace std; int nx[]= {0,-1,0,1}; int ny[]= {-1,0,1,0}; char a[65][65]; int n,m; void bfs(int x,int y) { int cx,cy; a[x][y]='0'; for(int i=0; i<4; i++) { cx=nx[i]+x; cy=ny[i]+y; if(cx>=0&&cx<n&&cy>=0&&cy<m) if(a[cx][cy]!='0') bfs(cx,cy); } } int main() { int i,j,ans=0; cin>>n>>m

总结HTTPS握手层和加密层

泪湿孤枕 提交于 2020-01-20 19:27:21
前面说过,TLS/SSL协议可以和应用层协议结合,例如HTTP,SMTP和FTP等。提供数据完整性和机密性TLS/SSL协议建立在TCP或UDP之上,应用层协议之下,任何应用层协议使用了TLS,都要先把数据经过TLS/SSL处理。客户端浏览器连接服务器的443端口,发送HTTP数据到TLS/SSL协议,再到传输层TCP处。TLS协议部分有握手层和加密层两部分,握手层在上,加密层在下,握手层负责完成密码套件,也就是使用的加密算法,密钥参数生成和交换,发送证书等,最后完成密钥协商得到预备主密钥,预备主密钥用过密钥衍生算法得到主密钥,之后就可以把这它交给下面的加密层,完成数据加密和解密。加密层的功能顾名思义,在拿到握手层提供的主密钥后,对HTTP数据提供完整性和机密性保证。 握手层和加密层流程 在握手层,负责交换随机数,密钥套件和密钥协商等,无论是RSA还是DH方式,首先都是客户端发送自己支持的密码套件给服务器,服务器从中选择一个密钥套件,完成密码套件的协商,然后服务器端发送自己的证书给客户端进行身份验证,客户端完成身份验证后,可以开始密钥协商。RSA密钥协商,客户端直接把加密后的预备主密钥发送给服务器端,DH密钥协商则先由服务器端发送DH参数和DH公钥给客户端,客户端根据DH参数生成自己的密钥对,再把客户端DH公钥发送给服务器端,完成密钥协商。接下来就可以在通信中进行数据的加密和解密。

(算法练习)——PAT A1059 Prime Factors

核能气质少年 提交于 2020-01-20 12:33:48
《算法笔记》P167 求素数+结构体的使用+输出注意 代码: # include <stdio.h> # include <math.h> const int maxn = 100010 ; //判断是否为质数 bool is_prime ( int n ) { if ( n == 1 ) return false ; int sqr = ( int ) sqrt ( 1.0 * n ) ; for ( int i = 2 ; i <= sqr ; i ++ ) { if ( n % i == 0 ) return false ; } return true ; } int prime [ maxn ] , pNum = 0 ; //生成质数表 void Find_Prime ( ) { for ( int i = 1 ; i < maxn ; i ++ ) { if ( is_prime ( i ) == true ) { prime [ pNum ++ ] = i ; } } } //保存分解的质数及个数 struct factor { int x , cnt ; } fac [ 10 ] ; int main ( ) { Find_Prime ( ) ; int n , num = 0 ; scanf ( "%d" , & n ) ; if ( n == 1 ) printf

Java面试题2-JVM相关

余生长醉 提交于 2020-01-20 10:45:33
谈谈你对解析与分派的认识 解析 Java中方法调用的目标方法在Class文件里面都是常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用。(关于符号引用与直接引用,详见【深入理解JVM】:Class类文件结构)这种解析的前提是:方法在程序真正运行之前就有一个可以确定的调用版本,并且这个方法的调用版本在运行期是不可改变的,即“编译期可知,运行期不可变”,这类目标的方法的调用称为解析(Resolve)。 只要能被invokestatic和invokespecial指令调用的方法,都可以在解析阶段中确定唯一的调用版本,符合条件的有静态方法(invokestatic指令)、私有方法、实例构造方法、父类方法(这3个是invokespecial指令),它们在类加载的的解析阶段就会将符号引用解析为该方法的直接引用。 分派 解析调用一定是个静态的过程,在编译期就完全确定,在类加载的解析阶段就将涉及的符号引用全部转变为可以确定的直接引用,不会延迟到运行期再去完成。而分派(Dispatch)调用则可能是静态的也可能是动态的。分派是多态性的体现,Java虚拟机底层提供了我们开发中“重载”(Overload)“和重写”(Override)的底层实现。其中重载属于静态分派,而重写则是动态分派的过程。 Java有自己的内存回收机制,但为什么还存在内存泄露的问题呢 这个问题

猪猪的机器学习笔记(十七)隐马尔科夫模型HMM

老子叫甜甜 提交于 2020-01-20 04:43:54
隐马尔科夫模型 HMM 作者:樱花猪 摘要: 本文为七月算法( julyedu.com ) 12 月机器学习第十七次课在线笔记。 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型 ,它用来描述一个含有隐含未知参数的马尔科夫过程 。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。在早些年HMM模型被非常广泛的应用,而现在随着机器学习的发展HMM模型的应用场景越来越小然而在图像识别等领域HMM依然起着重要的作用。 引言: 隐马尔科夫模型 是马尔科夫链 的一种,它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都是通过某些概率密度 分布表现为各种状态,每一个观测向量是由一个具有相应概率密度分布的状态序列产生。所以,隐马尔科夫模型 是一个双重随机过程----具有一定状态数的隐马尔科夫链 和显示随机函数集。自20世纪80年代以来,HMM被应用于语音识别 ,取得重大成功。到了90年代,HMM还被引入计算机文字识别和移动通信核心技术“多用户的检测”。HMM在生物信息科学、故障诊断等领域也开始得到应用。 本次课程以中文分子算法为实践背景基础来讲述隐马尔科夫模型。本次课程主要分享了隐马尔科夫模型的概率计算、参数估计和模拟预测等方法,结合课程上提到的实力,我们能够感受大HMM能够经久不衰的强大力量。

datawhale算法与数据结构(上)day4-队列

别来无恙 提交于 2020-01-20 04:43:15
datawhale算法与数据结构(上)day4-队列 理论部分 一、队列 定义 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫做队尾,允许删除的一段则称队头。 队列在程序设计中经常出现。一个最典型的例子就是操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行。如果运行的结果都需要通过通道输出,那就要按请求输出的先后次序排队。 2.用数组实现一个顺序队列 #说明sq . h # ifndef _SQ_H_ # define _SQ_H_ typedef int dataType ; # define maxSize 100 class sq { public : sq ( ) ; //~sq(); void push ( dataType var ) ; void pop ( ) ; dataType front ( ) ; bool isEmpty ( ) ; bool isFull ( ) ; private : dataType queue [ maxSize ] ; int head ; int tail ; } ; # endif #顺序队列类的定义 # include <iostream> # include "sq.h" using namespace std ; sq :

数据结构—算法时间复杂度、空间复杂度和问题规模

我怕爱的太早我们不能终老 提交于 2020-01-20 02:11:57
1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下, 算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示 ,若有某个辅助函数f(n),使得当n趋近于无穷大时, T(n)/f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)), 称 O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 另外,上面公式中用到的 Landau符号其实是由德国数论学家保罗·巴赫曼(Paul Bachmann)在其1892年的著作《解析数论》首先引入,由另一位德国数论学家艾德蒙·朗道(Edmund Landau)推广。 Landau符号的作用在于用简单的函数来描述复杂函数行为,给出一个上或下(确)界 。在计算算法复杂度时一般只用到大 O

时空复杂度分析

故事扮演 提交于 2020-01-20 02:08:00
1. 如何分析、统计算法的执行效率和资源消耗 前言:数据结构和算法本身解决的是“快”和“省”的问题,所以,执行效率是算法一个非常重要的考量指标。如何衡量编写的算法代码的执行效率,主要内容就是:时间、空间复杂度分析。 复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半(仅供参考)。 1.1 为什么需要复杂度分析 测试结果非常依赖测试环境 测试结果受数据规模 结论: 我们需要一个不用具体的测试数据来测试,就能粗略地估计算法地执行效率地方法。 1.2 大 O 复杂度表示法 定义: 所有代码的执行时间T(n)与每行代码的执行次数n成正比。 公式: T(n) = O(f(n)) 说明: T(n) 表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和,因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。 示例: T(n) = O(2n+2)、 T(n) = O(2n2+2n+3),这就是大 O 时间复杂度表示法(2n2代表2乘以n的平方)。当n很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,所以都可以忽略,我们只需记录一个最大量级即可:T(n) = O(n); T(n) = O(n2)。 名称: 大 O 时间复杂度表示代码执行时间随数据规模增长的变化趋势,也叫

第03组 Beta冲刺(3/4)

扶醉桌前 提交于 2020-01-20 02:01:12
队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐、搜索类算法 GitHub签入纪录: 暂无 接下来的计划: 下一周督促负责前端的组员赶快完工,同时开始后端的编写 燃尽图: 还剩下哪些任务: 各模块编码、测试、项目管理同步推进、各模块完成后进行对接 实景测试反馈优化 根据测试反馈优化 遇到哪些困难: 队员对开发软件运用还不熟练 比较多队员没有java的基础,需要临时自学 调整时间安排表比较困难 有哪些收获和疑问: 收获: 可以和队友一起学习新的算法知识、数据库知识,自学了一些有关于团队管理方面的知识。 疑问: 都是一些技术上的疑问 组员二:林家伟 组员二:林家伟 过去两天完成的任务: 文字/口头描述: 完成了数据库的构建 学会了如何构建web框架和前后端交互 GitHub签入纪录: 暂无 接下来的计划: 燃尽图: -实现后端对数据库的操作,并将数据反馈给前端显示 还剩下哪些任务: 真正实现Web框架的构建 完成Python对数据库的操作 遇到哪些困难: 课程压力大,考试较多,时间不足 实践较多,很难进行时间安排 有哪些收获和疑问: 收获: 学会了python的Flask框架 疑问: 需要解决如何在渲染界面的同时完成数据加载 组员三:吴智勇 过去两天完成的任务: 文字/口头描述