算法

react Diff 算法

本小妞迷上赌 提交于 2020-01-25 07:42:22
新旧虚拟DOM应该如何比对呢? react底层使用Diff(difference)算法来进行比对。我们知道,调用了setState方法时,数据(state,props)发生改变,就会进行比对。 下面我们先来看看setState方法。 setState方法是异步的,这样能够很好地提升react性能。假如我们要连续调用三次setState,变更三组数据,那么如果做三次虚拟DOM比对,更新三次页面。如果这三次调用的时间间隔非常短,这样是非常浪费性能的;react不会这样,它会把三个setState合并成一个,只做一次虚拟DOM的比对,更新一次页面。 我们再来看看Diff算法 Diff算法有个很重要的概念:同级比较。 首先会比较最顶层的虚拟DOM节点是否一致,如果一致的话,就继续比较下一层的节点;如果不一致的话,react就会把这个节点及其下面所有节点全部删掉,重新生成一遍新的DOM,然后用新的DOM替换原始页面的DOM。有人可能会说,这样性能不是会很低吗?如果除了这个最顶层节点不一致,下面都是一致的,这样整个替换,不会很浪费性能吗?其实,虽然可能会造成DOM重新渲染性能上的浪费,但比对的算法简单,由此比对速度也会很快,大大减少了比对算法上的性能消耗,所以采用同级比较的算法。 假如我们一个数组,数组中有5个数据,在页面第一次渲染的时候,我们把这5个数据映射成5个虚拟DOM节点

时间复杂度

血红的双手。 提交于 2020-01-25 06:10:31
算法效率衡量 执行时间反应算法效率 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。 单靠时间值绝对可信吗? 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的! 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢? 时间复杂度与“大O记法” 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率。 对于算法的时间效率,我们可以用“大O记法”来表示。 “大O记法”: 对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n)

在线算法 & 离线算法

