算法

美团后台开发工程师一面知识点总结

非 Y 不嫁゛ 提交于 2020-01-04 14:46:33
正向代理和反向代理的区别? 正向代理和反向代理的本质都是代为收发请求和响应。 正向代理是一个位于客户端和目标服务器之间的代理服务器。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。 正向代理的情况下客户端必须要进行一些特别的设置才能使用。 反向代理正好相反。 对于客户端来说,反向代理就好像目标服务器,并且客户端不需要进行任何设置。 客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,因此客户端并不会感知到反向代理后面的服务,也不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。 正向代理隐藏了客户端。(访问谷歌的梯子) 反向代理隐藏了服务器。(负载均衡,访问内网服务器) 参考资料: 反向代理为何叫反向代理? 进程,线程,协程? 进程 进程指一个正在执行的程序,是系统资源分配的最小单位,一个进程一般由以下几部分组成: 程序代码(称为文本段或者代码段) 当前的活动(包括程序计数器,寄存器的内容) 数据段(包括全局变量) 栈(包括函数参数,返回地址和局部变量等临时参数) 堆(进程运行期间动态分配的内存) 进程的特点: 动态性:进程由创建而产生,由调度而执行,因得不到资源而暂停执行,由撤销而消亡。 并发性

机器学习算法汇总

三世轮回 提交于 2020-01-04 09:15:07
原文来自http://www.csdn.net/article/2014-06-27/2820429 1.监督式学习: 在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见算法有逻辑回归(Logistic Regression)和反向传递神经网络(Back Propagation Neural Network) 2.非监督式学习: 在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。 3.半监督式学习: 在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(Graph Inference

机器学习实战笔记-1-机器学习基础

Deadly 提交于 2020-01-04 09:08:22
# 机器学习基础 监督学习简介 监督学习的两个任务: 分类 和 回归分析 (预测数值型数据)。 分类思路 分类方法思路: 这个表至关重要,叫做特征向量表 特征1 特征2 … 目的变量(类别) 实例1 … … … … 实例2 … … … … … … … … … 如上表,分类思路如下: 找到输入采样集中的特征(属性)-用你的大脑 给各特征一个值,并确定该值的类型(十进制,二值型,枚举型) 根据特征值进行分类: 算法训练(如何分类): 用大量的已分类数据(其目标变量的值已给出)组成的训练集进行训练,该训练集由若干个训练样本构成,每个训练样本是一个实例 测试样本(不提供目标变量) 比较目标变量的预测值和实际样本的目标变量值,计算得到算法的精确度。 监督学习的另一个任务是回归分析。 无监督学习简介 无目标变量(无类别信息),其主要任务有: 聚类:将数据集合分成由类似的对象组成的多个类的过程; 密度估计:寻找描述数据统计值的过程 减少数据特征的维度,方便用2/3维图形直观展示数据信息 机器学习算法的主要用途总结 监督学习的用途 k-近邻算法 朴素贝叶斯算法 支持向量机 决策树 线性回归 局部加权线性回归 Ridge回归 Lasso最小回归系数估计 其中深橙色表示分类算法,浅蓝色表示回归分析算法。 无监督学习的用途 k-均值 最大期望算法 DBSCAN Parzen窗设计

学习笔记之机器学习实战 (Machine Learning in Action)

空扰寡人 提交于 2020-01-04 09:08:00
机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存、谋发展的决定性手段,这使得这一过去为分析师和数学家所专属的研究领域越来越为人们所瞩目。 本书第一部分主要介绍机器学习基础,以及如何利用算法进行分类,并逐步介绍了多种经典的监督学习算法,如k近邻算法、朴素贝叶斯算法、Logistic回归算法、支持向量机、AdaBoost集成方法、基于树的回归算法和分类回归树(CART)算法等。第三部分则重点介绍无监督学习及其一些主要算法:k均值聚类算法、Apriori算法、FP-Growth算法。第四部分介绍了机器学习算法的一些附属工具。 全书通过精心编排的实例,切入日常工作任务,摒弃学术化语言,利用高效的可复用Python代码来阐释如何处理统计数据,进行数据分析及可视化。通过各种实例,读者可从中学会机器学习的核心算法,并能将其运用于一些策略性任务中,如分类、预测、推荐。另外,还可用它们来实现一些更高级的功能,如汇总和简化等。 Machine Learning in Action https://www.safaribooksonline.com/library/view/machine-learning-in

