精华内容
下载资源
问答
  • 算法的五个重要特性

    万次阅读 2016-09-07 10:27:37
    输入(Input) 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; ...算法中的每一条指令必须有确切的含义,能产生多义性: 可行性(Effectiveness)

    输入(Input)

    一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;


    输出(Output)

    一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;


    确定性(Definiteness)

    算法中的每一条指令必须有确切的含义,不能产生多义性:


    可行性(Effectiveness)

    算法中的每一条指令必须是切实可执行的,即原则上可以通过已经实现的基本运算执行有限次来实现(也称之为有效性);


    有穷性(Finiteness)

    算法必须能在有限步后终止;


    展开全文
  • 扩展AC算法的正则特性

    千次阅读 2010-01-26 18:11:00
    可以在AC算法上扩展的正则特性包括:“.*”,“.”,“^”,“$”等。AC算法的查找流程: typedef struct _acsm_pattern { unsigned char *patstr; //pattern 字符串 unsigned int iid; //pattern id号} ACSM_...

    可以在AC算法上扩展的正则特性包括:“.*”,“.”,“^”,“$”等。

    AC算法的查找流程:

     

     

    AC算法的查找流程:

             再经过一系列有些绕的过程之后(不是扩展的重点,跳过),整个ACSM_STRUCT结构已经建立完毕。开始查找。查找伪代码:

       

     

    总结一下:

    1、  从状态0开始进行状态跳转。

    2、  状态跳转表在search操作之前已经建立好了,在状态N下,输入字符c,跳转到状态M,按照状态跳转表来就好了。

    3、  状态机到达哪些状态时发生匹配,匹配了哪些pattern,这也是之前就算出来了的。

    4、  整个search操作,就是把searchbuf作为输入,在预先设计好的状态机上进行跳转,每到一个新的状态,就看一下在这个状态下有没有发生匹配,如果有就打印,如果没有就继续,直到searchbuf末尾。

     

    对“.*”的扩展:

             基本思路是把包含了.*等正则特性正则表达式(ab.*cd)分成多个固定串(abcd),当固定串按照顺序或者位置依次发生匹配时,则认为整个正则表达式发生匹配了。这里的abcd在查找过程中,是按照两个独立的字符串进行查找的,但是和完全独立的两个字符串不同,abcd又同属于一个正则表达式ab.*cd,应该具备某种特定的联系。

            

             这里使用patterniid来表示这种联系。首先abcd各有一个对应的ACSM_PATTERN结构,分别进行匹配。abiid0x21??cdiid0x22??,这里要求iid的低16bit abcd相同,而又和其他的pattern区分开。而iid16~23bit表示abcd在正则表达式中出现的顺序(ab1cd2),iid24~31bit0x2)表示正则表达式被拆分成了几个固定串。

            

    在匹配过程中要记录之前发生匹配的patterniid,如果低16bit相同并且高16bit不为0,则要求pattern iid16~23bit要严格递增,否则就是一个无效的匹配。当到达buf末尾时,比较pattern iid16~23bit24~31bit,只有两者相等的时候才认为整个正则表达式(ab.*cd)发生匹配了。

     

    这里还有个问题,比如正则表达式abc.*bcd,而buf=”abcd”,使用上述方法你会惊奇的发现匹配发生了,而实际上没有发生匹配,原因是”abcd”可以分别匹配”abc””bcd”,并且先匹配”abc”,后匹配”bcd”,但是匹配的位置发生了重叠。所以还需要引入一个数组,记录匹配发生的结束位置。如abc发生匹配时,记录匹配发生的结束位置是3,而bcd发生匹配时,发现bcd发生匹配的起始位置是2,发生了重叠,也认为这是一个无效匹配。

     

    此方法的局限性显而易见,pattern的总数不能超过2^16,每一个正则表达式被拆分之后的子pattern数不能超过2^8

     

    对“.”的扩展:

             和“.*”的扩展方法类似,如正则表达式(ab…cd),被拆分成固定串abcd,但是需要在ACSM_PATTERN中增加成员变量,记录各个子pattern之间的相对位置。而在search时,只有严格按照相对位置发生的匹配才被认为是有效的匹配

     

    对“^”和“$”的匹配:

             其实也比较简单,就是在search时,判断一下匹配发生起始位置和结束位置是不是buf的开头和末尾就好了

     

    上述扩展不会影响search的效率,还是On)级的。

     

    对“+”,“?”,“*”,“{n,m}”的扩展:

             变成Onlogn)的了,还不如找个pcreawk的源码看下了。

    展开全文
  • 算法总结-1算法入门

    千次阅读 多人点赞 2019-09-06 18:54:00
    1.0 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰...正式的说,算法是任何定义明确的计算过程,比如买菜大妈的买菜策略,骗子的坑人步骤,再比如高考中数学的立体几何,有的...

    1.0 前言

    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

    简单地说,算法其实是解决问题的方法,他不是属于计算机方面的一个专属名词。不正式的说,算法是任何定义明确的计算过程,比如买菜大妈的买菜策略,骗子的坑人步骤,再比如高考中数学的立体几何,有的人写二十行,有的人写四十行,他们都写上了属于自己的算法,但是效率不同。

    复杂一点的,再比如:一个环卫工人要清扫五个地点:

    她也有不止一种执行完这个任务的方法:

     

    那到底哪种方法走的路比较少?这就是我们之后要学习的最短路算法。

     

    下面举一个例子来了解算法:

    我们从小都见过的小学奥数题:有一口井七米深,一只青蛙从井底爬上来,白天爬了三米,晚上掉下两米,这样它要爬几天才能上来?

    我们最笨的解题步骤

    1. 让青蛙爬三米
    2. 判断是否爬上去了
    3. 让青蛙掉下两米
    4. 重复上述过程并记录天数

    (而不是计算得出一天爬一米,得出七天爬上来)

    或者另一种算法:

    1. 最后一天直接爬上去:7-3=4米
    2. 其余天,一天一米:路程/速度=4天
    3. 4+1=5天

    由此可见,我们首先要保证算法的正确性,其次要保证算法的效率,我们比较一下上述算法:

    1. 计算得出一天爬一米,得出七天爬上来,这种算法是错误的
    2. 模拟法,让青蛙模拟整个爬井的过程,我们看看有几次运算:

    0+3=3,3<7

    3-2=1

    次数:0+1=1

                 

    1+3=4,4<7

    4-2=2

    次数:1+1=2

     

    0+3=3,5<7

    5-2=3

    次数:2+1=3

     

    0+3=3,6<7

    6-2=4

    次数:3+1=4

     

    4+3=3,7=7,爬出来了

    次数:4+1=5

    一共进行了19次运算

    1. 公式法:7-3=4,3-2=1,4/1=4

    进行了3次运算

     

    从这个对比中应该能感受到算法不同,效率差距是很大的,然而感受其实的还不够。

    试想:

    假如这口井是100米?1000米?10000米?随着深度的增加,模拟法的计算次数也再增加,和深度成正比。

    而再看公式法,其实和深度并没有什么关系,不管深度是多少,公式法永远只用计算3次即可。

    这种计算次数和条件的大小,数量等因素没有关系的算法,视为非常优秀的一种算法。

     

           那我们计算机的算法到底是什么?我们提到,算法不是计算机领域才拥有的概念,它可以用任何方式来描述,我们之前接触到的基本都是用文字来表达,比如我在上文中列出的解题步骤。而我们要干的事,或者说计算机的算法要干的事,就是用代码来描述计算机上的处理过程。我们用一行行的语句来描述一个个解决问题的方法,这就是编程。

           计算机所有算法都是通过基本语句一点点描述出来的,比如上文的模拟算法:

    1. 让青蛙爬三米
    2. 判断是否爬上去了
    3. 让青蛙掉下两米
    4. 重复上述过程并记录天数

    其中涉及到编程的很多基本语句:加减法、条件判断语句、循环语句等,编程语言也有很多,但是只是一个工具而已,就和汉语英语一样,并且单词数量比这两种语言少很多。所以只要脑海中的思路足够清晰,我们用一种(编程)语言把它描述出来即可,而不是我们之前去用汉语描述。

     

    事实上,计算机的算法解决的问题可能是更加实际的问题,关系着我们每个人的生活,比如地图app如百度地图,高德地图,是如何帮你规划的路线的?再比如双十一如此疯狂的购物,各大购物网站是如何保证不会崩溃的?再比如到现在还没解决的问题:微博到现在为止,志玲姐姐结个婚,服务器都会崩。

    如何衡量一个算法到底优不优秀?我们下篇来讲。

     

     

    1.1何为算法

    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

    如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

    下面为算法的五个特性:

     

    有穷性(Finiteness)

    算法的有穷性是指算法必须能在执行有限个步骤之后终止;

     

    确切性(Definiteness)

    算法的每一步骤必须有确切的定义;

     

    输入项(Input)

    一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;

     

    输出项(Output)

    一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

     

    可行性(Effectiveness)

    算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

     

    1.2衡量算法的指标

    一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

    用几句话简单说明一下时间复杂度。

    时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。

    1)不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;

    2)数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;

    3)而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。

    4)还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。

    注意:不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。

    因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。

     

    而空间复杂度是相似的,只是他的单位不是时间,而是空间,可以认为是内存。

     

    2.1计算机

    说完算法,我们来谈谈计算机吧。

    计算机的优势非常明显:速度、记忆、精确,但是它也不是万能的。

    就算计算机速度快,也不可以给他无限大的工作量,就算计算速度再快的计算机,在O(N^N)等复杂度的算法面前,也是无能为力,具体使用那种算法是人说了算,计算机无条件执行,这就对编程的人提出了要求。

           计算机的容量是非常大的,但是也不能存无限多的东西,同样的问题,解决方法不同,花费的空间差异也是巨大的。

           计算机是精确的,但是解决问题的方法和人类不一样,比如计算机很难回答某件物品“美不美”,“值不值”,再比如很多算法对人类是很直观的,可以用语言描述,但是转化成机器语言会花很多时间。

           总而言之,请善待你的计算机啦。

     

    展开全文
  • 创新一直是一个令人纠结的话题,研究生毕业设计多数需要算法的创新,而博士生毕业... 通常,我们使用一个算法,这里举个简单的粒子,PSO粒子群优化算法,我们通过仿真,会得到该算法的收敛速度,仿真精度等一些参数...

     

    创新一直是一个令人纠结的话题,研究生毕业设计多数需要算法的创新,而博士生毕业更需要大量的创新才行。这里,我们就团队这几年来的工作经验,谈谈如何进行合理的算法创新。

    一、创新角度

        通常,我们使用一个算法,这里举个简单的粒子,PSO粒子群优化算法,我们通过仿真,会得到该算法的收敛速度,仿真精度等一些参数指标。如果我们需要对该算法进行创新,一般就需要从原算法的性能指标角度考虑,比如收敛速度和精度的提高,对于一些低要求,可以在保证收敛速度不变的情况下,提高精度,或者在精度不变的情况下,加快收敛速度,如果要求较高,则同时考虑如何提高收敛速度和精度。一般情况下,针对这种情况,我们需要考虑别的类似算法,而这些算法必须具备快速收敛和高精度中的某些特性,这样我们就可以将多种算法的优势进行整合,从而实现算法的创新并提高原算法的性能。

        对于低程度的创新,一般都是这么个思路。

    二、创新依据

        什么是创新依据?所谓创新依据,就是我们使用的创新算法,所考虑的角度是有理论依据的,我们不能凭空修改原来的算法,这样即使获得了布局的更优解,但也无法证明全局的更优。因此,正如一所说,我们需要选择某些性能比原算法更好的其他现成算法,进行算法的整合。

    三、创新的验证

       对于改进后的算法,我们需要使用大量的测试样本进行对比分析,验证算法的各个性能指标是否较原来的算法有所提高。

    四、完全的创新

    <
    展开全文
  • 此篇博文将详细探讨垃圾收集算法和七大垃圾收集器实现,大致知识点如下: 4种垃圾收集算法概念的学习 各个算法之间的优缺点、原理运作过程 Java堆内存结构 7种垃圾收集器特征的学习 各个垃圾收集器的原理、运作过程...
  • 谷歌页面排名算法 - 未完

    万次阅读 2021-08-26 11:39:20
    一、PageRank算法原理 一个合格的收索引擎,它所具备的最基础的功能便是网页搜索,根据用户给出的关键字查询出最匹配,最能满足用户需求的页面。那么搜索引擎到底应该如何排序才好呢? 这在谷歌引领互联网搜索引擎...
  • 什么是AES对称加密算法

    万次阅读 2018-03-19 22:10:59
    小明:我太明白,这个对称加密是什么鬼?它跟MD5,SHA这样的哈希摘要算法有什么不同? 老师:对称加密不同于信息摘要,是真正意义上的加密算法。我们来看看下面这个例子: 假设有一个发送方在向接收方发送消息。...
  • 什么是哈希算法

    千次阅读 2018-05-07 18:27:19
    什么是hash函数? 常见的hash算法 hashlib的用法 hash算法的用途 ...Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却能通过这个Hash值重...
  • 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    万次阅读 多人点赞 2012-11-20 16:31:35
    从K近邻算法、距离度量谈到KD树、SIFT+BBF算法前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1、KD树;2、神经网络;3、编程艺术第28章。你看到,blog内的文章与你于别处所见的任何都不同。于是...
  • PID算法

    千次阅读 多人点赞 2017-12-24 16:10:55
    PID算法
  • LBG算法、Lloyd算法和K均值算法

    万次阅读 2017-07-25 02:07:56
    关于LBG算法,Lloyd算法和K均值算法的简介
  • 实际上是ZEN的算法具有蒙特卡罗特性,或者说它的算法属于一种蒙特卡罗算法。 那么“蒙特卡罗”是一种什么特性呢?我们知道,既然是随机算法,在采样全时,通常能保证找到最优解,只能说是尽量找。那么根据怎么...
  • 粒子群算法和遗传算法的比较

    万次阅读 多人点赞 2018-11-22 10:31:51
    粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解。   PSO和GA的相同点:   (1)都属于仿生算法。PSO主要模拟鸟类...
  • 实际上是ZEN的算法具有蒙特卡罗特性,或者说它的算法属于一种蒙特卡罗算法。 那么“蒙特卡罗”是一种什么特性呢?我们知道,既然是随机算法,在采样全时,通常能保证找到最优解,只能说是尽量找。那么根据怎么...
  • 蒙特卡罗算法 与 拉斯维加斯算法

    千次阅读 2015-01-19 22:46:01
    实际上是ZEN的算法具有蒙特卡罗特性,或者说它的算法属于一种蒙特卡罗算法。 那么“蒙特卡罗”是一种什么特性呢?我们知道,既然是随机算法,在采样全时,通常能保证找到最优解,只能说是尽量找。那么根据...
  • K近邻算法:机器学习萌新必学算法

    千次阅读 多人点赞 2020-10-30 11:16:49
    摘要:K近邻(k-NearestNeighbor,K-NN)算法是一个有监督...● 对于各位开发者来说,很多擅长数学,而KNN算法几乎用到数学专业知识 ● 效果好 ○ 虽然算法简单,但效果出奇的好 ○ 缺点也是存在的,后面会进行
  • 蒙特卡罗算法是什么?

    千次阅读 2017-04-18 17:45:13
    作者:孙天齐 ... 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载...蒙特卡罗算法并不是一种算法的名称,而是对一类随机算法特性的概括。媒体说“蒙特卡罗算法打败武宫正树”,这个说法就好比
  • 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. ...
  • 大部分复杂模型的算法设计都是算法工程师在做,而我们 > 分析很多的数据 > 分析具体的业务 > 应用常见的算法 > 特征工程、调参数、优化 我们应该怎么做 1.学会分析问题,使用机器学习算法的目的,想要算法...
  • 散列算法与加密算法

    千次阅读 2017-04-20 09:15:50
    那么,首先要知道,什么是散列算法呢?...所有散列函数都有如下一个基本特性:如果两个散列值是相同的(根据同一函数),那么这两个散列值的原始输入也是相同的。 加 密算法通常分为对称性加密算法
  • ZUC算法

    千次阅读 多人点赞 2020-11-10 16:42:31
    ZUC算法结构2.1 LFSR2.1.1 初始化模式2.1.2 工作模式2.2 BR2.3 非线性F函数3 ZUC算法流程3.1 密钥装入3.2 算法运行3.2.1 初始化阶段3.2.2 工作模式4. ZUC算法安全性总结 前言 ZUC算法是国密算法的一种,它是一种...
  • 夜深人静写算法(八)- 朴素贝叶斯分类

    万次阅读 多人点赞 2018-01-04 21:21:22
    朴素贝叶斯分类算法:基于概率的经典分类算法
  • UCB算法

    万次阅读 2017-07-09 10:01:47
    前言: 来万物花开这家创业公司实习,也真是一波三折。...这样的日子感觉没法持续下去,想找导师谈谈之前,就从实验室同学那儿知道了老师对我最近的出勤率太低很高兴。想着还是找找导师谈一谈实习的问题吧,然后
  • 国密算法和国际算法的区别

    万次阅读 2018-12-11 15:17:50
    国密算法 国密即国家密码局认定的国产密码算法,即商用密码。 国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中: SM2为国家...
  • 蒙特卡罗算法和拉斯维加斯算法

    千次阅读 2017-02-20 11:27:06
    首先,蒙特卡洛算法和拉斯维加斯算法属于随机算法。蒙特卡罗算法并不是一种算法的名称,而是对一类随机算法特性的概括。 蒙特卡罗算法:采样越多,越近似最优解; 拉斯维加斯算法:采样越多,越有机会找到最...
  • 智能算法|以动物命名的算法

    千次阅读 2020-02-10 20:18:11
    有约来过夜半,闲敲棋子落灯花。 鱼群算法?鸟群算法?蝙蝠算法?蚁群算法?病毒算法?。。。what?这些是什么沙雕算法? 别看这些算法名字挺接地气的,实际上确实很接地气。。。 以动物命名的算法可远不止这些...
  • 目录简介一、监督学习1、决策树(Decision Tree,DT)2、朴素贝叶斯分类器(Naive Bayesian Model,NBM)3、最小二乘法(Least squares)4、逻辑回归(Logistic Regression)5、支持向量机(SVM)6、K最近邻算法...
  • 国密算法概述

    万次阅读 多人点赞 2017-12-11 16:07:03
    其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中: SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括: SM1,对称加密算法,加密...
  • 提起人工智能优化算法,你可能首先想到的是遗传... 微分进化算法和遗传算法一样,同属于进化算法,但是微分进化(DE) 是比较新的基于群体的随机优化方法。它具有简单、快速、鲁棒性好等特点。不同于其它进化算法,它的变

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 162,614
精华内容 65,045
热门标签
关键字:

不属于算法特性的是