算法

每个程序员都应该收藏的算法复杂度速查表

余生颓废 提交于 2020-04-07 05:34:05
算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 O(Big-O)复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢! — Eric 图例 绝佳 不错 一般 不佳 糟糕 数据结构操作 数据结构 时间复杂度 空间复杂度 平均 最差 最差 访问 搜索 插入 删除 访问 搜索 插入 删除 Array O(1) O(n) O(n) O(n) O(1) O(n) O(n) O(n) O(n) Stack O(n) O(n) O(1) O(1) O(n) O(n) O(1) O(1) O(n) Singly-Linked List O(n) O(n) O(1) O(1) O(n) O(n) O(1) O(1) O(n) Doubly-Linked List O(n) O(n) O(1) O(1) O(n) O(n) O(1) O(1) O(n) Skip List O(log(n)) O(log(n)) O(log(n)) O(log(n)) O(n) O

【算法研究】搜索算法-深度优先搜索

喜夏-厌秋 提交于 2020-04-07 02:13:59
如果您觉得本文有用,可以在微博上关注我,每周我都会在微博上发布新博客发表的通知, 我的微博 ###深度优先搜索 ####介绍 如果您觉得这篇文章排版不舒服,请到我的微盘下载pdf: 搜索算法-深度优先搜索 深度优先搜索是一种用来 遍历 或者 搜索 树(TREE)或图(GRAPH)结构的算法。搜索开始于某个根节点(从图中选取某个节点),然后在开始回溯前尽可能远地探索到这一支的终点。 对于DFS的实际应用程序来说,DFS常常因为要搜索的图的某一条搜索路径太长(甚至是无限的)而陷入性能瓶颈,所以我们经常制定DFS只能搜索到某个深度, 如果用一个图来代表深度优先搜索的过程,即如下图: ####深度优先遍历的伪码实现 相应的伪码实现在《算法导论》这本书中有讲解,书中用的方法十分巧妙,它用三种颜色来代表三种状态 WHITE代表未访问的结点 GRAY代表该节点第一次被访问 BLACK代表该节点的所有邻接节点都被访问,即回溯完毕的 第二次 访问 以下是一个深度优先遍历的递归实现: DFS(G, s) for 在图G中的每一个节点v status[v] = WHITE // 进行其他初始 DFS-VISIT(s) DFS-VISIT(v) status[v] = GRAY for 每一个v的邻接节点 if (status[v] == WHITE) DFS-VISIT(t) status[v] =

dubbo的负载均衡的几种算法

别等时光非礼了梦想. 提交于 2020-04-06 23:49:35
Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。 存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见: http://en.wikipedia.org/wiki/Consistent_hashing 。 缺省只对第一个参数Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用160份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes" value="320" /> 这几种算法是很常见的

数学是什么

情到浓时终转凉″ 提交于 2020-04-06 22:01:04
数学与编程 文章来源 http://www.cnblogs.com/edward-bian 在这里写数学博客也许有些另类,大家讨论的都是最新最实用的技术,数学这门古老学科在这里显得违和感很强。对绝大部分程序员而言,也许一辈子都用不到几个数学公式。少许人在工作中会偶尔碰到一点数学概念,隐约可以感觉到这只无形的手的神奇力量。   严格说,我也算数学科班出生,本科就读于“南京哪个大学”数学系。只可惜学艺不精,也只是混到毕业,按我们一个老师的说法:“出去也只能拿一些名词唬唬人”,其实我连那些名词都不记得了。当初报数学系是以为其他系不学数学,而且认为自己数学很好,来了之后才发现实在是资质平平,而且学数学也没有那种荣耀感了。临近毕业时,决定随大流投身到高尖产业--计算机行列,那年复试以离散满分、操作系统零分的成绩进入了计算机系。生性懒惰,行动力差决定了我到哪都是庸碌的,研究生毕业除了用数学公式发了一篇《软件学报》外一无所获,导师在散伙饭上也对我下了定义:“缺少冲劲”。接下来,你们都猜到了,我成为了千万码农的一份子,为这个世界的垃圾代码继续添砖加瓦,直至这个世界不再需要代码……   我以为就此与数学决别了,学学协议,解解bug,貌似智商是够用的。但工作中总会有些数学的东西时不时来撩动我的心:密码学、图论、几何、DSP、抽象代数、信息学、概率论、算法……虽然很多只是擦肩而过,每次我都会驻足许久

如何检查一个单向链表上是否有环?