数据结构的事件复杂度和空间复杂度

爱⌒轻易说出口 提交于 2020-01-04 09:06:02
事件复杂度和空间复杂度 数据结构01 算法的时间复杂度和空间复杂度 1、算法的概念: 算法 (Algorithm),是对特定问题求解步骤的一种描述。 算法五大特征 1. 输入 2. 输出 3. 有穷性 4. 确定性 5. 可行性 解决一个问题往往有不止一种方法,算法也是如此。那么解决特定问题的多个算法之间如何衡量它们的优劣呢?有如下的指标: 2、衡量算法的指标: (1)时间复杂度:执行这个算法需要消耗多少时间。 (2)空间复杂度:这个算法需要占用多少内存空间。 同一个问题可以用不同的算法解决,而一个算法的优劣将影响到算法乃至程序的效率。算法分析的目的在于为特定的问题选择合适算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。 算法在时间的高效性和空间的高效性之间通常是矛盾的。所以一般只会取一个平衡点。通常我们假设程序运行在足够大的内存空间中,所以研究更多的是算法的时间复杂度。 3、算法的时间复杂度   (1)语句频度T(n): 一个算法执行所花费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。而且一个算法花费的时间与算法中的基本操作语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度,记为T(n)。 关键要知道执行次数 ==

并行计算基础

耗尽温柔 提交于 2020-01-04 05:05:34
冒泡排序算法:   - 算法分析:     时间复杂度:       经过几轮修改,数组正序时,最优复杂度可以达到O(n);逆序时,最差复杂度O(n2)。     稳定性:       算法中,每次只有前一个元素大于后一个元素,才会进行交换。所以数值相同的两个元素,不会发生位置互换,所以可以保持之前前后顺序。故,冒泡排序是稳定的排序。   算法演示如下:        奇偶排序算法: 时间复杂度/空间复杂度; 排序方法 时间复杂度 空间复杂度 稳定性 复杂度 平均情况 最坏情况 最好情况 奇偶排序 O(nlog 2 n) O(nlog 2 n) O(n) O(1) 稳定 较简单 适用于并行计算的指令必须满足以下3个条件: 1、指令J的输入和指令I的输出交集为空;//不依赖另一条指令的输出作为输入 2、指令I的输入和指令J的输出交集为空; 3、指令I和指令J的输出交集为空;;//确保不会同时对相同的变量进行写操作 不适用于并行处理的场景: 1、两条指令享有共同的输出集; 2、一条指令的输出包含全部或者部分另一条指令的输入; 3、一条指令的输入包含全部或者部分另一条指令的输出。 来源: https://www.cnblogs.com/able7/p/10194863.html

并发编程下的性能定律(翻译)

