算法

【从0到1学算法】大O表示法

偶尔善良 提交于 2020-02-26 03:36:50
一般我们在选择算法时,都是想要选择效率最高的算法。那算法的效率,用什么表示?没错!就是用大O表示法。 PS : 大O表示法中,log即为log2,后面不再说明。 下面以简单查找和二分查找,在含有n个元素的有序列表中查找其中一个元素为例,下表总结了我们发现的情况。 使用简单查找时,最多需要猜测次数与列表长度相同,这被称为线性时间,大O表示法为O(n)。 二分查找则不同,最多需要猜测次数为logn(n为列表长度),这被称为对数时间(log时间),大O表示法为O(logn)。 基本概念 大O表示法指出了算法的速度有多快。 可能你会好奇,它的单位是多少?秒?没有单位,它并非指的是时间,而是从增量的角度衡量。 列表中查找元素,简单查找、二分查找的增速如下图。 假若我们不知道增速,只知道查找100个元素时的查找时间,猜测10000个元素时的查找时间: 对于简单查找,100个元素时为100毫秒,简单推算出10000个元素为10秒; 对于二分查找,100个元素时为7毫秒,简单推算出10000个元素为700毫秒。 PS:简单推算 10000个元素时的运行时间= 运行时间(100个元素时)* 100 简单查找的推算是对的,因为的增速是n,而二分查找的推算是错的,它的增速为logn,这便不能理所当然简单推算了。 很显然,我们只要知道算法的增速,便能知道它在n个元素中运行的运行时间了

数据结构与算法系列四(单链表)

China☆狼群 提交于 2020-02-26 03:09:12
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在上一篇【数据结构与算法系列三(数组)】中,我们知道了最基础的数据结构:数组

分布式系统ID生成方案

久未见 提交于 2020-02-26 02:17:49
自增ID 不错,可以限度抑制ID的大小。但需要有一个中心化的节点作为解决原子性问题。可以选用Redis,MySQL,Zookeeper。成本有点高。 UUID 分布式,而且唯一!缺点是生产的ID太长。 Twitter的SnowFlake算法 该算法可以 生产分布式的自增ID 。切生产的ID只有8字节,64位。其数据结构如下: 1位 ,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位 ,用来记录时间戳(毫秒)。 41位可以表示 2 41 − 1 个数字, 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2 41 − 1 ,减1是因为可表示的数值范围是从0开始算的,而不是1。 也就是说41位可以表示 2 41 − 1 个毫秒的值,转化成单位年则是 ( 2 41 − 1 ) / ( 1000 ∗ 60 ∗ 60 ∗ 24 ∗ 365 ) = 69 年 10位 ,用来记录工作机器id。 可以部署在 2 10 = 1024 个节点,包括 5位datacenterId 和 5位workerId 5位(bit) 可以表示的最大正整数是 2 5 − 1 = 31 ,即可以用0、1、2、3、....31这32个数字,来表示不同的datecenterId或workerId 12位 ,序列号,用来记录同毫秒内产生的不同id。

五分钟学编程:怎样才能学好笔试面试最爱考察的算法

删除回忆录丶 提交于 2020-02-26 01:23:13
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是算法 上回我们有一篇文章,讲述了作为一个新人程序员,如何学习数据结构这门课程,其实呢,数据结构和算法是息息相关的,为什么这么说呢,因为数据结构本身只是一个载体,而在数据结构之上产生作用和输出价值的东西其实是算法。 比如数据结构里的数组,看似非常简单的数据结构,却可以支持很多复杂的算法,比如动态规划,比如DFS和BFS,再比如字符串算法、二叉树算法等等。那么算法到底是什么东西呢,不妨让我们来看看官方的介绍。 根据百度百科的介绍,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 其实,算法的本质就是给你一组输入,运算之后给你一组输出,因此,算法帮人们解决很多问题把抽象的问题具体化,把一个问题转化成另外一个问题。 认识算法的N个阶段 我第一次遇到算法题,还是在我考研复习数据结构的时候,那个时候我看到的算法题其实都是很基础的题目,比如把数组中的两个元素置换,把两个链表合并成一个,但对于我来说已经是很有难度的事情了,那时候我连伪代码是什么都还不懂。 第二次认识算法,还是在研究生期间找实习工作的时候

