算法

策略模式

夙愿已清 提交于 2020-02-20 04:41:46
定义    策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。   策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。 角色   环境类(Context) : 用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。   抽象策略类(Strategy): 定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。   具体策略类(ConcreteStrategy): 以Strategy接口实现某具体算法。 使用场景   当存在以下情况时使用Strategy模式   1、多个类只区别在表现行为不同。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。   2、需要使用一个算法的不同变体。   3、对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。   4、一个类定义了多种行为 , 且这些行为在该类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的Strategy类中以代替这些条件语句。 优缺点   对于Strategy模式来说,主要有如下优点:   1、 提供了一种替代继承的方法

七大排序算法汇总(python实现)

依然范特西╮ 提交于 2020-02-20 03:00:16
关注“python趣味爱好者”公众号,回复“排序算法”获取源代码 目前,常见的排序算法有: 冒泡排序 插入排序 选择排序 堆排序 计数排序 快速排序 本篇文章将围绕这七大算法进行介绍,我们先来学习一下整体的代码结构: class SORT ( object ) : def __init__ ( self ) : self . arr = [ 20 , 64 , 34 , 25 , 12 , 22 , 11 , 90 ] self . n = len ( self . arr ) self . num = 0 print ( self . arr ) def out_put ( self ) : print ( 50 * '-' ) print ( "最终排序结果" , self . arr ) def bubbleSort ( self ) : #冒泡排序 pass def shellSort ( self ) : #希尔排序 pass def insertionSort ( self ) : #插入排序 pass def Selectionsort ( self ) : #选择排序 pass def heapSort ( self ) : #堆排序 pass def countSort ( self ) : #计数排序 pass def quickSort ( self ) :

KMP算法的next[]数组通俗解释

