数据结构与算法
文章平均质量分 63
数据结构和算法学习的点点滴滴
小地盘
这个作者很懒,什么都没留下…
展开
-
广度优先搜索[再解迷宫]
上一节讲过深度优先搜索解决迷宫,http://blog.csdn.net/wtyvhreal/article/details/43268115这一节讲解广度优先搜索解决迷宫。广度优先搜索(Breadth First Search,BFS),也称为宽度优先搜索。还是二维数组存储,开始小哼在(1,1)处,在深搜里我们先让小哼往右边走,然后一直尝试下去,直到走不通的时候再回到这里。这原创 2015-01-29 11:28:02 · 2002 阅读 · 0 评论 -
深度优先搜索[奥数等式、迷宫找人]
上一节我们用暴力枚举解决奥数等式,虽然简单,但是很蛋疼。这一节讲用深搜的方式解决,高大上。深度优先搜索(Depth First Search,DFS),理解深搜的关键在于解决“当下该如何做”。至于“下一步如何做”则与“当下该如何做”是一样的。通常的方法就是把每一种可能都是尝试一遍。当前这一步解决后便进入下一步。下一步的解决方法和当前这步的解决方法是完全一样的。深搜的基本模型:voi原创 2015-01-29 10:56:13 · 2444 阅读 · 0 评论 -
暴力的枚举法[奥数等式]
将数字1~9分别填入,每个数字只能使用一次使得等式成立。例如173+286=459就是一个合理的组合,请问一共有多少种合理的组合?注意173+286=459和286+173=459是同一种组合。根据枚举思想我们只需要枚举每一位上所有可能的数就好了。用一个book数组来标记解决互不相等的问题。由于173+286=459和286+173=459是同一种组合,所以结果to原创 2015-01-29 10:44:46 · 2891 阅读 · 2 评论 -
链表和模拟链表[插入数字]
有一串已经从小到大排好序的数2 3 5 8 9 10 18 26 32。现需要往这串数中插入6使其得到的新序列仍符合从小到大排列。如我们使用数组来实现这一操作,则需要将8和8后面的数都依次往后挪一位,如下这样操作显然很耽误时间,如果使用链表则会快很多。此时如果需要在8前面插入一个6,就只需像下图这样更改一下就可以了,而无需再将8及后面的数都依次往后挪一位。是不是很节省时间呢?原创 2015-01-28 11:54:05 · 2409 阅读 · 3 评论 -
栈浅析[解密回文]
栈的实现很简单,只需要一个一维数组和一个指向栈顶的变量top就可以了。我们通过top来对栈进行插入和删除操作。 栈究竟有哪些作用呢?我们来看一个例子。“xyzyx”是一个回文字符串,所谓回文字符串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“aha”和“ahaha”均是回文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。原创 2015-01-28 11:46:43 · 2035 阅读 · 0 评论 -
队列浅析[解密QQ号]
题目:新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的原创 2015-01-27 17:21:43 · 2171 阅读 · 0 评论 -
快速排序[平均时间复杂度O(NlogN)]
基本思想:假设我们现在对“6 1 2 7 9 3 4 5 10 8”这10个数进行排序。首先在这个序列中随便找一个数作为基准数。为了方便,就让第一个数6作为基准数。分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换它们,用两个变量i和j分别指向最左边和最右边,直到i=j,将基准数与a[i]交换,再继续递归原创 2015-01-27 16:36:05 · 6823 阅读 · 1 评论 -
冒泡排序[简单复杂度高O(N^2)]
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。“冒泡排序”的原理是:每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数(即第5位)归位,第二趟只能将倒数第2位上的数(即第4位)归位,第三趟只能将倒数第3位上的数(即第3位)归位,依次。总结一下:如果有n个数进行排序,只需将n-1个数归位,也就是说要进行n-1趟操作。而“每一趟”都需要原创 2015-01-27 15:49:37 · 2305 阅读 · 0 评论 -
桶排序[最快最简单排序O(M+N)]
5个数要排序,5,3,5,2,8首先我们需要申请一个大小为11的数组int a[11]。现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。下面开始处理每一个人的分数,第一个人的分数是5分,我们就将相对应的a[5]的值在原来的基础增加1,即将a[5]的值从0改为1,表示5分出现过了一次。依次最后结果原创 2015-01-27 15:30:31 · 2383 阅读 · 0 评论 -
HDU1753—大明A+B(大正小数相加)
大明A+BTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9105 Accepted Submission(s): 3235Problem Description话说,经过了漫长的一个多月,小明已经成长了许多,原创 2015-01-06 00:31:20 · 2185 阅读 · 2 评论 -
大数相加—位运算
本文整理了C语言中大数据的相加算法,基于位运算来实现。亲测可用。//100位大数相加#include #include #define Max 101//有进位101 int bigNumAdd(char a[],char b[],char sum[]) { int i=0; int c=0;//表示进位 //清0原创 2014-12-19 15:45:48 · 2830 阅读 · 2 评论 -
10款开源的推荐系统简介
最近这两年推荐系统特别火,本文搜集整理了一些比较好的开源推荐系统,即有轻量级的适用于做研究的SVDFeature、LibMF、LibFM等,也有重量级的适用于工业系统的 Mahout、Oryx、EasyRecd等,供大家参考。PS:这里的top 10仅代表个人观点。1.SVDFeature主页:http://svdfeature.apexlab.org/wiki/Main_Page 语原创 2014-12-16 18:06:23 · 2273 阅读 · 0 评论 -
ACM经典算法
1.n的d次方快速算法 分治法 #include #include int main(){ int n=3,d=10; while(1){ scanf("%d%d",&n,&d); if(n==0&&d==0) break;原创 2014-12-07 14:47:21 · 2421 阅读 · 2 评论 -
最短路径(五)—最短路径算法对比分析
Floyd算法:时间复杂度高,可以解决负权边,并且均摊在每一点对上,在所有算法中还是属于较优的。较小的编码复杂度也是优势,如果要求是所有点之间的最短路径,或者如果数据范围较小,Floyd算法比较适合。Dijkstra算法:无法解决负权边的图,但有良好的可扩展性,时间复杂度低,堆优化后的Dijkstra的时间复杂度可以达到O(MlogN)。Bellman-Ford算法原创 2015-02-03 19:57:49 · 3086 阅读 · 0 评论 -
最短路径(四)—Bellman-Ford的队列优化(邻接表)
上一节我们写了Bellman-Ford算法解决负权边的问题:邻接表存储图:n个顶点,m条边。数组实现邻接表。对每一条边进行1-m编号。用u,v,w三个数组来记录每条边的信息,即u[i],v[i],w[i]表示第i条边是从第 u[i]号顶点到v[i]号顶点且权值为w[i].first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因原创 2015-02-03 18:20:52 · 3117 阅读 · 0 评论 -
最短路径(三)—Bellman-Ford算法(解决负权边)
前两节我们写了Floyd-Warshall算法http://blog.csdn.net/wtyvhreal/article/details/43315705和Dijkstra算法http://blog.csdn.net/wtyvhreal/article/details/43447497Floyd算法可以解决负权边,但是复杂度高。Dijkstra不能解决负权边(边的权值为负值)的图原创 2015-02-03 15:45:35 · 8533 阅读 · 2 评论 -
最短路径(二)—Dijkstra算法(通过边实现松弛:邻接矩阵)
上一节通过Floyd-Warshall算法写了多源节点最短路径问题:http://blog.csdn.net/wtyvhreal/article/details/43315705这一节来学习指定一个点(源点)到其余各个顶点的最短路径。也叫做“单源最短路径”。例如求下图中1号顶点到2、3、4、5、6号顶点的最短路径。用二维数组e存储顶点之间边的关系,初始值如下:原创 2015-02-03 11:40:41 · 11201 阅读 · 0 评论 -
最短路径(一)—Floyd-Warshall(只有五行的算法)
“多源最短路径”——计算任意两个城市之间的最短路径。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。公路是单向的。我们现在需要求任意两个城市之间的最短路径,也就是求任意两个点之间的最短路径。这个问题称为“多源最短路径”问题。用4*4的矩阵存储图的信息,二维数组e存储。之前通过dfs和bfs可以求出两点之间的最短路径。所以进行n^2遍深度或者广度优先原创 2015-01-30 21:43:06 · 5975 阅读 · 1 评论 -
图的遍历(二)—广度优先遍历
上一节中写了图的深度优先遍历,http://blog.csdn.net/wtyvhreal/article/details/43305785这一节讲解下图的广度优先遍历。同样的图:广度优先遍历的顺序结果如下:广度优先遍历的思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有顶原创 2015-01-30 13:29:03 · 2593 阅读 · 0 评论 -
图的遍历(一)—深度优先遍历
图就是由一些顶点和连接这些顶点的边组成的。例如上图就是由5个顶点(1、2、3、4、5)和5条边(1-2、1-3、1-5、2-4、3-5)组成。我们从1号顶点开始遍历这个图,遍历就是把图的每一个顶点都访问依次。深度优先遍历的结果:遍历顺序为:深度优先遍历的思想:首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走位未访问过的顶点;当没有未访问过的顶点原创 2015-01-30 12:54:20 · 8088 阅读 · 0 评论 -
字符串匹配的KMP算法
字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。 这种算法不太容易理解,网上有很多解释,原创 2015-03-15 10:15:45 · 2411 阅读 · 0 评论 -
寻找多数元素/主元素问题
问题描述:令a[1..n]是一个整数序列,a中的整数x如果在a中出现的次数多于n/2,那么x称为多数元素。设计一个性能比较优异的算法求解这个问题,找出一个整数序列中的多数元素。当然多数元素要么不存在,要么就只有一个算法描述:解决这个问题有好多种方法,蛮力方法就是把序列中的每个元素和其他每个元素比较,并且对每个元素计数,如果某个元素的计数大于n/2,就可以判断它是多数元素,否原创 2015-02-06 15:59:35 · 5254 阅读 · 0 评论 -
二分图最大匹配
题目场景:1号女生与1号男生相互认识,因此1号女和1号男可以坐在一起。1号女与2号男可以坐在一起,2号女认识2号和3号男,3号女认识1号男。请问如何安排座位才能让最多的人满意呢?像这样特殊的图叫做二分图(无向图)。二分图定义:如果一个图的所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好一个属于集合X,另一个属于集合Y,即每个集合内的顶点没有边相连,那么此图就是二分图。原创 2015-02-06 11:17:29 · 2242 阅读 · 0 评论 -
图的割点算法vs图的割边算法
图的割点在一个无向连通图中,如果删除某个顶点后,图不再连通(即任意两点之间不能相互到达),我们称这样的顶点为割点(或者称割顶)。上图中的2号顶点就是割点,因为删除2号后,4,5不通,1,6也不通。很容易想到的方法是:依次删除每一个顶点,然后用dfs或者bfs来检查图是否依然连通。如果删除某个顶点后,导致图不再连通,那么刚才删除的顶点就是割点。这种方法的时间复杂度是O原创 2015-02-05 17:19:34 · 10738 阅读 · 7 评论 -
图的最小生成树(二)—Prim算法
上一篇中写了图的最小生成树求法一——Kruskal算法 http://blog.csdn.net/wtyvhreal/article/details/43526695这一篇中用另外一种方法来求解图的最小生成树,Prim算法。图中随便选一个顶点开始,看看这个顶点有哪些边,在它的边中找一条最短的。1号有1-2,1-3,其中1-2短,选择1-2.通过它把1和2连接在一起。接下来开始枚举1原创 2015-02-05 14:43:24 · 2854 阅读 · 0 评论 -
图的最小生成树(一)—Kruskal算法
求下图的最小生成树:数据给出如下:第一行有两个数,n表示n个城市,m表示m条道路,接下来的m行,每行三个数a,b,c表示城市a到城市b的路程c。现在需要解决的是,要求要最少的边让图连通(任意两点之间可以互相到达)。要想让n个顶点的图连通,那么至少需要n-1条边。其实这里就是求一个图的最小生成树。基本思路:首先按照边的权值进行从小到大排原创 2015-02-05 13:20:34 · 5740 阅读 · 0 评论 -
并查集—解密犯罪团伙
警察想查清楚有几个犯罪团伙,搜集到了一些线索:现在有10个强盗;1号强盗与2号强盗是同伙;3号强盗与4号强盗是同伙;5号强盗与2号强盗是同伙;4号强盗与6号强盗是同伙;2号强盗与6号强盗是同伙;8号强盗与7号强盗是同伙;9号强盗与7号强盗是同伙;1号强盗与6号强盗是同伙;2号强盗与4号强盗是同伙;强盗同伙的同伙也是同伙,请问一共有多少个独立的犯罪原创 2015-02-04 21:39:39 · 4638 阅读 · 1 评论 -
堆与堆排序—优先队列
上一节我们写了树以及二叉树的知识http://blog.csdn.net/wtyvhreal/article/details/43487095堆是一种特殊的完全二叉树。所有父节点都比子节点要小,这样的完全二叉树称为最小堆,反之叫最大堆。下图一棵完全二叉树,调整为最小堆步骤:向下调整的代码如下:从上面可以得到:调原创 2015-02-04 16:04:01 · 2178 阅读 · 0 评论 -
树和二叉树 浅析
树是不包含回路的连通无向图。左边是一棵树,右边的是一个图,因为左边的没有回路,而右边的存在1-2-5-3-1这样的回路。树特征:1.一棵树中的任意两个节点有且仅有唯一的一条路径连通;2.一棵树如果有n个节点,那么它一定恰好有n-1条边;3.在一棵树中加一条边将会构成一个回路。树是指任意两个节点间有且只有一条路径的无向图。只有是没有回路的连通无向图就是树。原创 2015-02-04 15:36:42 · 2471 阅读 · 0 评论