算法

译:编程面试的10大算法概念汇总

别来无恙 提交于 2020-04-15 17:27:39
【推荐阅读】微服务还能火多久?>>> 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念: 1. 字符串 2. 链表 3. 树 4. 图 5. 排序 6. 递归 vs. 迭代 7. 动态规划 8. 位操作 9. 概率问题 10. 排列组合 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。 toCharArray() // 获得字符串对应的char数组 Arrays.sort() // 数组排序 Arrays.toString(char[] a) // 数组转成字符串 charAt(int x) // 获得某个索引处的字符 length() // 字符串长度 length // 数组大小 2. 链表 在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。 class Node { int val; Node next; Node(int x) { val = x; next = null; } } 链表两个著名的应用是栈Stack和队列Queue。 栈: class Stack{ Node top; public Node peek(){ if(top != null)

十大经典算法总结(Javascript描述)

我是研究僧i 提交于 2020-04-15 07:40:18
【推荐阅读】微服务还能火多久?>>> 前言 读者自行尝试可以 想看源码戳这 ,博主在github建了个库,读者可以Clone下来本地尝试。此博文配合源码体验更棒哦~~~ 个人博客: Damonare的个人博客 原文地址: 十大经典算法总结 这世界上总存在着那么一些看似相似但有完全不同的东西,比如雷锋和雷峰塔,小平和小平头,玛丽和马里奥,Java和javascript....当年javascript为了抱Java大腿恬不知耻的让自己变成了Java的干儿子,哦,不是应该是跪舔,毕竟都跟了Java的姓了。可如今,javascript来了个咸鱼翻身,几乎要统治web领域,Nodejs,React Native的出现使得javascript在后端和移动端都开始占有了一席之地。可以这么说,在Web的江湖,<mark>JavaScript可谓风头无两,已经坐上了头把交椅。</mark> 在传统的计算机算法和数据结构领域,大多数专业教材和书籍的默认语言都是Java或者C/C+ +,O’REILLY家倒是出了一本叫做《数据结构与算法javascript描述》的书,但不得不说,不知道是作者吃了shit还是译者根本就没校对,满书的小错误,这就像那种无穷无尽的小bug一样,简直就是让人有种嘴里塞满了shit的感觉,吐也不是咽下去也不是。对于一个前端来说,尤其是笔试面试的时候,算法方面考的其实不难(

初学算法

本秂侑毒 提交于 2020-04-09 11:12:10
所谓凸包,就是 一个计算几何(图形学)中的概念。用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。维基百科对集合X的凸包(Convex Hull)有四个定义,分别为: The (unique) minimal convex set containing X --- 包含集合X的最小凸集合 The intersection of all convex sets containing X --- 所有包含集合X的凸集合的交集 The set of all convex combinations of points in X . --- 集合X中所有点的凸组合的集合 The union of all simplices with vertices in X . --- 集合X中所有单一顶点的集合 对于二维凸包,不如我们把平面上的一些点想象为“钉子”,而你正将一个橡皮筋撑的足够大,以至于所有“钉子”都在你的橡皮筋包围的区域里。现在我们松开它。“啪”的一声,橡皮筋会尽可能的收缩到极致,而这时撑起橡皮筋的这些“钉子”构成的集合, 也就是凸包。 通过观察,我们可以知道“最左”和“最右”的两个点一定在构成凸包的集合里。而Garham's Scan算法也正是注意到了这点。另外,如果我们按照顺时针方向观察凸包,如P->Q->R

数据结构-02-链表(Linkied List)

北慕城南 提交于 2020-04-09 09:51:54
##Linked List - 链表 链表是线性表的一种。线性表是最基本、最简单、也是最常用的一种数据结构。 线性表 中 数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的 。线性表有两种存储方式,一种是 顺序存储结构 ,另一种是 链式存储结构 。我们常用的数组就是一种典型的顺序存储结构。 相反, 链式存储结构 就是两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指 针域一般是存储着到下一个元素的指针 。这种存储方式的优点是插入和删除的时间复杂度为 O(1),不会浪费太多内存,添加元素的时候才会申请内存,删除元素会释放内存。缺点是访问的时间复杂度最坏为 O(n)。 顺序表的特性是随机读取,也就是访问一个元素的时间复杂度是O(1),链式表的特性是插入和删除的时间复杂度为O(1)。 链表 就是 链式存储的线性表 。根据 指针域 的不同,链表分为 单向链表、双向链表、循环链表 等等。 请看示例: class listNode: def __init__(self, val): self.val = val self.next = None ##链表的基本操作 ###反转链表 ####单向链表 链表的基本形式是:1 -> 2 -> 3 -> null,反转需要变为 3 -> 2 -> 1 -> null。这里要注意:

常用算法(冒泡、插入、选择、快速)和二叉树详解

浪子不回头ぞ 提交于 2020-04-08 13:59:31
  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。   计算机科学中,算法的 时间复杂度 是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号(Order)表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 定义   在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 算法复杂度   算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 时间复杂度   1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。   2.

TCP的慢启动和拥塞避免

◇◆丶佛笑我妖孽 提交于 2020-04-07 21:39:56
TCP为了保证数据的完整性采用了许许多多的方法,像启用重传定时器、坚持定时器,通过最大路径发现获取到链路中允许通过的最大数据包大小,还有一些其它的如慢启动、拥塞避免、快速重传等等。 慢启动: 一般通信时,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但是如果在发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。 慢启动算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作 。 慢启动为发送方的 T C P 增加了另一个窗口:拥塞窗口 (congestion window) ,记为 c w n d 。当 与另一个网络的主机建立 T C P 连接时,拥塞窗口被初始化为 1 个报文段(即另一端通告的报文段大小) 。每收到一个 A C K ,拥塞窗口就增加一个报文段( c w n d 以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。 在时间 0 ,发送方发送了一个报文段。由于发送方处于慢启动中(其拥塞窗口为 1 个报文段),因此在继续发送以前它必须等待该数据段的确认。 在时间 1, 2 和 3

希尔排序算法

橙三吉。 提交于 2020-04-07 09:46:46
前言 当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动较多次数,性能会很差。希尔排序解决了这一问题。 基本思想 希尔排序的基本思想: 把序列按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 如果对直接插入排序不了解的朋友,可以看我的这篇文章: 详解直接插入排序算法 例子 给定数组arr为 [ 3 , 6 , 5 , 12 , 1 , 75 , 10 , -3, 0 ] 初始状态见下图: 定义变量 h 为增量,初始值为5 。 第一轮 根据增量设置成5组,颜色相同的为一组。 对每一组进行直接插入排序得到: 然后 h减半向下取整; 则 h = 3; 第二轮 根据增量设置成5组,颜色相同的为一组。 对每一组进行直接插入排序得到: 然后 h减半向下取整; 则 h = 1; 第三轮 增量为1,所有序列为一组。 插入排序后得到: h此时为1,全部有序,完毕。 由例子可知,每次都可以达到组内部分有序,大大减少了插入排序的移动开销。 代码 首先说下步长的选择: 步长的选择一般时这样的: int h = 1; while(h < arr.length / 2){ h = 2 * h + 1; } 即先把步长设置为1,只要 h 小于数组长度一半(向下取整

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

主宰稳场 提交于 2020-04-07 05:48:36
编译自: http://bigocheatsheet.com/ 作者: Eric 原创: LCTT https://linux.cn/article-7480-1.html 译者: wxy 本文地址: https://linux.cn/article-7480-1.html 算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-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

Java虚拟机详解04----GC算法和种类【重要】

主宰稳场 提交于 2020-04-07 05:39:06
本文主要内容: GC的概念 GC算法     引用计数法(无法解决循环引用的问题,不被java采纳)   根搜索算法   现代虚拟机中的垃圾搜集算法:       标记-清除       复制算法(新生代)       标记-压缩(老年代)   分代收集 Stop-The-World 一、GC的概念: GC:Garbage Collection 垃圾收集 1960年 Lisp使用了GC Java中, GC的对象是Java堆和方法区 (即永久区) 我们接下来对上面的三句话进行一一的解释: (1)GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是 在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM 。 在C/C++里是由程序猿自己去申请、管理和释放内存空间,因此没有GC的概念。而在Java中, 后台专门有一个专门用于垃圾回收的线程 来进行监控、扫描,自动将一些无用的内存进行释放,这就是垃圾收集的一个基本思想, 目的在于防止由程序猿引入的人为的内存泄露 。 (2)事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? (3)内存区域中的