
趣学算法与数据结构
文章平均质量分 72
《算法导论》可以算是算法的圣经之作,但是翻开之后,满页的公式与密密麻麻的文字描述,让人望而止步,本系列文章通过简单的例子来讲解算法的原理,并通过代码进行实现,想快速学习算法的同学,可以关注本系列文章!
铁猴
热爱Java,热爱大数据,热爱技术!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
图解归并排序
基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分而治之 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式...转载 2019-11-15 11:42:50 · 1015 阅读 · 0 评论 -
图解堆排序
预备知识堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,...转载 2019-11-15 11:15:09 · 801 阅读 · 2 评论 -
图解算法---希尔排序(转载)
前情回顾:直接插入排序(对插入排序不熟悉的建议先阅读此文)一天,一尘拿着扑克自己在那玩,刚被师傅看见了首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高可以看出,他是按下标相隔距离为4分的组,也就是说把下标相差4的分到一组,比如这个例子中a[0]与a...转载 2019-11-15 10:38:18 · 859 阅读 · 0 评论 -
Ceph中Paxos 算法的由来
Paxos 是分布式计算里非常重要的一个算法,最初由 Leslie Lamport 在1990年发表,题为:The Part-time Parliament,这是一篇很有趣的论文,Lamport 在这篇论文里面把人物(分布式计算领域内的重要科学家)的英文名字用希腊文代替,并且整篇论文站在人类学家的立场、古文明、议会的角度来写导致人们很难理解这是一篇计算机学术论文,所以论文一直没能被发表,更糟的是,转载 2014-11-11 14:38:28 · 3292 阅读 · 0 评论 -
Python 实现的Binary Search 算法以及效率的对比
最近用Python3.2,3实现了一下Binary Search算法,同时看到网上有关于程序执行时间统计的代码段,于是就加到了程序里import randomimport functoolsimport timeitoriginal=[]target=0;def binary_search(target,seq=[],lowerindex=0,upperindex=None):原创 2013-04-10 20:40:14 · 3679 阅读 · 0 评论 -
Python 实现的"冒泡排序"
'''Bubble Sort@author: aihua.sun'''import stringimport randomnumber = [];count = 0;def bubbleSort(): #initializeNumberArray(); generateRandomNumberArray(10, 1, 300); showArra原创 2013-01-24 20:16:04 · 1527 阅读 · 0 评论 -
用java实现的zip于unzip的功能(转)
最近工作中总是做一件重复的事情,就是对一个zip文件进行解压缩,然后再根据某些配置文件,需要对zip包中的内容进行替换,然后还需要将解压后的文件再压缩,关于压缩和解压缩的方法很多,可以还是选择用java语言来实现这一功能,由于文件的数量比较多,而且又多数都是二进制文件,所以个人觉得不管是复制,还是解压缩,对文件的操作要求都是比较高的,进过再三的比较,最后选用了一位仁兄的推荐的程序,据说这段代码是出转载 2011-12-18 18:37:59 · 4452 阅读 · 1 评论 -
用List实现的Fibonacci 觉得超级简单,请高手指点
import java.util.ArrayList;import java.util.List;public class Fibonacci { public static void main(String[] args) { System.out.println(fibonacci(10)); } static List fibonacci(int count)原创 2011-10-26 23:03:42 · 1196 阅读 · 0 评论 -
算法快学笔记(十八):史上最全查找算法总结
1. 简介查找算是工作过程中运用最广泛的操作了,操作系统读取文件时需要查找,从数据库读取数据时需要查找…本文将对常见的查找算法进行总结。2. 常见算法2.1 顺序查找基本思想:该算法简单粗暴,从头(或是最后)开始遍历,找到要查的数据就停止遍历并返回结果,如果遍历完也没有找到就是查找不成功。时间复杂度:O(n)2.2 有序表2.2.1 二分查找基本思想:将表中间位置记录的关键...原创 2019-11-15 11:57:33 · 1782 阅读 · 0 评论 -
算法快学笔记(十七):史上最全排序算法总结
1. 简介本文对常见排序算法进行总结2. 排序算法2.1 冒泡排序该算法比较简单,几乎所有语言涉及到算法时,都会涉及到冒泡算法。算法思路:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没...原创 2019-11-15 11:48:53 · 3324 阅读 · 8 评论 -
算法快学笔记(十六):动态规划
1. 介绍前文提到,对于背包问题与旅行商问题,计算的复杂度是随着计算数据的增加呈现指数级增长的,贪婪算法算可以处理,但得到的并不是最优解。动态规划的主要思路是先解决子问题,在逐步解决大问题。本文将通过两个例子介绍动态规划的推算思路。2. 背包问题2.1 思路通过动态规划方法解决背包问题的流程如下:准备一个表格,商品作为Y轴,背包重量作为x轴使用下面的公式算出价格且更新到表格里...原创 2019-11-13 17:14:31 · 1939 阅读 · 3 评论 -
算法快学笔记(十五):贪婪算法与NP完全问题
1. 贪婪算法1.1 算法思路贪婪算法的思想很简单:每步都采取最优的做法,以教室调度为例进行说明该算法步骤。假设有以下课表,希望将尽可能多的课程安排在同一个教室:由于不同课的开始与结束时间存在冲突,所以不可能把所有课放在一个教室上。使用贪心算法的解决思路如下:选出结束最早的课,它是上的第一堂课。 此时选择美术课接下来选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要第...原创 2019-11-13 16:28:41 · 1836 阅读 · 0 评论 -
算法快学笔记(十四):图的最小生成树算法
1. 介绍最小生成树的应用场景很广,例如电信公司需要将9个村庄进行网络连接,村庄间的距离都不相同,怎么连接才能达到成本最小了?村庄结构图如下:V0-V10分别表示村庄,节点间的权重代表距离,连接所有节点的总距离最小,就可以让成本更低。定义:把构造连通整个图的最小代价生成树称为最小生成树。2. 相关算法普利姆与克鲁斯卡尔算法都是贪心算法2.1 普利姆(Prim)算法2.1.1 原理...原创 2019-10-24 15:37:34 · 2754 阅读 · 2 评论 -
算法快学笔记(十三):狄克斯特拉(Dijkstra)算法原理与实现
1. 简介广度优先算法可以找出段数最少的路径,但是对于路径上带权重的图,想要找出最快的路径,则需要使用狄克斯特拉算法。2. 原理为了说明狄克斯特拉算法的原理,使用换钢琴的的例子来做说明.假设Rama想拿自己的乐谱换架钢琴:Alex说:“这是我最喜欢的乐队Destroyer的海报,我愿意拿它换你的乐谱。如果你再加5美元,还可拿乐谱换我这张稀有的Rick Astley黑胶唱片。”Amy...原创 2019-06-13 11:59:43 · 2709 阅读 · 1 评论 -
算法快学笔记(十二):图的广度优先搜索(BFS-Breadth First Search)
1. 介绍广度优先搜索(BFS)是一个经典的图算法,该算法能够找出两样东西之间的最短距离!使用广度优先搜索可以:编写国际跳棋AI,计算最少走多少步就可获胜;编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;根据你的人际关系网络找到关系最近的医生。要说明的是,广度优先搜索是一种用于图的查找算法,可帮助回答两类问题。...原创 2019-03-08 15:08:50 · 1086 阅读 · 0 评论 -
算法快学笔记(十一):图的深度优先搜索(DFS-Depth-First-Search)
转载自:https://www.cnblogs.com/skywang12345/p/3711483.html1. 介绍图的深度优先搜索(Depth First Search),是图的一种搜索方法,和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶...转载 2019-03-08 15:07:02 · 1198 阅读 · 0 评论 -
算法快学笔记(十):截图“图”的面纱
1. 介绍数据结构领域,图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。本文对图的基础支持做一个简单的总结。2. 定义2.1 图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。2.2 图...原创 2019-02-12 11:00:58 · 839 阅读 · 0 评论 -
算法快学笔记(九):红黑二叉树
转载自:https://www.tianxiaobo.com/2018/01/11/红黑树详细分析/ 1.红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修...转载 2019-01-14 19:06:15 · 2335 阅读 · 2 评论 -
算法快学笔记(八):一次性学习和B相关的树
本文转自:https://www.cnblogs.com/lj820403/p/7416423.html1. 说明常见的B系列树包括,B树、B-树、B+树、B*树,本文对这些树做一个总结2. B树即二叉搜索树:所有非叶子结点至多拥有两个儿子(Left和Right);所有结点存储一个关键字;非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;如:B树的搜索...转载 2019-01-14 18:45:22 · 628 阅读 · 0 评论 -
算法快学笔记(七):赫夫曼,赫夫曼树,赫夫曼编码
1. 赫夫曼鼎鼎大名赫夫曼树以及赫夫曼编码都是出自赫夫曼这位大牛之手,为表致敬先简单的介绍赫夫曼大神。赫夫曼,全名David Albert Huffman,1925年8月9日-1999年10月7日,生于美国俄亥俄州,计算机科学家,为霍夫曼编码的发明者。1951年,赫夫曼在麻省理工学院(MIT)攻读博士学位,他为了完成一篇题为<<查找最有效的二进制编码>>的报告,研究出...原创 2019-01-11 14:05:06 · 1226 阅读 · 1 评论 -
算法快学笔记(六):揭开“树”的面纱
算法世界中,树结构是较大的一块知识体系,从二叉树,到B树,到红黑树,赫夫曼树等耳熟能详的算法都可以归纳到“树”这一体系。本文先只对树以及二叉树的基本概念进行阐述,更多算法的讲解请参阅后续博文。1. 树树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树。一颗简单的树如下:数的定义很简单,但是有两点需要强调:N>...原创 2019-01-11 11:36:30 · 683 阅读 · 0 评论 -
算法快学笔记(五):散列表
1. 介绍当需要根据给定的值需要快速得到想要值的时候,散列表是一个非常有用的数据结构,假设你在一家杂货店上班。有顾客来买东西时,你得在一个本子中查找价格,如果本子的内容不是按字母顺序排列的,你可以使用简单查找法,从头到尾以一个一个的找,时间复杂度为O(n),如果本子的内容是按字母顺序排列的,可使用二分查找来找出苹果的价格,这需要的时间会短一些,为O(log n)。二分查找的速度非常快。但作为...原创 2018-12-30 16:19:17 · 759 阅读 · 0 评论 -
算法快学笔记(四):快速排序的原理与实现
1. 原理介绍快速排序是一种排序算法,速度比选择排序快得多,其主要基于“分而治之”的思想对集合进行排序,本文将对该算法进行分析。2. 分而治之(D&C)的思想D&C主要指利用递归的方式来不断的缩小需要处理问题的规模,最终使问题容易解决。使用D&C解决问题的过程包括两个步骤。(1) 找出递归的终止条件,这种条件必须尽可能简单(称为基线条件)。(2) 不断将问题分解...原创 2018-12-21 17:32:30 · 2018 阅读 · 0 评论 -
算法快学笔记(三):选择排序的原理与实现
1. 原理介绍选择排序是个简单的排序,思路主要通过多次遍历待排序的集合,每次弹出最大/小值并放入新的集合,直到原始集合为空。举个例子:假设要对A=[1,2,5,9,3]按照升序的方式进行排序,步骤与结果如下从A中找出最大值,将其pop,并放入B中,执行后的结果如下:A=[2,5,9,3]B=[1]重复执行第一部A=[5,9,3]B=[1,2]重复执行第一部A=[...原创 2018-12-21 17:29:12 · 1083 阅读 · 0 评论 -
算法快学笔记(二):数组与链表
1. 说明当程序需要将数据存储到内存时,计算机会给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的特性很重要。本文将对数组与链表的原理与优缺点进行总结。2. 数组使用数组存储多个元素的时候,数组中元素的地址时刻都是挨在一起的,为了便于理解,以看电影为例进行说明。你和你小伙伴的关系都非常的好,如果一起看电影必须要座位要挨在一起,...原创 2018-12-21 17:23:51 · 911 阅读 · 0 评论 -
算法快学笔记(一):算法入门
1. 算法的定义“算法”一词在不同的书籍以及网站上可能会存在一些差异,但是下面的定义个人觉得最为贴切:1. 算法代表着用系统的方法描述解决问题的策略机制2. 能够对一定规范的输入,在有限时间内获得所要求的输出3. 一个算法的优劣可以用空间复杂度与时间复杂度来衡量2. 论优秀算法的重要性在很多场景下,数据规模越大,越能体现优秀算法的价值,接下来将以猜数游戏为例进行说明优秀算法的重要性。...原创 2018-12-21 17:16:49 · 5845 阅读 · 0 评论