随笔分类 -  数据结构与算法

摘要:1 import java.util.Stack; 2 import java.util.HashMap; 3 4 public class BinTree { 5 private char date; 6 private BinTree lchild; 7 private BinTree rchild; 8 9 public BinTree(char c) { 10 date = c; 11 } 12 13 // 先序遍历递归 14 public static void preOrder(Bin... 阅读全文
posted @ 2013-11-05 20:48 曾先森在努力 阅读(507) 评论(0) 推荐(0)
摘要:二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { ... 阅读全文
posted @ 2013-11-05 20:45 曾先森在努力 阅读(488) 评论(0) 推荐(0)
摘要:作者: 阮一峰日期: 2013年5月 1日字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。1.首先,字符串 阅读全文
posted @ 2013-10-21 11:26 曾先森在努力 阅读(423) 评论(0) 推荐(0)
摘要:参考博文:http://blog.csdn.net/v_july_v/article/details/6897097第一部分、Trie树1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上 阅读全文
posted @ 2013-10-19 21:31 曾先森在努力 阅读(1692) 评论(0) 推荐(0)
摘要:我们现在说Recursive backtracking:迷宫的初始状态是墙壁都存在。选择一个开始区域。随机得选择一个没有访问过的邻接区域,并打通与它之间的墙壁。此邻接区域称为当前区域。如果所有周围的区域都是访问过的,则退回上一个区域进行挖据墙壁,一直重复。当开始的区域被退回的时候,算法结束。大家都知道,至于迷宫的求解问题,可以用穷举法进行求解。那么什么是穷举法了,就是将每一种可能的情况都穷举完。而具体到迷宫的求解问题上,由于在求解过程中可能会遇到某一路径不可行的情况,此时我们就必须按原路返回,这时自然也就会想到栈的应用了,因为栈的一个很重要的特性就是”先进后出”,可以用来记录每次所探索的路径, 阅读全文
posted @ 2013-10-17 08:25 曾先森在努力 阅读(1272) 评论(0) 推荐(0)
摘要:二分查找又称折半查找、二叉查找,它是一种效率较高的查找方法。前提给定一已排好序的n个元素a[0 : n-1],现要在这n个元素中找出一特定元素x。算法 思想首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大 于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 1 public class BinarySearch { 2 3 /*** 4 * 5 * @param a 已排... 阅读全文
posted @ 2013-09-22 14:57 曾先森在努力 阅读(275) 评论(0) 推荐(0)
摘要:1、快速找出一个数组中的最大数、第二大数。 思路:如果当前元素大于最大数 max,则让第二大数等于原来的最大数 max,再把当前元素的值赋给 max。如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值,则要把当前元素的值赋给 secondMax。[cpp] view plaincopyprint?voidGetSecondMaxNumber(int*arr,intn){inti,max,second_max;max=arr[0];second_max=0x80000000;for(i=1;imax){second_max=max;max=arr[i];}else{if( 阅读全文
posted @ 2013-05-15 10:06 曾先森在努力 阅读(557) 评论(0) 推荐(0)
摘要:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?(1) 方法一:(当N为比较大时警惕溢出)将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。 1 int Find(int* a) 2 3 { 4 5 int i; 6 7 for (i = 0;i<=1000;i++) 8 9 a[1000] += a[i]; 10 11 a[100... 阅读全文
posted @ 2013-04-24 19:50 曾先森在努力 阅读(1302) 评论(0) 推荐(0)
摘要:引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的。但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了。 其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重新查找一遍,这样系统的反应能力会有很大提高。但是,当我们读取的个数特别大的时候,我们不可能把所有已经读取的数据都放在缓存里,毕竟内 阅读全文
posted @ 2013-04-23 20:26 曾先森在努力 阅读(620) 评论(0) 推荐(0)
摘要:如何设计一个LRU Cache?Google和百度的面试题都出现了设计一个Cache的题目,什么是Cache,如何设计简单的Cache,通过搜集资料,本文给出个总结。通常的问题描述可以是这样:Question:[1] Design a layer in front of a system which cache the last n requests and the responses to them from the system.在一个系统之上设计一个Cache,缓存最近的n个请求以及系统的响应。what data structure would you use to implement 阅读全文
posted @ 2013-04-23 15:25 曾先森在努力 阅读(288) 评论(0) 推荐(0)
摘要:[来源]:腾讯2013实习生笔试 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等)解析:设b[0]=1由b[i]=b[i-1]*a[i-1]可得b[1] = a[0]b[2] = a[0]a[1]…b[i] = a[0]a[1]a[2]…a[i-1]…b[n-1] = a[0]a[1]…a[n-2]那么再通过b[0]这个变量来迭代出1, a[n-1], a[n-2 阅读全文
posted @ 2013-04-20 14:28 曾先森在努力 阅读(595) 评论(0) 推荐(0)
摘要:如何准备:Whether you are asked to implement a simple stack / queue, or you are asked to implementa modified version of one, you will have a big leg up on other candidates if you can flawlessly work with stacks and queues Practice makes perfect! Here is some skeleton code for a Stackand Queue class当面试官需要 阅读全文
posted @ 2013-04-12 15:39 曾先森在努力 阅读(967) 评论(0) 推荐(0)
摘要:如何准备Linked list questions are extremely common These can range from simple (delete a node ina linked list) to much more challenging Either way, we advise you to be extremely comfortable with the easiest questions Being able to easily manipulate a linked list in the simplestways will make the tougher 阅读全文
posted @ 2013-04-12 15:37 曾先森在努力 阅读(231) 评论(0) 推荐(0)
摘要:如何准备:Bit manipulation can be a scary thing to many candidates, but it doesn’t need to be! If you’re shaky on bit manipulation, we recommend doing a couple of arithmetic-like problems to boost your skills Compute the following by hand: 1010 - 0001 1010 + 0110 1100^1010 1010 << 1 1001^1001 1001 阅读全文
posted @ 2013-04-12 15:09 曾先森在努力 阅读(284) 评论(0) 推荐(0)
摘要:如何理解递归,写出正确的递归程序,我觉得有几个关键点:1.要从整体把握问题递归的难点在于人脑并不适合去跟踪递归中自己调用自己的这个过程,这是因为人脑中不像计算机一样有一个可以记忆的堆栈,但是不同的是人是会归纳的,而计算机只知道调用-返回。因此,理解和设计递归,一定要从整体把握,数学归纳法和递归是一个对称的关系,数学归纳法不断的扩展自己,递归则是不断的分解自己。递归中的递就是把主问题分解成子问题,归就是利用子问题的解逐步向上求解的过程了。关键点是要善用数学归纳法里面的假设,就是假设子问题已经求解了,它得到的结果是什么,一旦这么想就是在从整体上把握问题,不必再去纠结细节。设计一个递归函数的时候,首 阅读全文
posted @ 2013-04-10 16:13 曾先森在努力 阅读(1883) 评论(0) 推荐(1)
摘要:欢迎自荐和推荐链接。算法优秀博客推荐:各种数据结构与算法知识入门经典(不断更新)基本算法 贪心算法:贪心算法作者:独酌逸醉 贪心算法精讲作者:3522021224 递归和分治:递归与分治策略作者:zhoudaxia图论 图的遍历(DFS和BFS):图的遍历 作者:jefferent 最小生成树(Prim算法和Kruskal算法):贪心算法--最小生成树作者:独酌逸醉 Dijkstra算法:最短路径之Dijkstra算法详细讲解作者:绿岩 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)作者:tankywoo Bellman-Ford算法:... 阅读全文
posted @ 2012-12-21 16:35 曾先森在努力 阅读(266) 评论(0) 推荐(0)
摘要:(可参考 http://c.chinaitlab.com/special/algorithm/Index.html)五大常用算法之一:分治算法分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。 阅读全文
posted @ 2012-12-01 15:32 曾先森在努力 阅读(374) 评论(0) 推荐(0)
摘要:1. 引言 哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。 哈希表又叫做散列表,分为“开散列” 和“闭散列”。考虑到竞赛时多数人通常避免使用动态存储结构,本文中的“哈希表”仅指“闭散列”,关于其他方面读者可参阅其他书籍。 2. 基础操作 2.1 基本原理 我们使用一个下标范围比较大的数组来存储元素。可... 阅读全文
posted @ 2012-11-07 21:44 曾先森在努力 阅读(223) 评论(0) 推荐(0)
摘要:一.Floyd算法假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。 1 /*每对顶点之间最短路径Floyd 2011.8.27*/ 2 3 #include <iostream> 阅读全文
posted @ 2012-10-23 20:50 曾先森在努力 阅读(199) 评论(0) 推荐(0)
摘要:Dijkstra算法的核心思想是贪心策略+动态规划算法流程:在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在dis[]初始化:源的距离dis[s]设为0,其他的点距离设为无穷大(实际程序里设成-1了),同时把所有的点的状态设为没有扩展过。循环n-1次:在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩展。对于每个与u相邻的点v,执行Relax(u,v),也就是说,如果dis[u]+map[u,v]<dis[v],那么把dis[v]更新成更短的距离dis[u]+w[u,v]。此时到点v的最短路径上,前一个节点即为u。结束。此时对于任意的u,dis[u]就是s到u 阅读全文
posted @ 2012-10-23 20:44 曾先森在努力 阅读(343) 评论(0) 推荐(0)