孤街浪徒 提交于 2020-04-06 20:47:40
1, 最简单的方法, 用一个指针遍历链表, 每遇到一个节点就把他的内存地址(java中可以用object.hashcode())做为key放在一个hashtable中. 这样当hashtable中出现重复key的时候说明此链表上有环. 这个方法的时间复杂度为O(n), 空间同样为O(n). 2, 使用反转指针的方法, 每过一个节点就把该节点的指针反向: <!-- lang: cpp --> Boolean reverse(Node *head) { Node *curr = head; Node *next = head->next; curr->next = NULL; while(next!=NULL) { if(next == head) { /* go back to the head of the list, so there is a loop */ next->next = curr; return TRUE; } Node *temp = curr; curr = next; next = next->next; curr->next = temp; } /* at the end of list, so there is no loop, let's reverse the list back */ next = curr->next; curr ->next =

5、算法、位运算符

时光怂恿深爱的人放手 提交于 2020-04-06 20:22:06
1、算法:   通俗定义:     解题的方法和步骤   狭义定义:     对存储数据的操作     对不同的存储结构,要完成某一个功能所执行的操作是不一样的   比如:   要输出数组中所有的元素的操作和要输出链表中所有元素的操作肯定是不一样的   这说明:      算法是依附于存储结构的      不同的存储结构,所执行的算法是不一样的   广义定义:       广义的算法也叫泛型       无论数据是如何存储的,对该数据的操作都是一样的 2、位运算符 & : 按位与 (&&: 逻辑与) | : 按位或 ( || :逻辑或) ~ : 按位取反 ~i就是把i变量所有的二进制位取反 ^ :按位异或 <<:按位左移 i<<3表示把i的所有二进制位左移3位,右边补零; 左移n位相当于乘以2的n次方 ,前提是数据不能丢失 >>:按位右移 i>>3表示把i的所有二进制位右移3位,左边一般是0,当然也可能补1; 右移n位相当于除以2的n次方 ,前提是数据不能丢失 A)i=i*8;B)i=i〈<3; A) i=i/8; B)i=i>>3; 上述语句中,语句B执行的速度更快 来源: https://www.cnblogs.com/zh-xiaoyuan/p/12643718.html

Greedy Algorithm 实例

喜你入骨 提交于 2020-04-06 19:33:08
Algorithm Design Techniques - 1 ##Greedy Algorithm## note: It works only if local optimum is equal to global optimum ###1. Approximate Bin Packing### ####The Knapsack problem#### 问题大意:给定n种物品和一个背包,背包容量为Sum,对于每一个物品i,它的重量为W(i), 价值为p(i)。 要怎样才能使背包装的物品的价值最高。 <pre><code> Example : n = 3, M = 20, (p1, p2, p3) = (25, 24, 15) (w1, w2, w3)= (18, 15, 10) Solution is...? ( 0, 1, 1/2 ) P = 31.5 这是一种最理想化的情形。(因为这种算法将一个物品看成由很小的部分组成。你可以把一个物品分开) </code></pre> #####0-1你背包问题##### 问题大致描述: 没见物品要么不放要么放,不能把物品拆成小份(其他基本同上) 通常采用 动态规划算法 来解决 针对该问题的算法主要思想:( 待续 ) ####The Bin Packing Problem#### 问题大意:有n种物品,各自大小为S(n);

机器学习算法

人盡茶涼 提交于 2020-04-06 17:21:39
本文首发自公众号: RAIS 前言 本系列文章为 《Deep Learning》 读书笔记,可以参看原书一起阅读,效果更佳。深度学习是机器学习的子集,因此想更深入的了解深度学习,需要对机器学习的一些基本原理。 学习算法 机器学习算法是一种能够从数据中学习的算法,有人给出学习的定义 “对于某类任务 T 和性能度量 P,一个计算机程序被认为可以从经验 E 中学习是指,通过经验 E 改进后,它在任务 T 上由性能度量 P 衡量的性能有所提升” (通过经验以提高计算机程序在某些任务上性能的算法),我们分别聊一聊其中提到的 任务 T , 性能度量 P 和 经验 E ,最后再给出一个例子进行说明。 任务 T 我们之前的文章中提到过几种机器学习类别,比如二分类问题,多分类问题,回归问题等,接下来我们做一个总结。 分类:计算机程序需要指定某些输入属于 K 类中的哪一类。对于此类问题,机器学习算法可能会返回一个函数:$R^n -> {1, 2, 3, ..., k}$,或者是不同类别的概率分布。 输入缺失分类:输入的数据有可能“不好”,有一些属性的缺失等,这样算法学习出来的映射关系就可能不是单一的了,有可能是一组函数,其中分别对应着不同属性的缺失(数学做法上可能不是单纯的计算某些属性缺失后进行训练,而有可能是计算其联合概率分布)。 回归问题:对给定输入预测数值,例如以前个房屋价格预测问题。 转录问题

设计模式-策略模式

柔情痞子 提交于 2020-04-06 12:58:34
策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。策略模式有以下优点: 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。 模式结构 策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性,现在我们来分析其基本结构和实现方法。 策略模式的主要角色如下: 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。 具体策略(Concrete Strategy)类

浅谈浏览器垃圾回收机制

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-06 12:38:30
javaScriipt 使用垃圾回收机制来自动管理内存 js 的回收机制目前分为两种方式:1.标记清除(各大浏览器主流算法)2.引用技术   一: 标记清除     这种算法的思想是给当前不使用的值加上标记,然后再回收其内存     算法流程:       1.浏览器再运行的时候会给存储再内存中的所有变量都加上标记       2.去掉环境中的变量以及被环境中引用的变量的标记       3.如果还有变量有标记,就会被视为准备删除的变量       4.垃圾回收机制完成内存的清除工作,销毁那些带标记的变量,并回收他们所占用的内存空间   二:引用计数     这种算法的思想是跟踪记录所有值被引用的次数。javaScript 引擎目前都不再使用这种算法,但再IE 中访问非原生JavaScriopt 对象(如DOM元素)时,这种算法任然可能会导致问题     当代码中存在循环引用现象时,引用计数算法就会导致问题     解除变量的引用不仅可以帮于消除循环引用现象(一个变量使用完之后赋值为null),而且对垃圾收集也有好处。为了确保有效的回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用     算法流程:       1.声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值引用次数就是1       2.同一个值又被赋值另一个变量