空扰寡人 提交于 2020-01-04 05:05:03
并发编程下的性能定律 ( 翻译 ) 理解 Amdahl 定律 如果你想利用多核的优势在尽可能少的时间运行尽可能多的指令,那么就需要以并行的序列分离代码。然而,大多的算法需要运行一些串行代码来调整并行执行。例如,并行执行很多代码块,最后收集他们执行的结果。那些分解并行执行工作复杂和收集执行结果的代码是串行代码,它是不能利用并行的优势的。如果你的算法中有很多这样的代码片段,那么串行代码所占的比例就会增加,并且能够获取到的性能收益就会减少。 Gene Amdahl 是一个著名计算机架构师,当一个系统中仅有少量的计算机改善硬件的时候,那么能够获得最大的性能改善是多少呢?他做了大量与这方面有关的观察研究。他使用这些观察结果定义了 Amdable’s Law ,它是由一个预测使用多核处理器在理论上可以获得最大性能改善的公式组成。它也使用于那些运行在多核处理器上的并发算法。 Maximum speedup ( in times ) = 1/((1-p) + p/n) 在这个公式中 P 就是代码中可以完全并行执行的部分。 n 就是可用的执行单元的数目(处理器或者物理核心)。 根据这个公式,如果你有一个仅有 50% ( P = 0.5 )的工作需要并行执行的算法,那么在双核微处理器可以获得的最大速度是 1.33 倍。图 1-8 阐述了一个拥有 1000 个工作单元的算法分解成 500

并行化程序设计的四步走

本小妞迷上赌 提交于 2020-01-04 05:04:19
多核计算平台的普及化使得并行(Parallel)或者并发(Concurrent)程序设计(这里不妨称它们为并行化程序设计)成为一种编程技术主流。其实并行计算的软件技术早已存在了几十年,然而其原来主要服务于高性能计算一类的应用,所以并行化编程一直也都为阳春白雪的光环笼罩。现在谈到多核编程,讨论较多的是各种软件或者并行编程模型的使用;对于初学者而言却仍可能难以循其径而入。 其实,并行化的程序设计是有章可循的。按照开发流程的顺序,可以把并行化程序设计分为以下四个阶段: 1. 可行算法(解决方案)的描述与分析 2. 工作分解(Decomposition)——依赖性和同步与通信开销分析 3. 选择编程(实现)模型 4. 性能检查及优化 在设计的初始阶段,开发者应当针对要解决的问题先找到一个可行的解决方案或者算法。比如,排序问题的解决方案有气泡排序,快速排序,二叉树排序等已知可行的方法可以作为并行化的基础算法。而在进行具体的并行化设计之前,有一个很重要的分析(或者评估)要做,那就是并行化的必要性分析;即,应该估计一下目标问题的计算量。如果需要解决的问题计算量并不是很大,比如只需要对30个整数进行排序,即使采用传统串行程序也不会占用太多时间,那么就可能没有为之设计并行化程序的必要,因为并行化也是要付出其它计算的代价的。另外,基础算法的选择也很有讲究。有些算法本身就不具备太多的并行性

Huffman算法实现文件压缩解压

China☆狼群 提交于 2020-01-04 01:15:42
title: Huffman算法实现文件压缩解压 date: 2020-01-02 20:33:11 description: 基于Huffman编码算法实现文件压缩解压 原文网址 Huffman算法实现文件压缩解压 前言  哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩。下面讲述如何用哈夫曼编解码实现文件的压缩和解压。 哈夫曼编码的概念  哈夫曼树又称作最优树,是一种带权路径长度最短的树,而通过哈夫曼树构造出的编码方式称作哈夫曼编码。 也就是说哈夫曼编码是一个通过哈夫曼树进行的一种编码,一般情况下,以字符 “0” 与 “1” 表示。编码的实现过程很简单,只要实现哈夫曼树,通过遍历哈夫曼树,这里我们从根节点开始向下遍历,如果下个节点是左孩子,则在字符串后面追加 “0”,如果为其右孩子,则在字符串后追加 “1”。结束条件为当前节点为叶子节点,得到的字符串就是叶子节点对应字符的编码。 哈夫曼编码用于文件压缩的原理  我们都知道根据人类使用文字对应的每个字符都是有特定的频率的。比如说英文,一般来说字母a或者e的使用频率很高。如果我们能给出现频率最高的字符很短的编码,出现最少的字符最长的编码,而且保证每个编码都不是任意一个编码的前缀码。为什么要保证这样呢?如果任意一个编码都不是其他编码的前缀码