Ribbon & Feign 简述

一笑奈何 提交于 2020-02-26 00:10:52
文章目录 Ribbon & Feign Ribbon Ribbon 概述 Ribbon IRule算法 Ribbon核心之IPing Ribbon 核心之ServerList Ribbon参数配置 Feign Feign是什么 Feign Http 性能优化 Feign 简化开发 Ribbon & Feign Ribbon Ribbon 概述 Ribbon 是客户端负载均衡器 Ribbon 服务发现 Ribbon 服务选择规则 Ribbon 服务监听 Ribbon IRule算法 IRule算法 算法描述 RoundRobinRule 轮询规则 RandomRule 随机规则 AvailabilityFilteringRule 可用过滤规则 WeightedResponseTimeRule 根据平均响应时间计算 RetryRule 遵循RoundRobin规则,但会对失败的服务进行重试 BestAvailableRUle 结合了可用过滤规则和响应时长规则 ZoneAvoidanceRule 复合判断server所在区域性能和可用性选择服务器 Ribbon核心之IPing IPing 是Ribbon保证服务可用性的基石 常见实现: NIWSDiscoveryPing , PingUrl IPing算法: IPing算法 算法描述 NIWSDiscoveryPing 不执行Ping操作

设计模式-模板方法模式

痞子三分冷 提交于 2020-02-25 23:29:08
模板设计模式 定义 模板设计模式就是在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 这个方法叫做模板方法. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 对于模板设计模式,最重要的就是要理解模板方法, 模板方法将算法定义成一组步骤, 其中任何步骤都可以是抽象的, 由子类负责实现. 这样能够保证算法结构保持不变, 同时由子类提供部分实现. 详细描述 类图如下: 其中 templateMethod() 就是模板方法, 而在模板方法中会使用primitiveOperation1()和primitiveOperation2()两个方法. 这两个方法会在不同的子类中有不同的实现. 具体代码如下: abstract class AbstractClass { // 模板方法定义为final, 防止子类进行修改 final void tempalteMethod() { primitiveOperation1(); primitiveOperation2(); concreteOperation(); hook(); } } // 这两个方法定义为抽象的,子类负责具体实现 abstract void primitiveOperation1(); abstract void primitiveOperation2(); //

粒子滤波概述

让人想犯罪 __ 提交于 2020-02-25 23:19:20
粒子滤波 (PF: Particle Filter) 的思想基于蒙特卡洛方法 (Monte Carlo methods) ,它是利用粒子集来表示概率,可以用在任何形式的状态空间模型上。其核心思想是通过从后验概率中抽取的随机状态粒子来表达其分布,是一种顺序重要性采样法 (Sequential Importance Sampling) 。简单来说,粒子滤波法是指通过寻找一组在状态空间传播的随机样本对概率密度函数进行近似,以样本均值代替积分运算,从而获得状态最小方差分布的过程。这里的样本即指粒子 , 当样本数量 N →∝时可以逼近任何形式的概率密度分布。 尽管算法中的概率分布只是真实分布的一种近似,但由于非参数化的特点,它摆脱了解决非线性滤波问题时随机量必须满足高斯分布的制约,能表达比高斯模型更广泛的分布,也对变量参数的非线性特性有更强的建模能力。因此,粒子滤波能够比较精确地表达基于观测量和控制量的后验概率分布,可以用于解决 SLAM 问题。 粒子滤波的应用 粒子滤波技术在非线性、非高斯系统表现出来的优越性,决定了它的应用范围非常广泛。另外,粒子滤波器的多模态处理能力,也是它应用广泛有原因之一。国际上,粒子滤波已被应用于各个领域。在经济学领域,它被应用在经济数据预测;在军事领域已经被应用于雷达跟踪空中飞行物,空对空、空对地的被动式跟踪;在交通管制领域它被应用在对车或人视频监控

「计算机基础复习」二、操作系统

て烟熏妆下的殇ゞ 提交于 2020-02-25 22:39:33
目录 (一)操作系统基础知识 1)分页和分段? 2)进程调度策略? 3)页面置换算法? 参考: (一)操作系统基础知识 1)分页和分段? 段式存储管理 是一种符合用户视角的内存分配管理方案。在段式存储管理中,将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰。段式管理的优点是:没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片) 页式存储管理 是一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的帧,程序加载时,可以将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离。页式存储管理的优点是:没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满)。 两者的 不同点 : 目的不同:分页是由于系统管理的需要而不是用户的需要,它是信息的物理单位;分段的目的是为了能更好地满足用户的需要,它是信息的逻辑单位,它含有一组其意义相对完整的信息; 大小不同:页的大小固定且由系统决定,而段的长度却不固定,由其所完成的功能决定; 地址空间不同: 段向用户提供二维地址空间;页向用户提供的是一维地址空间; 信息共享:段是信息的逻辑单位

