算法

diff算法(核心)

我只是一个虾纸丫 提交于 2020-01-16 03:46:57
ps:大致转载 知乎文章 vue和react的虚拟dom都采用类似的diff算法,核心大概可以归为两点 1,两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构; 2,同一层级的一组节点,他们可以通过唯一的id进行区分。 基于以上两点假设,是的虚拟的DOM的Diff算法的复杂程度从O(n^3)降到了O(n)。 当页面的数据发上变化的时候,Diff算法只会比较同一层级的节点: 如果节点类型不同,直接干掉前面的节点,在创建并插入新的节点,不会再比较这个节点以后的子节点了。 如果节点类型相同,则会重新设置节点的属性,从而实现节点的更新。 当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上的原则。 如下例子: 我们希望在B和C之间加一个F,Diff算法默认执行起来是这样的 即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率? 所以我们需要使用key来给每个节点做一个唯一的标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。 所以一句话,key的作用就是为了搞笑的更新虚拟DOM。另外vue中在使用相同标签名元素的过度切换时, 也会使用到key属性,其目的也是为了让vue可以区分他们,否则vue只会替换其内部属性而不触发过渡效果。 ps:key最好不要用index,用单一的唯一的标记 来源:

MySQL的JOIN(二):JOIN原理

醉酒当歌 提交于 2020-01-16 01:20:29
表连接算法 Nested Loop Join(NLJ)算法: 首先介绍一种基础算法:NLJ,嵌套循环算法。循环外层是驱动表,循坏内层是被驱动表。驱动表会驱动被驱动表进行连接操作。首先驱动表找到第一条记录,然后从头扫描被驱动表,逐一查找与驱动表第一条记录匹配的记录然后连接起来形成结果表中的一条记。被驱动表查找完后,再从驱动表中取出第二个记录,然后从头扫描被驱动表,逐一查找与驱动表第二条记录匹配的记录,连接起来形成结果表中的一条记录。重复上述操作,直到驱动表的全部记录都处理完毕为止。这就是嵌套循环连接算法的基本思想,伪代码如下。 foreach row1 from t1 foreach row2 from t2 if row2 match row1 //row2与row1匹配,满足连接条件 join row1 and row2 into result //连接row1和row2加入结果集 首先加载t1,然后从t1中取出第一条记录,之后加载t2表,与t2表中的记录逐个匹配,连接匹配的记录。 Block Nested Loop Join(BNLJ)算法: 再介绍一种高级算法:BNLJ,块嵌套循环算法,可以看作对NLJ的优化。大致思想就是建立一个缓存区,一次从驱动表中取多条记录,然后扫描被驱动表,被驱动表的每一条记录都尝试与缓冲区中的多条记录匹配,如果匹配则连接并加入结果集。缓冲区越大

目标检测之IoU、precision、recall、AP、mAP详解

喜欢而已 提交于 2020-01-16 01:06:58
目录 1. 目标检测概述 2. IoU 3.precision(精度)和recall(召回率) 4. AP和mAP 5.实际计算方法 1. 目标检测概述 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是计算机视觉领域的核心问题之一。以下图为例,图中需要识别3类物体:car(车)、bicycle(自行车)、dog(狗),通过特定的目标检测算法希望最终把每类物体检测出来,每类物体用一个矩形框框出来并且输出对应的类别。 因此,目标检测可以简单的理解为用个框把物体框出来并告诉我这个框里是什么。 在目标检测领域需要衡量每个检测算法的好坏,因此定义了很多指标,例如常见的IoU、precision、recall、AP、mAP等, 各个算法经过检测后得到每个物体的检测框和置信度,然后根据该值来计算上述指标值,从而方便大家一起来评估各个算法的优劣。 每个指标各不相同,下面详细阐述每个指标的概念和计算方法。 2. IoU IoU全程为Intersection Over Union ,意思是“并集里面的交集”。它的计算可以简单的用下图表示: 一个物体它会有一个真值框,英文称为ground truth,也就是我们实际为它标注的真实矩形框(一般情况下该矩形框是物体的最小外接矩形框,手工标注)。在评价一个算法的时候首先用该算法对图片进行检测,得到该物体的预测框