醉酒当歌 提交于 2020-01-25 04:03:33
在线算法 & 离线算法 一.概念 离线算法: 算法设计策略都是基于在执行算法前输入数据已知的基本假设,也就是说,算法在求解问题已具有与该问题相关的完全信息,通常将这类具有问题完全信息前提下设计出的算法成为离线算法( off line algorithms) 在线算法: 在计算机科学中,一个在线算法是指它可以以序列化的方式一个个的处理输入,也就是说在开始时并不需要已经知道所有的输入。 相对的,对于一个离线算法,在开始时就需要知道问题的所有输入数据,而且在解决一个问题后就要立即输出结果。例如,选择排序在排序前就需要知道所有待排序元素,然而插入排序就不必。 因为在线算法并不知道整个的输入,对在线算法的研究主要集中在当前环境下怎么做出选择,在线算法找到的解只是局部最优解而无法保证整体最优。 对相同问题的在线算法和离线算法的对比分析形成了以上观点。如果想从其他角度了解在线算法可以看一下 流算法(关注精确呈现过去的输入所使用的内存的量),动态算法(关注维护一个在线输入的结果所需要的时间复杂度)和在线机器学习。 二.对称移动算法: package util ; /** * @projName: algorithm * @packgeName: util * @className: SymMoveLine * @author: pentiumCM * @email: 842679178@qq

数据挖掘十大经典算法

萝らか妹 提交于 2020-01-25 03:52:34
国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART. 不仅仅是选中的十大算法,其实参加评选的18种算法,实际上随便拿出一种来都可以称得上是经典算法,它们在数据挖掘领域都产生了极为深远的影响。 1.C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足; 2) 在树构造过程中进行剪枝; 3) 能够完成对连续属性的离散化处理; 4) 能够对不完整数据进行处理。 C4.5算法有如下优点: 产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。 2. The k-means algorithm 即K-Means算法 k-means algorithm算法是一个聚类算法,把n的对象根据他们的属性分为k个分割,k < n

算法题:关于穷举

半城伤御伤魂 提交于 2020-01-25 02:47:36
关于穷举 可能有的人会说,穷举的效率最差,时间复杂度和空间复杂度最高。但是对于应届生校招来说,穷举是最容易想到的思路了。 可能你在算法领域才刚刚入门,很多题目的思路也不清晰,这时候又来了一份笔试题,空着意味着gg,硬着头皮找思路却写不出来 最后想写穷举却频频出错。不如在刷算法题的时候有针对性的先手写穷举的思路与代码,也能很好的理一理代码。 我在今后写算法题的时候,能的话尽量会去写出穷举的代码。 来源: CSDN 作者: 李常常查德 链接: https://blog.csdn.net/qq_36330972/article/details/103755040

如何从科学论文中实现一个算法

空扰寡人 提交于 2020-01-25 01:04:43
原文: http://codecapsule.com/2012/01/18/how-to-implement-a-paper/ 作者:Emmanuel Goossaert 本文是从科学论文中实现算法的简短指南。我从书籍和科学出版物中实现了许多复杂的算法,本文总结了我在搜索,阅读,编码和调试方面所学到的知识。这显然仅限于与计算机科学领域有关的领域的出版物。然而,您应该能够将以下提供的指导方针和良好做法应用于任何类型的文件或实施。 1 - 在你进入之前 在您阅读技术论文并实施之前,您应该查看几点。每当你准备开始这样一个项目时,请确保你仔细地盖住他们。 1.1 - 找到一个开源实现,以避免编码 除非你想为了更多地了解这个领域来执行论文,否则你无需实现。事实上,你想要的不是对纸张进行编码,而只是实现纸张的代码。所以在你开始任何事情之前,你应该花几天的时间试图在互联网上找到一个开源的实现。只要考虑一下:你宁愿失去两天的时间寻找代码,还是浪费两个月来实现一个已经可用的算法? 1.2 - 找到更简单的方法来实现你的目标 问问自己想要做什么,如果更简单的解决方案可以满足您的需要。您可以使用其他技术 -即使结果只有您想要的80% -不需要实现该文档,并且您可以在随后的两天内运行可用的开源库?有关更多信息,请参阅我的文章 20/80生产力规则 。 1.3 - 小心软件专利 如果您在美国,请注意软件专利

sklearn中的PCA模型

蹲街弑〆低调 提交于 2020-01-25 01:01:37
sklearn中提供了较为丰富的PCA模型来解决数据的降维问题,其包括: (1)PCA:最原始的PCA算法; (2)TruncatedSVD:原始数据不做中心化处理的PCA算法,可用于文本数据(TF-IDF处理后)的隐藏语义分析(LSA); (3)SparsePCA:添加L1正则化处理后的PCA算法,用最小角回归算法求解,可在一定程度上解决数据噪声的问题,进一步降低分解后的数据维度; (4)MiniBatchSparsePCA:添加L1正则化处理后PCA算法,基于小批量数据的PCA算法。 (5)IncrementalPCA:增量学习的PCA算法,通过partial_fit解决数据量过大情况下内存限制的问题。 (6)KernelPCA:样本协方差矩阵中的元素均为样本内积,因此可利用核技巧,将其它应用到非线性空间上。 本文仅详细介绍最原始的PCA算法。 1. 模型的主要参数 模型参数 Parameter含义 备注 n_components 主成分数 用于空值分解后的目标维度,其可选值包括:1.整数,指定具体的值;2. 百分比,分解后的维度包含的信息量(方差)必须大于原始信息量*百分比;3. 'mle'采用极大似然估计法,预估目标维度;4.None, 默认为数据特征数目和数据行数中最小的那个值,注意当solver为'arpack',还需在上述值基础上减1; whiten 白化 布尔值

算法 快速排序

落花浮王杯 提交于 2020-01-25 00:28:25
快速排序 思想: 代码: public class QuickSort { public static void quick(int[] a){ if(a.length > 0){ quickSort(a,0,a.length-1); } for(int b : a){ System.out.print(b+" "); } } private static void quickSort(int[] a, int low, int high) { if(low < high){ int mindle = sort(a,low,high); quickSort(a,low,mindle-1); quickSort(a,mindle+1 ,high); } } private static int sort(int[] a, int low, int high) { int temp = a[low]; while(low < high){ while(low < high && temp <= a[high]) high--; a[low] = a[high]; while(low < high && temp >= a[low]) low++; a[high] = a[low]; } a[low] = temp; return low; } public static void

MD5加密算法原理及实现

≡放荡痞女 提交于 2020-01-24 23:03:37
本文转自九天之方,原文地址:http://www.cnblogs.com/hjgods/p/3998570.html MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的 消息 进行运行,产生一个128位的消息摘要。 以下所描述的消息长度、填充数据都以位(Bit)为单位,字节序为小端字节。 算法原理 1、数据填充 对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。 填充方法:在消息后面进行填充,填充第一位为1,其余为0。 2、添加消息长度 在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于2 64 ,则只使用其低64位的值,即(消息长度 对 2 64 取模)。 在此步骤进行完毕后,最终消息长度就是512的整数倍。 3、数据处理 准备需要用到的数据: 4个常数: A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476; 4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z)); H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z)); 把消息分以512位为一分组进行处理

机器学习笔记--KNN算法1

耗尽温柔 提交于 2020-01-24 20:30:29
前言 Hello ,everyone. 我是小花。大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来。 一 KNN算法简介 KNN(k-nearest neighbor的缩写)又叫最近邻算法。是1968年由Cover和Hart提出的一种用于分类和回归的无母数统计方法。什么叫无母统计方法呢,这里作个补充:无母统计方法又称非参数统计学,是统计学的一个分支,适用于母群体情况未明,小样本,母群体分布不为常态也不易转换为常态。特点在于尽量减少或不修改其建立之模型,比较适合处理样本不大的数据。(我怎么感觉这么像韦小宝啊。。。哈哈,有点扯远了,你懂得)。 KNN的工作原理是:存在一个样本数据集合,也称为训练样本集,而且样本集中每个数据都存在标签,也就是我们知道样本集中每一个数据与所属分类对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。怎样理解这句话呢,现在我们想,假如广场上有很多狗,这些狗都是一条母狗带一群小狗,各个品种的都有。每条狗都都知道自己的母亲是谁。但是有一条狗喝了不下心忘情水,不知道自己妈妈在哪了,如何找他的母亲呢。那我们就把这条狗的特征与那些小狗的特征进行对比。然后取最相似的狗