随机梯度下降的逻辑回归算法(SGDLR)

浪尽此生 提交于 2020-02-25 20:00:04
由于第一次实验的实验报告不在这台机器,先写这一算法吧。 SGDLR(the Stochastic Gradient Descent for Logistic Regression),要讲解这一算法,首先要把名字拆为几块。 1 随机 2 梯度下降 3逻辑回归 先贴一篇文章: http://blog.csdn.net/zouxy09/article/details/20319673 这篇文章中解释的还不错。 其实这一算法,通俗来讲是这样子的: 1、手中肯定有很多带有label标记的数据,这是训练集。 2、我们期望能够建立一个带参数的式子,来计算某种情况出现的概率,以便于后面预测测试集的类别的时候,计算它在每一类的概率,取概率大的为自己的类。 3、由于sigmoid函数的优势:连续,光滑,严格单调,关于(0,0.5)中心对称,形如下图, 公式① 利用下面这个式子变换得到: 所以我们只需要计算出参数的值,就可以用公式①计算概率。 4、所有在训练集中出现的样本,已经真实存在了,所以它们带入计算出的概率应该是最大的,理想情况为1。根据这一特征来计算参数值。 5、式子并不是一个线性可解的,需要使用极大似然,这一算法不再赘述请自行谷歌。但是后来发现求参数的偏导数的时候,导数为0线性不可解,这时候就要用到梯度下降的算法。 6、所谓梯度下降的算法,事实上是从一个起点,一步步的试探,来回震荡

CNN目标检测系列算法发展脉络——学习笔记(一):AlexNet

半腔热情 提交于 2020-02-25 19:27:33
   在咨询了老师的建议后,最近开始着手深入的学习一下目标检测算法,结合这两天所查到的资料和个人的理解,准备大致将CNN目标检测的发展脉络理一理(暂时只讲CNN系列部分,YOLO和SSD,后面会抽空整理)。   目标检测的发展大致起始于2000年前后(具体我也没去深究,如果有误还请大佬们指正 ●ˇ∀ˇ● ),早期受限于算力,目标检测发展的不温不火,直到半导体技术的进步,以及Hinton团队的榜样作用,图像的目标检测才开始有了突飞猛进的发展。   就我个人理解,从2012年至今的目标检测的发展,并没有在算法上呈现出本质性的突破,更多的是将前人已经提出的算法/技巧,进行了巧妙的组合与优化,然后在高速设备上进行快速的验证与迭代,才有了目标检测如今繁荣的发展现状。(当然,也可能是因为小弟对学术界的发展所知甚少,而导致了一种以偏概全的理解🙃emm。。。)   接下来的几篇博客会按照 AlexNet --> R-CNN -->FastRCNN -->FasterRCNN --> MaskRCNN 的顺序来整理,今天的内容是ALexNet,因为我的目的在于简析目标检测发展脉络,把握算法的改进路线,所以不会特别详细的讲解算法原理(好吧,我就是懒的写怎么滴~( ̄▽ ̄)~*),只挑与“改进/发展”相关的部分内容简析,以作为我对目标检测领域的综述性学习笔记。 AlexNet    说起AlexNet