2018Java研发实习内推

别说谁变了你拦得住时间么 提交于 2020-01-16 00:20:37
作者:sdu王镜鑫 链接: https://www.nowcoder.com/discuss/74573?type=0&order=4&pos=7&page=1 来源:牛客网 本人某末流985软件工程大三本科生,参加了阿里,美团百度的Java研发岗实习生内推,其中阿里4月五号发了offer,美团4月3号发了口头offer,百度3月20发了offer。其中阿里一共是五面,三面技术两面hr,美团一共四面,两面技术两面hr,百度一共三面两面技术一面hr。 下面分享一下面试过程。 阿里一面 77min: 1、自我介绍 2、介绍项目 3、大量数据,高并发访问如何优化 4、热点数据访问优化 5、频繁修改的数据如何保证一致性 nwr模型,cap理论等 6、平时如何学习 7、有没有参与过开源项目 8、Java的基本数据类型有哪些?(忘了short) 9、实现多线程的三种方式,说说线程池 10、线程是不是开的越多越好,开多少合适,如何减少上下文切换开销,如何写个shell脚本获取上下文切换的开销? 11、乐观锁实现 12、jvm内存模型,1.6 1.7 1.8哪里不同 13、gc算法,可达性分析 14、考虑对于老年代怎么解决互联网应用中gc停顿问题,怎么解决内存碎片问题 15、约瑟夫问题 O(n)的算法 16、谈谈对spring ioc的理解 17、看过什么框架源码 阿里二面 50min: 1

MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins

眉间皱痕 提交于 2020-01-15 23:52:26
MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins 在MySQL中,可以使用批量密钥访问(BKA)连接算法,该算法使用对连接表的索引访问和连接缓冲区。 BKA算法支持 :内连接,外连接和半连接操作,包括嵌套外连接。 BKA的优点 :更加高效的表扫描提高了连接性能。 此外,先前仅用于内连接的块嵌套循环(BNL)连接算法现已扩展,可用于 外连接 和 半连接 操作,包括 嵌套外连接 。 以下部分讨论了连接缓冲区管理,它是原始BNL算法扩展,扩展BNL算法和BKA算法的基础。 有关半连接策略的信息,请参见 “使用半连接转换优化子查询,派生表和视图引用” Nested Loop Join 算法 Block Nested-Loop 算法 Batched Key Access 算法 BNL和BKA算法的优化器Hint Nested Loop Join算法 将外层表的结果集作为循环的基础数据,然后循环从该结果集每次一条获取数据作为下一个表的过滤条件去查询数据,然后合并结果。如果有多个表join,那么应该将前面的表的结果集作为循环数据,取结果集中的每一行再到下一个表中继续进行循环匹配,获取结果集并返回给客户端。 伪代码如下 : for each row in t1 matching range { for each row in t2

算法提高 合并石子

巧了我就是萌 提交于 2020-01-15 23:06:26
算法提高 合并石子 时间限制:2.0s 内存限制:256.0MB 问题描述   在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。 输入格式   输入第一行包含一个整数n,表示石子的堆数。   接下来一行,包含n个整数,按顺序给出每堆石子的大小 。 输出格式   输出一个整数,表示合并的最小花费。 样例输入 5 1 2 3 4 5 样例输出 33 数据规模和约定   1<=n<=1000, 每堆石子至少1颗,最多10000颗。 时间超限:数据通过80%数据 /* long long最大值和最小值都是19位数 */ #include<cstdio> #include<iostream> #include<cmath> #include<cstring> using namespace std; long long n,a[1010],dp[1010][1010],sum[1010]; int main(void){ cin >> n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j] = 100000000000000000; //memset(dp,1,sizeof(dp)); for(int i=1;i<=n;i++

【技术分享】GBDT算法-原理篇

ぃ、小莉子 提交于 2020-01-15 17:28:19
本文原作者:蒋凯,经授权后发布。 原文链接: https://cloud.tencent.com/developer/article/1509000 导语 :工业界机器学习大杀器解读。 GBDT是常用的机器学习算法之一,因其出色的特征自动组合能力和高效的运算大受欢迎。 这里简单介绍一下GBDT算法的原理,后续再写一个实战篇。 1、决策树的分类 决策树分为两大类,分类树和回归树。 分类树用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面; 回归树用于预测实数值,如明天的温度、用户的年龄、网页的相关程度; 两者的区别: 分类树的结果不能进行加减运算,晴天+晴天没有实际意义; 回归树的结果是预测一个数值,可以进行加减运算,例如20岁+3岁=23岁。 GBDT中的决策树是回归树,预测结果是一个数值,在点击率预测方面常用GBDT,例如用户点击某个内容的概率。 2、GBDT概念 GBDT的全称是Gradient Boosting Decision Tree,梯度提升决策树。 要理解GBDT,首先就要理解这个B(Boosting)。 Boosting是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。Boosting方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断

立体匹配十大概念综述---立体匹配算法介绍

强颜欢笑 提交于 2020-01-15 17:04:24
立体匹配十大概念综述—立体匹配算法介绍 来自:https://blog.csdn.net/wintergeng/article/details/51049596 一、概念 立体匹配算法主要是通过建立一个能量代价函数,通过此能量代价函数最小化来估计像素点视差值。立体匹配算法的实质就是一个最优化求解问题,通过建立合理的能量函数,增加一些约束,采用最优化理论的方法进行方程求解,这也是所有的病态问题求解方法。 二、主要立体匹配算法分类 1)根据采用图像表示的基元不同,立体匹配算法分为: A、区域立体匹配算法(可获取稠密视差图。缺点:受图像的仿射畸变和辐射畸变影响较大;像素点约束窗口的大小与形状选择比较困难,选择过大,在深度不连续处,视差图中会出现过度平滑现象;选择过小,对像素点的约束比较少,图像信息没有得到充分利用,容易产生误匹配。) B、基于特征的立体匹配算法(可获得稀疏的视差图,经差值估计可获得稠密视差图。可提取点、线、面等局部特征,也可提取多边形和图像结构等全局特征。缺点:特征提取易受遮挡、光线、重复纹理等影响较大;差值估计计算量大) C、基于相位立体匹配算法(假定在图像对应点中,其频率范围内,其局部相位是相等的,在频率范围内进行视差估计) 2)依据采用最优化理论方法的不同,立体匹配算法可以分为: A、局部的立体匹配算法 B、全局的立体匹配算法 三、匹配基元(match

负载均衡的基本算法

末鹿安然 提交于 2020-01-15 16:56:18
负载均衡的基本算法,主要有以下几种( 参考F5产品 ): 随机:负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,然后把连接发送给它。虽然许多均衡产品都支持该算法,但是它的有效性一直受到质疑,除非把服务器的可运行时间看的很重。 轮询:轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。轮询算法在大多数情况下都工作的不错,但是如果负载均衡的设备在处理速度、连接速度和内存等方面不是完全均等,那么效果会更好。 加权轮询:该算法中,每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第3台机器。 动态轮询:类似于加权轮询,但是,权重值基于对各个服务器的持续监控,并且不断更新。这是一个动态负载均衡算法,基于服务器的实时性能分析分配连接,比如每个节点的当前连接数或者节点的最快响应时间等。 最快算法:最快算法基于所有服务器中的最快响应时间分配连接。该算法在服务器跨不同网络的环境中特别有用。 最少连接:系统把新连接分配给当前连接数目最少的服务器。该算法在各个服务器运算能力基本相似的环境中非常有效。 观察算法:该算法同时利用最小连接算法和最快算法来实施负载均衡。服务器根据当前的连接数和响应时间得到一个分数

Python 之进程

牧云@^-^@ 提交于 2020-01-15 15:15:30
理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 所以想要真正了解进程,必须事先了解操作系统, 点击进入 PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。 必备的理论基础: 一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 1.产生背景:针对单核,实现并发 ps:现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,且会被调度到4个cpu中的任意一个,具体由操作系统调度算法决定。 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片 强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行 什么是进程 进程(Process