一曲冷凌霜 提交于 2020-02-20 02:10:49
KMP算法的next[]数组通俗解释 我们在一个母字符串中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容。 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。 这个next数组的求法是KMP算法的关键,但不是很好理解,我在这里用通俗的话解释一下,看到别的地方到处是数学公式推导,看得都蛋疼,这个篇文章仅贡献给不喜欢看数学公式又想理解KMP算法的同学。 1、用一个例子来解释,下面是一个子串的next数组的值,可以看到这个子串的对称程度很高,所以next值都比较大。 位置i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 前缀next[i] 0 0 0 0 1 2 3 1 2 3 4 5 6 7 4 0 子串 a g c t a g c a g c t a g c t g 申明一下:下面说的对称不是中心对称,而是中心字符块对称,比如不是abccba,而是abcabc这种对称。 (1

查找算法

你离开我真会死。 提交于 2020-02-19 23:11:45
目录 折半查找 线性索引查找 折半查找 折半查找又称为二分查找,它的前提是记录的关键码有序,线性表必须采用顺序存储。折半查找的思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。 假设我们现在有这样-一个 有序表数组{0,1,16,24,35,47,59,62,73,88,99}16,除0下标外共10个数字。对它进行查找是否存在62这个数。我们来看折半查找的算法是如何工作的。 int Binary_Search(int *a, int n, int key) { int low, high, mid; low = 0; /*定义最低下标为记录首位*/ high = n; /*定义最高下标为记录末位*/ while (low <= high) { mid = (low + high) / 2; /*折半*/ if (key < a[mid]) /*若查找值比中值小*/ { high = mid - 1; /*最高下标调整到中位下标小一位*/ } else if (key > a[mid]) /*若查找值比中值大*/ { low - mid + 1; /

JVM的四种GC算法

瘦欲@ 提交于 2020-02-19 17:49:25
程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM 的 GC 算法主要有下面四种: 1、引用计数算法(Reference counting) 每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。 2、标记–清除算法(Mark-Sweep) 为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。 分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。 3、标记–整理算法 标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。 4、复制算法 该算法将内存平均分成两部分,然后每次只使用其中的一部分

C#设计模式学习笔记:(13)模板方法模式

百般思念 提交于 2020-02-19 16:43:30
本笔记摘抄自: https://www.cnblogs.com/PatrickLiu/p/7837716.html ,记录一下学习过程以备后续查用。 一、引言 今天我们要讲行为型设计模式的第一个模式--模板方法模式,先从名字上来看。“模板方法”理解为有一个方法的名字叫“模板方法”,也可以换个理解方法: 有一个方法包含了一个模板,这个模板是一个算法。在我们的现实生活中有很多例子可以说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子必须经过 三步:第一步是“和面”,第二步是“包馅”,第三步是“煮饺子”,这三步就是一个算法。如果想吃到不同类型的饺子,可以上面的三步中的任意一步进行操作, 当然也可以完全定义这三步。下面我们就来看看这个模式的详细介绍吧。 二、模板方法模式介绍 模板方法模式:英文名称--Template Method Pattern;分类--行为型。 2.1、动机(Motivate) 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的 关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求? 2.2、意图(Intent) 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template

AIZOO开源人脸口罩检测

ε祈祈猫儿з 提交于 2020-02-19 15:04:25
帮一个创业的小伙伴转的他们自己开源的一个人脸戴口罩检测模型,效果还不错,支持一下,嘿嘿! 原文链接在此 近一个月来,新冠肺炎疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研发出了带有AI人脸检测算法的红外测温、口罩佩戴检测等设备,依图、阿里也研发出了通过深度学习来自动诊断新冠肺炎的医疗算法。可以说,各行各业的从业者都在为早日战胜这场疫情贡献着力量。 作为互联网+AI领域的创业团队,我们决定开源我们整理的口罩检测数据集和训练好的模型(提供keras版本和caffe版本)、代码,另外,我们也将模型转为了TensorFlow.js支持的格式,部署到了我们的网站aizoo.com上,方便大家在浏览器里面体验。 在文章末尾,有我们开源的所有资料的链接,如果您不想看文章内容,可以直接滑到文章底部查看资料链接。 首先,让我们先看一个效果视频。 视频没法转,有兴趣的小伙伴去看原文吧 视频中红色是未戴口罩,绿色是佩戴了口罩。可以看到,如果是双手捂住了嘴巴多半部分,模型会认为是未戴口罩(关于这一点,下文会有讨论)。 下面,我们将从模型结构、数据和TensorFlow.js部署三大方面介绍本项目。好了,废话不多说了,Let’s go~ 一. 模型介绍 在深度学习时代之前

用户密码到底要怎么加密存储?

℡╲_俬逩灬. 提交于 2020-02-19 12:03:27
作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱,导致黑客可以还原出原始的用户密码。 目前已经曝光的信息泄露事件至少上百起,其中包括多家一线互联网公司,泄露总数据超过10亿条。 要完全防止信息泄露是非常困难的事情,除了防止黑客外,还要防止内部人员泄密。但如果采用合适的算法去加密用户密码,即使信息泄露出去,黑客也无法还原出原始的密码(或者还原的代价非常大)。 也就是说我们可以将工作重点从防止泄露转换到防止黑客还原出数据。下面我们将分别介绍用户密码的加密方式以及主要的破解方法。 一、用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什么方式来保护用户的密码呢?以下几种方式是常见的密码保存方式: 1、直接明文保存 ,比如用户设置的密码是“123456”,直接将“123456”保存在数据库中,这种是最简单的保存方式,也是最不安全的方式。但实际上不少互联网公司,都可能采取的是这种方式。 2、使用对称加密算法来保存 ,比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情

入门——最短路(floyd, dijkstra)

冷暖自知 提交于 2020-02-19 09:16:22
今天讲图论基础和两种最短路算法。 老实说,我不觉的我能把最短路讲好,因为我主功不是图论,好久没有用了。本来只想找几篇博客放这里,但是发现现在的博客鱼龙混杂,感觉自己更应该讲好了。。。 首先要对图论有个大概的了解,尽管是刚入门,但是为了以后的学习还是要知道图论的基础名词的,我不是科班出身只能引用大佬的博客: https://blog.csdn.net/saltriver/article/details/54428685?utm_source=distribute.pc_relevant.none-task 。 了解了正统的图论以后,那么现在你只需要记住今天算法的应用范围就行:带有权的连通图,换句话说就是有很多点,这些点都有路能串起来并且这些路或者点是有数据的。我们今天讲的最短路算法就主要计算任意两点间的最短距离。最短路的算法有很多,常用的就有四个,分别是Floyd、dijkstra、bf 和spfa,在这里我们只学floyd和dijkstra,因为这两种算法的思想不仅能用在最短路上,在其他的时候也能用来偷分。另外两种算法选学,在处理特别复杂的图问题的时候,这两种算法因为更优的复杂度还是有很高的使用率的,不过学习的成本有点高,不适合初学。 零、存图 进行图论算法的第一步,就是把图存起来。存图的两种方式为邻接矩阵和邻接表。 邻接矩阵是建立一个二维数组,大小为所有点的数量+5

非线性最小二乘问题与Levenberg–Marquardt算法详解

烂漫一生 提交于 2020-02-19 04:14:04
线性最小二乘法我们应该非常熟悉了,例如对样本数据进行多项式拟合等。但实际工程应用中,我们所接触的很多问题都无法转化为线性方程组,也就无法使用线性最小二乘法进行优化了,那自然而然地我们就应该转而求助于非线性最小二乘法。一直以来,各路大神们提出了各种各样的优化算法,很多都是一脉相承,不断创新的,所以最好不要孤立地看待这些算法。目前来说,Levenberg–Marquardt 法可以说是求解非线性最小二乘问题的标准算法了,也就是应用十分广泛,例如运动参数估计、相机内部参数标定等等,其性能也是得到很多论文背书的。不过,一上来就扔出这么长的一串名字似乎让人觉得 LM 算法十分的复杂,但实际上,LM 算法也是从其祖辈一步一步发展而来的,从其身上,你可以看到最速下降法、牛顿法以及高斯-牛顿法的影子。因此,文章将会按照这么一个顺序来进行循序渐进的详细讲解,让大家能够更加容易并且透彻地理解 LM 算法背后的原理。 这篇文章主要是以下两篇英文文献的提取、总结和补充,如果有能力的可以仔细阅读一下,里面可以说写得很详细和明了了。 [1] H.B. Nielsen. Damping Parameter in Maquardt’s Method. http://www2.imm.dtu.dk/documents/ftp/tr99/tr05_99.pdf [2] K. Madsen, H.B. Nielsen,