
算法
文章平均质量分 88
coding 迪斯尼
我叫陈屹,网名 Coding 迪斯尼,是软件工程师,曾在微软、联想和RealNetworks工作,并使用过多种编程语言和技术。我喜欢费曼的教学方法,并相信最好的学习方式是通过教学。因此,我在这个平台发布课程,同时在过程中提升自己。我拥有数学学位,并自学了计算机科学的相关概念。我也相信,一名优秀的软件工程师应该拥有全面的知识,因此我会尝试创建涵盖多种主题的课程。
我目前出了四本书:
《python 程序员面试宝典》
《算法 python 语言实现》
《神经网络与深度学习实战》
《Tensorflow2.x 深度学习从入门到实战》
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
python高级算法与数据结构:使用treap实现双索引2
上一节我们看到treap结构能对两组数据进行索引,其中一组数据能实现完全排序,另一组数据能实现部分排序,对后者而言就是,我们能快速获取其最大值或最小值。当treap结构出现问题是,我们通过右旋转或是左旋转来进行调整。有个难点在于,往treap中插入一个元素时,需要保证不破坏对原来两种数据的索引效用。因此插入元素时要执行两个步骤,首先根据元素的第一组数据(在上节例子中就是字符串)以二叉树的方式进行插入,完成后,节点的第二部分数据可能会违背堆的性质,于是我们就需要两种旋转操作来进行调整,具体例子如下:如上原创 2021-09-29 17:14:19 · 420 阅读 · 0 评论 -
面试算法: 隐藏在《编程珠玑》中二十年的bug及二分查找法的实现
我们看看隐藏在《编程珠玑》有关二分查找法代码实现中隐藏了二十年的bug,并探讨与二分查找相关的面试算法题。原创 2017-09-12 17:02:04 · 2628 阅读 · 1 评论 -
面试算法:波浪型数组的快速排序法
波浪型数组是具备这样特性的数组,它的元素先是递增,到达某个点后开始低贱,接着达到某个点时又递增,接着右递减。我们看看如何依赖堆排序对波浪形数组进行快速有效的排序。原创 2017-08-04 11:00:22 · 1678 阅读 · 0 评论 -
面试算法:如何利用堆排序实现系统的Timer机制
本文讲解了如何利用堆排序实现系统Timer机制原创 2017-07-21 15:55:18 · 810 阅读 · 0 评论 -
微软亚洲工程院面试题:寻找两个二叉树节点的最近祖先
给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针原创 2017-06-27 12:01:21 · 759 阅读 · 0 评论 -
算法面试题:逆时针打印二叉树外围边缘
本文研究了二叉树外部边缘的逆时针遍历算法原创 2017-06-17 17:34:12 · 2064 阅读 · 1 评论 -
二叉树面试算法:空间复杂度为 O(1)的Morris遍历法
本节要讲的Morris遍历法,能以O(1)的空间复杂度实现二叉树的中序遍历原创 2017-05-22 11:56:11 · 3142 阅读 · 0 评论 -
文章标题
如果你喜欢编译原理,请参看视频 用java开发C语言编译器如果你喜欢面试算法,请参看视频 如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接: 机器学习:神经网络导论如果你喜欢操作系统内核,请参看视频 Linux kernel Hacker, 从零构建自己的内核对二叉树节点的遍历一般来说有中序,后序,和前序三种遍历方法,如果二叉树的高用h来表示,那三种遍历原创 2017-05-27 15:46:15 · 378 阅读 · 0 评论 -
算法面试题:使用两个堆栈实现一个队列
队列的插入和删除遵循先入先出的原则,而堆栈元素的插入和删除遵循后进先出的原则。在很多应用场景下,我们需要使用堆栈来模拟队列,或者是使用队列来模拟堆栈。在数学上,已经能够严格证明,我们是不能使用含有n个元素的堆栈来模拟含有n个元素的队列的,这个证明非常复杂,详细证明可以参看论文: The Power of the queue.用一个堆栈来模拟一个队列是不可能的,但是用两个堆栈来模拟一个队列确是可能的。原创 2017-04-16 11:20:02 · 1160 阅读 · 1 评论 -
面试算法:用队列计算滑动窗口内的最大网络流量
在网络流量的控制过程中,有时候需要找到从给定的某个时间点开始,往前倒退若干个时段内的最大网络流量m(t, w). 其中 t 是给定的某个时间节点,w就是滑动窗口大小,于是m表示的就是在时间段[t - w, t] 之间的最大网络流量。原创 2017-04-04 15:48:38 · 877 阅读 · 0 评论 -
面试算法:堆栈元素的在线排序
更详细的讲解和代码调试演示过程,请参看视频 如何进入google,算法面试技能全面提升指南给定一个存有整形数的堆栈,你能使用的操作有,peek 获得堆栈顶部元素的值但不把元素弹出堆栈,pop 把堆栈顶部的元素出栈,push 压入一个堆栈,empty 判断堆栈是否为空,要求你只能使用这几种操作,同时在不分配新内存的情况下,将堆栈中的元素从大到小排列,假定堆栈中,元素由栈底到栈顶如下: stack:原创 2017-03-25 07:15:50 · 1571 阅读 · 1 评论 -
面试算法:在整形数组中构建元素之和能整除数组长度的子集
假设A是一个整数数组,长度为n,数组中的元素可能是重复的。设计一个算法,找到一系列下标的集合I = {i(0), i(1), i(2)….i(n)}. 使得(A[i(0)] + A[i(1)] + … A[i(n)] ) mod n = 0.请给出求得集合I的算法原创 2017-02-16 10:51:18 · 728 阅读 · 0 评论 -
面试算法:计算堆栈当前元素的最大值
堆栈的常用操作有, pop 弹出堆栈顶部的元素;push 向堆栈压入一个元素;peek 获得堆栈顶部的元素值,但不弹出堆栈。现在要去你增加一个操作max, 它的作用是返回堆栈当前所有元素中值最大的那个元素原创 2017-02-24 10:11:14 · 2371 阅读 · 0 评论 -
面试算法:利用堆栈计算逆向波兰表达式
给定一个四则运算表达式的字符串,如果该表达式满足逆向波兰表达式,那么该字符串要满足以下条件:1: 该表达式含有一个数字字符或一串数字字符。2:它拥有给定格式,如”A, B, 。“,其中A,B是逆向波兰表达式,句号。表示的是四种运算符"+,-,*,/"其中之一。例如字符串“3,4,*,1,2,+,+”就满足逆向波兰表达式,该表达式的值为:3 * 4 + (1+2) = 15.原创 2017-02-15 11:11:32 · 1249 阅读 · 0 评论 -
面试算法:双指针单向链表的自我复制
一种链表特点是,除了next指向下一个节点外,它还多了一个指针jump,这个指针指向队列中的某一个节点,这个节点可以是当前节点自己,也可以是队列中的其他节点。例如上图,节点0的jump指针指向了最后一个节点,而节点1的jump指针指向了它自己。这种链表有一个专门的名称,叫Posting List.原创 2017-01-21 10:28:33 · 1221 阅读 · 0 评论 -
算法面试:单向链表节点的奇偶排序。
给定一个单项链表,要求实现一个算法,把链表分成两部分,前一部分全是下标为偶数的节点,后一部分全是下标为奇数的节点。不能分配新的内存空间,在操作队列时,不可更改节点内容,只能更改节点的next指针。原创 2017-01-14 11:17:35 · 3383 阅读 · 1 评论 -
算法面试之道:在O(1)的时间内删除单链接链表的指定节点
对于一个单项链接的链表,给定其中某个任意节点,要求在O(1)的时间复杂度内删除该节点。表面上看起来,似乎不可能做到,因为如果要求时间复杂度是O(1)的话,那意味着,算法实现中,不得包含有任何循环或是对链表的整体遍历。但问题在于,要删除某个指定节点,我们需要通过遍历,找到该节点的前节点,然后修改前节点的next指针,这样才能正常的删除当前节点。但如果给定的节点不是链表的末尾节点的话,那么要做到这一点就不难原创 2016-12-31 09:58:46 · 525 阅读 · 0 评论 -
java实现C语言编译器:实现有参数的函数调用
本节完成后,我们的解释器将能正确的执行下面的C语言代码void f(int a, int b) { int c; c = a + b;}void main() { f(1, 2);}原创 2016-12-27 12:04:27 · 2413 阅读 · 0 评论 -
Reactjs+BootStrap开发自制编程语言Monkey的编译器:创建简易的页面IDE
用reactjs和bootstrap创建Monkey编程语言的网页IDE原创 2017-11-07 16:24:31 · 1014 阅读 · 0 评论 -
面试算法:lg(k)时间查找两个排序数组合并后第k小的元素
如何在log(k)时间内查找两排序数组合并后第k小的元素原创 2017-10-11 15:22:06 · 949 阅读 · 0 评论 -
Reactjs+BootStrap开发自制编程语言Monkey的编译器:发刊词
为什么要用Reactjs开发一个编译器原创 2017-11-07 16:25:35 · 555 阅读 · 0 评论 -
查找算法:在双重排序的数组中进行快速查找
假设A是一个n*n的二维数组。它的行和列都按照升序排列,给定一个数值x,设计一个有效算法,能快速在数组A中查找x是否存在。同时考虑一个算法效率的下界,也就是无论任何算法,它的时间复杂度都必须高于某个给定水准。这道题难度不大,看到排序数组时,我们就应该本能的考虑到使用二分查找。我们先看一个具体实例,假设有一个符合条件的二维数组如下:最简单的方法是,循环遍历整个二维数组,依次查找给定元素是否与给...原创 2019-04-08 11:19:38 · 933 阅读 · 1 评论 -
使用最大-最小树搜索算法和alpha-beta剪枝算法设计有效围棋走法
我们的世界纷繁复杂,看起来完全不可捉摸。但在很多场景下,它运行的本质其实是通过付出最小的代价获得最大化收益。例如在自然界里的自然选择,光的运行路径。对于人的世界更是如此,由于我们做任何事情,任何选择都要付出相应的成本,因此选择一种决策方式让我们以最小的代价获得最大化的回报无疑是我们行动思考的核心。围棋,以及一切棋类它的本质就是寻求一种最优化策略,但不同之处在于,它不是寻求即时回报,而是寻求最终回...原创 2019-03-26 10:34:46 · 3660 阅读 · 1 评论 -
一道能做出来就脚踢BAT的高难度算法题:在元素重复三次的数组中查找重复一次的元素
我们看一道难度很高的查找类算法题,如果你真能在一小时内给出正确的算法和编码,那么你随便在BAT开口年薪一百万都不算过分。我们先看题目:给定一个数组,它里面除了一个元素外,其他元素都重复了三次,要求在空间复杂度为O(1),时间复杂度为O(n)的约束下,查找到只重复了一次的元素。在一个小时内设计出满足条件的算法并编写正确的代码,难度相当大。我们先从简单的角度思考,一种做法是先将数组进行排序,然后从头...原创 2018-10-16 16:00:15 · 622 阅读 · 0 评论 -
快速在组合中查找重复和遗失的元素
给定一个集合: 它包含n个元素,每个元素都是一个数字,对于另一个集合A,它所有的元素都来自集合Z,现在已知的是,A中的集合相比于Z,它缺失了其中一个元素,同时有一个元素从复了两次,假设A中,元素xnxnx_n,缺失了,然而xixix_i重复了两次,于是A的集合为:请你给出一个算法,找出A中重复的元素和缺失的元素。要求算法的空间复杂度是O(1),时间复杂度是O(n)。这道题有两种解...原创 2018-08-24 17:27:01 · 412 阅读 · 0 评论 -
面试算法:在未知长度的超大数组中线性时间内查找第k大的元素
给定一个长度为n的数组,n是一个很大的值,而且事先不知道n的大小,给定一个确定的数值k,要求设计一个找出数组中第k大的元素,要求算法需要的空间不能超过O(k)。这个题目的处理有两个麻烦点,第一是它的总长度n不能提前知道,第二点在于题目对算法的空间有限定。对于找到第k小元素这类题目,一般的解法都是使用堆,例如我们先从数组中拿到k个元素,然后在k个元素上构造一个大堆,接着依次读入后续元素,如果读到...原创 2018-07-31 08:46:37 · 663 阅读 · 0 评论 -
面试算法:在循环排序数组中快速查找第k小的值
一个长度为n的数组A,它是循环排序的,也就是说它的最小元素未必在数组的开头,而是在下标i,于是就有A[i]378, 478, 550, 631, 103, 203, 220, 234, 279, 368, 370, 374给定一个排序数组,假定数组所有元素都不相同,请你给出一个复杂度为O(lgn)的算法,查找出第k小的元素。对于上面例子,如果k = 10,那么对应元素为478.解答这道...原创 2018-07-14 18:03:48 · 946 阅读 · 0 评论 -
面试算法:在未知长度的排序数组中进行快速查找
假设A是一个排好序的数组,但是它的长度,我们无法得知。如果我们访问的元素超出了数组长度,那么就会引发一次异常,请设计一个有效算法,输入数组A以及一个数值k,找到一个下标i,使得A[i] = k, 返回-1,如果数组A中不存在等于k的元素。这道题跟我们以前处理的查找问题不同之处在于,数组A的长度无法确定。如果数组A长度确定的话,那么问题就退化为一个在排序数组中进行查找的问题,此时我们依靠二分查找...原创 2018-07-02 18:09:42 · 1182 阅读 · 0 评论 -
面试算法,在绝对值排序数组中快速查找满足条件的元素配对
一个含有多个元素的数组,有多种排序方式。它可以升序排列,可以降序排列,也可以像我们以前章节说过的,以波浪形方式排序,现在我们要看到的一种是绝对值排序。对于数组A,绝对值排序满足以下条件:|A[i]| < |A[j]|,只要i < j。例如下面的数组就是绝对值排序:A:-49, 75, 103, -147, 164,-197,-238,314,348,-422给定一个整数k,...原创 2018-06-19 09:44:09 · 864 阅读 · 0 评论 -
BAT面试算法:在海量数据中快速查找第k小的条目
像BAT这种巨型互联网公司每天都要出来海量数据。假设从服务器上产生的数据条目数为n,这个值是事先不知道的,唯一确定的是这个值非常大,假定项目需要快速从这n条数据中查找第k小的条目,其中k的值是事先能确定的,请你设计一个设计一个满足需求并且兼顾时间和空间效率的算法。这个题目的难度有若干处,第一是数据数n无法确定,你无法动态的分配合适的空间来存储数据。其次是数据条目数n相当大,如果直接根据n来分配...原创 2018-03-13 12:29:41 · 628 阅读 · 0 评论 -
详解神经网络算法所需最基础数据结构Tensor及其相关操作
程序=算法+数据结构。神经网络本质上是一种大数据分析算法,任何算法得以运行,都必须依靠特定的数据结构,而用于将各种数据统一封装并输入网络模型的数据结构叫tensor,也就是张量。张量在不同的情况下存有不同的形式,接下来我们逐一分解。张量一大特征是维度,一个0维张量就是一个常量,在Python中,一个张量的维度可以通过读取它的ndim属性来获取,例如下面代码:我们常用的数值就等价与一维张原创 2018-01-27 17:34:26 · 1668 阅读 · 1 评论 -
深度学习与神经网络实战:快速构建一个基于神经网络的手写数字识别系统
没吃过猪肉,但得看过猪跑。虽然我们暂时对深度学习及神经网路的基本原理知之甚少,但获得深刻理性认识必须建立在足够的感性认知之上,就像掌握游泳技巧的前提是把自己泡到水里。因此我们在研究分析神经网络的技术原理时,先用代码构建一个实用的智能系统,通过运行后看结果的方式,我们就能快速建立起对深度学习相关技术的感知,这为我们后续建立扎实的理论体系奠定坚实的基础。神经网络系统的开发一般都使用python语言原创 2018-01-26 16:14:26 · 3275 阅读 · 1 评论 -
如何进入Google,面试算法之道:在二维数组中的快速查找
给定一个二维数组,它的行和列都是已经按升序排列,请设计一个算法,对于给定某个值x,判断该值是否包含在数组中。例如给定一个二维数组如下: A = { {2, 4, 6, 8 , 10}, {12, 14, 16, 18, 20}, {22, 24, 26, 28, 30}, {32, 34,原创 2018-01-15 17:04:12 · 361 阅读 · 0 评论 -
深度学习初论:构建基础思维框架
自16年Google的AlphaGO击败李世石,并再接再厉毫不留情的击垮棋坛一哥柯洁后,人工智能中的分支领域:深度学习和神经网络瞬间火遍大江南北。如今深度学习几乎成为人工智能的代名词,特别是它是最能让人工智能技术在现实产业中真正落地,并产生实用价值的人工智能技术,iPhoneX的人脸识别,百度和特斯拉的自动驾驶技术,微软的对话机器人小冰,以及苹果的Siri,亚马逊的智能音箱等技术无不基于深度学习技原创 2018-01-23 10:57:35 · 626 阅读 · 0 评论 -
面试算法:二分查找法寻找数组截断点
用二分查找法寻找数组截断点原创 2017-11-22 17:20:20 · 1492 阅读 · 0 评论 -
java开发编译器:把C语言的循环指令编译成java字节码
把C语言的循环指令:for, while等编译成java字节码原创 2017-10-24 16:37:39 · 776 阅读 · 0 评论 -
java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码
把C语言实现的快速排序算法代码编译成java字节码原创 2017-10-31 12:01:41 · 718 阅读 · 0 评论 -
java实现C语言解释器:无参数传递的函数调用的解释和执行
本节,我们看看,如何实现C语言中的函数调用,举个具体例子,在完成本节的代码后,我们的解释器功能进一步增强,使得它能解释执行下面的C语言代码:void f() { int a; a = 1;}void main() { f();}原创 2016-12-26 12:14:39 · 1295 阅读 · 1 评论 -
java开发C语言编译器: return 语句的解释和执行
在C语言程序中,很多函数并不是执行全部语句后,才从最底部返回的,大多数情况下,当某些条件成立时就可以通过return 语句立即返回,而无需执行接下来的代码,本节,我们继续增强java开发的C语言解释器功能,使其能够处理return语句.原创 2017-01-03 09:51:51 · 1044 阅读 · 0 评论 -
java开发编译器:自底向上语法解析的基本原理
自底向上的语法解析,依赖于一种语法格式,我们可称之为LALR(1),跟LL(1)语法类似,LALR语法有以下特点,第二个L表示在解析语法时,从左向右读取语法文本。R表示right most, 也就是在做语法解析时,我们从推导表达式最右边的非终结符开始进行替换解析,LA意思是LOOK AHEAD, 跟LL(1)一样,LALR(1)语法解析时,也需要预先读取输入字符才能做下一步的解析。LR语法比LL语法更灵活,也更容原创 2016-06-20 15:53:13 · 1983 阅读 · 1 评论