***算法与编程艺术***
文章平均质量分 78
图灵的猫.
给行业以ai,而不是给ai以行业
展开
-
LeetCode经典算法精解-字符串编辑距离
字符串的编辑距离也被称为距Levenshtein距离(Levenshtein Distance),属于经典算法,常用方法使用递归,更好的方法是使用动态规划算法,以避免出现重叠子问题的反复计算,减少系统开销。《编程之美》一书中3.3节中计算两个字符串的相似度,归根到底也是要求两个字符串的距离,其中问题是这样提出的: 许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相...转载 2019-07-19 12:17:44 · 2211 阅读 · 0 评论 -
快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
因此,算法复杂度一样只是说明随着数据量的增加,算法时间代价增长的趋势相同,并不是执行的时间就一样,这里面有很多常量参数的差别,比如在公式里各个排序算法的前面都省略了一个c,这个c对于堆排序来说是100,可能对于快速排序来说就是10,但因为是常数级所以不影响大O。堆排序每次取一个最大值和堆底部的数据交换,重新筛选堆,把堆顶的X调整到位,有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来,可以说堆排序做了许多无用功。原创 2018-02-24 19:04:28 · 28102 阅读 · 5 评论 -
再谈哈希:Hash中的冲突消解机制以及拉链法
在之前的文章:我们学习了哈希表和哈希函数(散列)的定义,在进行更进一步的解释前我们先复习一下相关概念:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2018-03-16 22:24:31 · 1808 阅读 · 0 评论 -
有趣的算法(五):一文读懂二叉搜索树的插入、删除
我的机器学习教程「美团」算法工程师带你入门机器学习 以及「三分钟系列」数据结构与算法已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~...原创 2018-03-15 15:57:58 · 407 阅读 · 0 评论 -
3分钟tips:什么是哈希算法|散列函数|哈希函数?
我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~举个例子,比如这里有一万首歌...原创 2018-03-08 23:39:58 · 6037 阅读 · 0 评论 -
3分钟Tips:用大白话告诉你什么是低耦合|高内聚
耦合当然也可以这样简单的理解,我想懂电脑的应该都知道,CPU与主板之间的关系,CPU如果是特殊的CPU必须使用特殊的主板来支持,那么如果说这个CPU不唯一依赖唯一主板,那么就认为这个CPU与主板的关系是低耦合的关系。那么外界模块不关心支付系统模块的变化,只需要调用接口即可,如果具体的支付方式,比如支付宝的方式发生改变,在调用支付服务的模块中也不需要做任何的修改就可以正常的提供服务。低内聚的模块设计的坏处有:首先模块的功能不单一,模块的职责不明确,比较松散,更有甚者是完成不相关的功能。果细化到具体的实现呢?原创 2018-03-08 20:07:49 · 51563 阅读 · 10 评论 -
深度学习入门:一句话告诉你什么是神经网络(CNN,RNN,DNN)
假设图3中m-1=1是输入层,我们需要识别一幅彩色图像,这幅图像具有四个通道ARGB(透明度和红绿蓝,对应了四幅相同大小的图像),假设卷积核大小为100*100,共使用100个卷积核w1到w100(从直觉来看,每个卷积核应该学习到不同的结构特征)。不知题主是否发现,RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!原创 2018-02-19 20:16:14 · 60082 阅读 · 5 评论 -
图论(二):图的割点(cut vertex)与连通度(connectivity)
在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一个没有关节点的连通图称为重连通图(biconnected graph)。若在连通图上至少删去k 个顶点才能破坏图的连通性,则称此图的连通度为k。关节点和重连通图在实际中较多应用。显然,一个表示通信网络的图的连通度越高,其系统越可靠,无论是哪一个站点出现故障或遭到外界破坏,都不影响系统的正常工作;原创 2018-02-18 00:25:28 · 7530 阅读 · 0 评论 -
有趣的算法(六):3分钟看懂插入排序(C语言实现)
作为简单排序中最重要的排序方法,插入排序和它的变型在几乎所有混合排序算法(如快速排序,归并排序,TIM排序)中起到了重要作用。今天我们就来看看插入排序的思想及实现。原创 2018-03-17 16:10:27 · 750 阅读 · 0 评论 -
有趣的算法(七):3分钟看懂希尔排序(C语言实现)
在上一次的算法讨论中,我们一起学习了。它的原理就是把前i个长度的序列变成有序序列,然后循环迭代,直至整个序列都变为有序的。但是说来说去它还是一个时间复杂度为(n^2)的算法,难道就不能再进一步把时间复杂度降低一阶么?确实,以上几种算法相对于之前的O(n^2)级别的算法真的是弱,效率可能还会差上千万倍,但是我们不妨翻看一下历史,你就会感觉每一种算法的出现都是很可贵的。原创 2018-03-17 18:11:35 · 10182 阅读 · 3 评论 -
Python必知必会:Classethod与Staticmethod方法
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法. 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难.而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法。从它们的使用上来看,原创 2018-03-18 16:18:21 · 1200 阅读 · 2 评论 -
深入浅出Python的抽象基类
不同于Java或是C++,python中并没有直接提供ABC,Abstract Base Class(抽象基类)与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。可以通过abc将基类声明为抽象类的方式,然后注册具体类作为这个基类的实现。抽象基本类的几大特点:1:要定义但是并不完整的实现所有方法2:基本的意思是作为父类3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白用抽象基本类的地方:1:用作父类。原创 2018-04-05 20:11:23 · 5760 阅读 · 4 评论 -
3分钟tips:Python中的range与xrange
另外,xange也和普通的生成器略有不同,对于同一个xrange对象,对它进行多次迭代,每次都会从头开始,这里我自己也试了一下。这里就是很明显的类型上的不同了,range直接生成一个列表,xrange生成的是一个xrange对象。在其它场合,我觉得xrange完全可以取代range,这样你可以无需担心列表长度的问题。可以看到元素被生成出来之后就从生成器中剔除了,但是xrange有所不同。另外一个很明显的区别在与xrange不支持列表切片。迭代两次,每次都是从第一个元素开始....原创 2018-04-03 21:53:01 · 609 阅读 · 1 评论 -
Python在定义类方法时self的作用是什么?是否可以不写
今天在写代码的时候发现某个类的方法:def xx() 中没有加上self,运行后提示的错误很有意思,大意是提供了一个参数但却定义了0个参数。原创 2018-03-31 21:31:54 · 21311 阅读 · 1 评论 -
浅谈最短路径的几个方法(Dijkstra,Bellman-Ford,SPFA,Floyd算法)
我之前有文章详细介绍了这四种方法并且给出了C代码实现,今天用四句话总结一下几个特点。其实是Bellman-ford+队列优化,缺点是时间复杂度过高,高达 O(VE)动态规划的方法,经典的多源最短路径算法,复杂度O(N^3),简单粗暴有效。允许负权边的单源最短路径算法,DJ算法的适应版,可以用来检测负权回路。最经典的单源最短路径算法。本质是BFS+贪心,应用最广。2. Bellman-Ford算法。1. Dijkstra算法。4. Floyd算法。原创 2018-04-07 21:56:51 · 961 阅读 · 0 评论 -
有趣的算法(八):3分钟看懂选择排序(C语言实现)
我的机器学习教程「美团」算法工程师带你入门机器学习 以及「三分钟系列」数据结构与算法已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~...原创 2018-03-18 18:03:42 · 368 阅读 · 0 评论 -
简单易懂——Dijkstra算法讲解
赋权有向图或者无向图。原创 2018-02-18 00:22:46 · 109827 阅读 · 28 评论 -
图论(三):哈密顿图与哈密顿回路
(2)设G是n(n>=3)阶无向简单图,若对于G中的每一对不相邻的顶点u,v,均有d(u)+d(v)>=n-1则G中存在哈密顿通路。(3)在n(n>=2)阶有向图D=中,如果略去所有有向边的方向,所得无向图中含生成子图Kn,则D中存在哈密顿通路。(2)若一个无向图G满足上述(2)中的条件,一个有向图D满足上述(3)的推论的条件,则G、D都是哈密顿图。由推论知,对于完全图Kn,当n>=3时,是哈密顿图,完全二部图Kr,s当r==s>=2时是哈密顿图。设G=为一图(无向图或有向图).G中。原创 2018-02-18 00:28:49 · 17008 阅读 · 0 评论 -
动态规划C语言实现之最长公共子序列(LCS)
动态规划中,我曾对于01背包和硬币问题有过一些理解,今天参考了博客上其他同学的经验,完成了最长公共子序列LCS的代码实现。上面都是摘自《算法导论》,如果熟悉这两个内容,那么实现起来就方便许多。2.状态转移表(数组用来存放位置和长度)原创 2018-02-06 23:09:28 · 16019 阅读 · 2 评论 -
数据结构与算法(二):线性表、栈、树(二叉树,AVL树)、图
树型结构是一类非常重要的非线性数据结构,其中以树和二叉树最为常用。在介绍二叉树之前,我们先简单了解一下树的相关内容。树树 是由n(n>=1)个有限节点组成一个具有层次关系的集合。它具有以下特点:每个节点有零个或多个子节点;没有父节点的节点称为 根 节点;每一个非根节点有且只有一个 父节点 ;除了根节点外,每个子节点可以分为多个不相交的子树。树的结构二叉树基本概念 定义二叉树是每个节点最多有两棵子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。相关原创 2018-01-17 13:56:28 · 1058 阅读 · 0 评论 -
关于信息熵的简单理解
我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~信息是我们一直在谈论的东西,但...原创 2018-01-16 20:36:35 · 7989 阅读 · 0 评论 -
有趣的算法(一):如何让有情人终成眷属
看过《非诚勿扰》的同学一定还记得节目中的相亲模式,当男嘉宾入场后会首先选择最喜欢的心动女生,然后在几轮“面试”后由最后亮灯的女生,也就是心仪男嘉宾的女生与男嘉宾一开始选择的心动女生做比较。有趣的是,有时候,留灯的女生即便是男嘉宾不喜欢的类型,很多时候也会被牵手,而也有女嘉宾在台上站了很多期节目,被优质的人翻号,却没有被所带走,到最后反而被一些很普通的男生牵手成功。现在,考虑将上述过程的选择次数增加至多次,并允许与女嘉宾人数(假设为N)相同的男嘉宾同时上台。原创 2018-01-19 13:15:12 · 1731 阅读 · 0 评论 -
判断一个单链表是否有环及环的链接点
3中求出了连接点的位置,就可以求出头结点到连接点的长度。在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为。,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离。第一次相遇时,fast走的长度 2S =原创 2018-01-12 23:03:36 · 637 阅读 · 0 评论 -
C语言:判断回文字符串的两种简单方法
另一种是数字输入,因为追求简便性所以此方法只能判断回文数,不能判断回文字符串。要想都判断也很简单,将变量类型调整即可实现。之前写过逆排序的数组实现,对于经典的回文问题却还没有深入研究过。今天抽空看了下,总结了两种比较常用的回文法。一种是字符串(当然也可以叫数组法),此方法可以用来判断字符串输入以及INT类型的输入。原创 2018-01-12 20:34:33 · 62452 阅读 · 5 评论 -
优化算法中的鞍点与梯度下降
摘要:本文将讨论寻找凸路径( convex path )时可能会遇到的不同类型的临界点( critical points),特别是基于梯度下降的简单启发式学习方法,在很多情形下会使你在多项式时间内陷入局部最小值( local minimum ) 。凸函数比较简单——它们通常只有一个局部最小值。非凸函数则更加复杂。在这篇文章中,我们将讨论不同类型的临界点( critical points)翻译 2017-12-25 19:44:10 · 12116 阅读 · 1 评论 -
(PCA与信息)方差和熵
下图是某股票数据的熵和对数标准差关系[2]:可以看出熵和ln(σ)ln(σ)有很强的正相关的关系。对于常见的分布可以很容易推导出他们的熵和方差。[3]原创 2017-12-24 21:50:09 · 2958 阅读 · 0 评论 -
机器学习的数学(三)范数的简单介绍
我的机器学习教程「美团」算法工程师带你入门机器学习 以及「三分钟系列」数据结构与算法已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~...原创 2018-01-25 13:08:44 · 1245 阅读 · 0 评论 -
Leetcode刷题修炼手册
我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~“跟着...原创 2018-01-25 13:53:13 · 51575 阅读 · 5 评论 -
有趣的算法(四)最通俗易懂的KMP算法解析
Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。原创 2018-02-26 21:01:50 · 1949 阅读 · 0 评论 -
用通俗易懂的方式告诉你什么是EM算法
EM(Expectation Mmaximization) 是一种迭代算法, 用于含隐变量(Latent Variable) 的概率模型参数的极大似然估计, 或极大后验概率估计 EM算法由两步组成, 求期望的E步,和求极大的M步。EM算法可以看成是特殊情况下计算极大似然的一种算法。现实的数据经常有一些比较奇怪的问题,比如缺失数据、含有隐变量等问题。当这些问题出现的时候,计算极大似然函数通常是比较困难的,而EM算法可以解决这个问题。EM算法已经有很多应用,比如最经典的Hidden Markov模型等。原创 2018-02-03 19:39:04 · 13078 阅读 · 1 评论 -
动态规划入门之最长公共子序列
如上图,给定的字符序列: {a,b,c,d,e,f,g,h},它的子序列示例: {a,c,e,f} 即元素b,d,g,h被去掉后,保持原有的元素序列所得到的结果就是子序列。S1的元素3 与 S2的元素5 不等,c[2,2] =max(c[1,2],c[2,1]),图中c[1,2] 和 c[2,1] 背景色为浅黄色。给定序列s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且该子序列的长度最长,即是LCS。原创 2018-02-05 22:09:17 · 1347 阅读 · 1 评论 -
时间复杂度与NP/NP难/NP完全问题的最简单理解法
我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~什么是...转载 2018-01-19 17:44:27 · 8129 阅读 · 7 评论 -
深入浅出BP神经网络(反向传播算法)
反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是:(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传转载 2018-01-10 20:01:13 · 2130 阅读 · 1 评论 -
深入浅出带你了解Python2与Python3的异同
next()(.next())是一种常用的函数(方法),这是另一种语法更改(或者说在执行时更改)值得一提:在Python2.7.5中你可以使用next()函数和.next()方法,在Python3只保留了next()函数(调用.next()方法会引发AttributeError异常)。因为它们实现了相同的方式,就会有相同的速度。在Python3中,range()实现了类似xrange()的功能,因此专门的xrange()函数不存在了(在Python3中使用xrange()会抛出一个NameError异常。原创 2018-01-09 21:35:08 · 847 阅读 · 0 评论 -
机器学习中的VC维数和分类
VC维数学习VC维要先知道的概念有:增长函数(growth function)、对分(dichotomy)、打散(shattering)和断点(break point)1.增长函数增长函数表示假设空间H对m个示例所能赋予标记的最大可能结果数。比如说现在数据集有两个数据点,考虑一种二分类的情况,可以将其分类成A或者B,则可能的值有:AA、AB、BA和BB,原创 2017-12-22 23:23:20 · 6764 阅读 · 1 评论