
数据结构和算法
expleeve
当我看到现在身边的人时,我在想,自己是不是该专注于某件事了
展开
-
如何判断链表是否有环?如何计算环的长度?
1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。为什么呢?需要一个简单的计算过程:(1)当转载 2016-06-23 12:56:19 · 684 阅读 · 0 评论 -
百度最新面试题
16、找出第k大的数字所在的位置。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。答案: 先找到第k大的数字,然后再遍历一遍数组找到它的位置。所以题目的难点在于如何最高效的找到第k大的数。 我们可以通过快速排序,堆排序等高效的排序算法对数组进行排序,然后找到第k大转载 2013-10-21 19:37:50 · 714 阅读 · 0 评论 -
排序算法(读书笔记)待续。。。
7月28日今天看了几个以前学过的排序,这里老生常谈了。 插入排序 基本思想:取一个数,插入到已排好序的数组中,从末尾比较,把比这个数大的数都往后移一位,比到前面的数比它小为止,把它放进被腾出的这个空位。这样反复插,知道没有数为止,就排好序了。 希尔排序 基本思想:先确定一个步长,比如数据总长度的一半,这样数组就被分成了2份,把前一半和后一半比(a[0]和a原创 2010-09-02 16:45:00 · 701 阅读 · 0 评论 -
海量数据处理面试题
1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000转载 2012-04-11 10:22:52 · 771 阅读 · 0 评论 -
Spider的URL检索算法
1. Rabin指纹算法性质查找树和hash浪费空间原创 2013-10-17 10:45:14 · 874 阅读 · 0 评论 -
非阻塞同步算法
Treiber 1986栈顶为一序列public class ConcurrentStack { AtomicReference> top = new AtomicReference>(); public void push(E item){ Node newHead = new Node(item); Node oldHead = null; do{ o原创 2013-04-09 13:22:32 · 1031 阅读 · 0 评论 -
Sunday Search算法
基本思路是:首先,对ASCII的255个字符在一个字符数组中设置其出现的逆序位置,如A在ASCII中是65,如果一个子串是BBAC,则在字符数组中第64(65-1)的位置为,4-3=1;D未出现在子串中,字符数组第68个位置为-1。然后,对字符串匹配,如果成功则退出;如果不成功,则从字符数组中,获取当前子串长度在目标串的下一个位置上的字符,如果是-1,说明子串没有这个字符,直接跳过子串长度原创 2012-10-23 22:16:29 · 2414 阅读 · 0 评论 -
寻找满足条件的两个或多个数
第一节、寻找满足条件的两个数第14题(数组):题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:咱们试着一步一步解决这个问题(注意阐述中数列有序无序的区别):直接转载 2012-04-14 10:20:48 · 828 阅读 · 0 评论 -
Top K 算法
问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。必备知识:转载 2012-04-10 12:35:32 · 844 阅读 · 0 评论 -
Bloom Filter
一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场转载 2012-04-10 18:43:15 · 542 阅读 · 0 评论 -
小明和小强都是张老师的学生
小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日是下列10组中的一天, 张老师把M值告诉了小明,把N值告诉了小强, 张老师问他们知道他的生日是哪一天吗? 3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明说:如果我不知道的话,小强肯定也不知道 小强说:本来我也不知道,但是现在我知道了 小明说原创 2014-02-18 17:42:36 · 2058 阅读 · 0 评论 -
判断单链表是否存在环及求环入口点
算法描述:1、先判断是否有环设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)原创 2014-06-20 11:18:05 · 670 阅读 · 0 评论 -
前缀表达式、中缀表达式、后缀表达式
前缀表达式(波兰式)a+((b+c)*d)-e => -+a*+bcde 中缀表达式a+((b+c)*d)-e 后缀表达式(逆波兰式)a+((b+c)*d)-e => abc+d*+e- 前缀、中缀、后缀的转换过程方法一:可以将前缀和后缀都转换成中缀表达式树,再相互转换中缀表达式树使用链表较宜。* 前缀转中缀表达式树:对前缀字符串Str进行遍历,确定St原创 2011-12-31 20:04:00 · 5734 阅读 · 0 评论 -
hash join (Oracle里的哈希连接原理)
哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法。在Oracle 7.3之前,Oracle数据库中的常用表连接方法就只有排序合并连接和嵌套循环连接这两种,但这两种表连接方法都有其明显缺陷。对于排序合并连接,如果两个表在施加了目标SQL中指定的谓词条件(如果有的话)后得到的结果集很大且需要排序的话,则这种情况下的排序合并连接的执行效率一定是很差的转载 2015-09-25 17:00:28 · 5239 阅读 · 0 评论 -
K-mediods算法
K-mediods(K中心点)算法介绍一、K-mediods算法介绍a) 话说,聚类算法可以被分为那么几种,比如基于划分方法的、基于层次方法的、基于密度方法的、基于网格方法的、基于模型方法的;K-mediods算法就是基于划分方法的一种聚类算法,确切的说,是对K-means算法的一种改进算法。二、K-mediods算法优缺点a) K-mediods算法具有能够处理大型数据集,结果簇原创 2015-07-02 20:26:12 · 12831 阅读 · 2 评论 -
高斯-约当(Gauss-Jordan)消元法
选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵、解线性方程组(插一句:LM算法求解的一个步骤),等等。它的速度不是最快的,但是它非常稳定(来自网上的定义:一个计算方法,如果在使用此方法的计算过程中,舍入误差得到控制,对计算结果影响较小,称此方法为数值稳定的),同时它的求解过程也比较清晰明了,因而人们使用较多。下面我就用一个例子来告诉你Gauss-Jo转载 2015-06-26 10:37:16 · 24269 阅读 · 1 评论 -
P2P网络中DHT算法分析
结构化与非结构化P2P 依照节点信息存储与搜索方式的不同,诸多P2P协议可以分为2大类:结构化(Structured)的与非结构化(Unstructured)的系统。 非结构化P2P系统 在非结构化的系统中,每个节点存储自身的信息或信息的索引(如指针和IP地址)。当用户需要在P2P系统中获取信息时,他们预先并不知道这些信息(如某个文件)会在那个节点上存储。因此,在非结构化P2P系统中,转载 2015-01-09 15:22:57 · 2868 阅读 · 0 评论 -
Merkle Tree及其应用
Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkle Hash Tree,这是因为 它所构造的Merkle Tree的所有节点都是Hash值。Merkle Tree具有以下特点:转载 2014-11-06 11:32:16 · 9687 阅读 · 0 评论 -
最长递增子序列问题的求解(LIS)
最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明。 一, 最长递增子序列问题的描述 设L=a1,a2,…,an>是n个不同转载 2012-03-17 19:23:01 · 628 阅读 · 0 评论 -
给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n)
给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n).比如,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc。原创 2014-06-20 16:48:30 · 2748 阅读 · 0 评论 -
5.18 右移k位
5.18 试设计一个算法,将数组An中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n) void RSh(int A[n],int k)//把数组A的元素循环右移k位,只用一个辅助存储空间{ for(i=1;i<=k;i++) if(n%i==0&&k%i==0) p=i;//求n和k的最大公约数p for(原创 2012-01-11 21:30:45 · 1148 阅读 · 0 评论 -
最长子序列求和
一、子序列可以不相邻只需将所有大于0的元素挑出即可。二、子序列是相邻子序列动态规划a[j] = 0; if(j == 0)a[j] = a[j]; if(a[j-1] a[j] = a[j-1] + a[j]; if(a[j-1] > 0)遍历找出最大a[j]即可原创 2012-04-10 21:33:43 · 622 阅读 · 0 评论 -
概率相关的题目
1、一个随机数产生器以概率p生成0,以概率(1-p)生成1,怎样生成等概率的0和1?如果用这个随机数产生器产生两个位,出现00的概率为p^2,出现01的概率为p(1-p),出现10的概率为(1-p)p,出现11的概率为(1-p)^2。看到没有,出现01和10的概率相等。那么我们就可以用这个随机数生成器每次产生2位,直到产生的是01或者10,当为01时,输出0,当为10时输出1。问题扩展:还转载 2012-04-10 20:28:31 · 914 阅读 · 1 评论 -
蓄水池抽样的原理
问题起源于编程珠玑Column 12中的题目10,其描述如下:How could you select one of n objects at random, where you see the objects sequentially but you do not know the value of n beforehand? For concreteness, how would yo原创 2012-04-10 20:26:23 · 2804 阅读 · 0 评论 -
KMP算法
主串:"s1...sn"子串:"p1...pm""p1p2...p(k-1)" = "s(i-k+1)s(i-k+2)...s(i-1)" //上次比较了K个相同的字符"p(j-k+1)p(j-k+2)...p(j-1)" = "s(i-k+1)s(i-k+2)...s(i-1)" //这次比较了K个相同的字符"p1p2...p(k-1)" = "p(j-k+1)p(j-k+2原创 2012-01-02 20:13:31 · 785 阅读 · 0 评论 -
本串最长重复子串&最长公共子串
本串最长重复子串思路:将S中以每两个字符为开头的子串进行比较。Void Get_LRepSub(StringType S){ MaxLen = 0; Index1 = 0; Index2 = 0; For(i=1;i<=S.length;i++){ //此处,i为两字符的距离 For(k=0,j=1;j<=S.length-i;j++)原创 2012-01-09 12:57:17 · 605 阅读 · 0 评论 -
腾讯--编程珠玑--位图法
位图法是《编程珠玑》第一章中出现的磁盘排序算法。 题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复。求如何将这n个正整数升序排列。约束:最多有1MB的内存空间可用,有充足的磁盘存储空间。 分析:这个题目的最大亮点是只有转载 2011-10-10 11:28:47 · 2110 阅读 · 0 评论 -
阿里云--空间复杂度的限制
数列L中有n个整数,其中K个数字出现了两次,1个数字出现了一次,所以n=2k+1;请在使用O(1)空间的前提下,尽快找出只出现一次的那个数字,并说明算法的复杂度。既然是空间复杂度的限制所以 int res = 0;for( int i = 0; i < n;转载 2011-10-10 11:06:32 · 645 阅读 · 0 评论 -
全排列的实现
/* *用递归进行全排列 *思路是:比如a,b,c三个数进行全排列,a先拿出来,b、c进行全排列,b、c中b又先拿出来,c进行全排列,然后c拿出来,b进行全排列,依次类推。 */#includeint k=0;int count=0;//计算有多少种排列转载 2011-10-12 22:39:04 · 572 阅读 · 0 评论 -
用指针模拟队列
在面试阿里云时,考官问了这个一个问题:有一个完全二叉树,每个节点是一个TreeNode类型的节点,包括一个left指针和一个right指针,还有一个next指针,让我对树进行广度优先遍历,将next指针指向广度优先遍历的下一个节点。不让定义队列数据结构。我的思路中是使用队原创 2011-10-12 08:08:17 · 812 阅读 · 0 评论 -
海明码_小白鼠试药问题
题目是:我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分? 海明码(Hamming Code )编码的关键原创 2011-09-23 11:32:05 · 2841 阅读 · 6 评论 -
Triomino 拼图
Triomino 拼图:Triomino 是由棋盘上的三个邻接的方块组成L型的瓦片.我们的问题是如何用Triomino腐败一个缺少了一个方块(可以在棋盘的任意位置)的棋盘(2^n x 2^n) .除了这个确实的方块.Triomino 应该覆盖棋盘上所有其他的方块.而且不能有重叠.主要体现分治法的思想。当我们拿到一个 2^n x 2^n 的时候 我们应该先找出那个空格所在的区块(均分为4块. 必将落于一中. 没快为 2^(n-1) x 2^(n-1) A | B --|-- C转载 2011-05-17 23:58:00 · 2885 阅读 · 0 评论 -
题目收集:3000w数据的表,取某项字段前50项数据 ,内存2g
<br />偶然看到这个题,就想了一下怎么做,大体实现思路是这样子的,3000w的数据划分为1000段,也就是1-3w为一段,30001-6w项为第二段,依次类推,从每3w的数据中提取出前50条数据(这个根据sql排序就能取出来,2个g的内存够了),最后1000个50就会产生5w个数据,最后提取出来的5w的数据放置到ArrayList中去,最后5w的数据统一排序,取出前50条。5w*5w的对比与交换是可以搞定的。具体实现,等最近的项目完了 用多线程试试!~<br /> <br />来着JavaEye转载 2011-03-14 17:45:00 · 676 阅读 · 0 评论 -
从0到N(50000)的N个数字,抽掉其中两个数
题目:一个组数据从0到N(50000)的N个数字依次递增且不重复,现抽掉其中两个数,并把剩下的49998个数字打乱装入int A[]数组中。请在只遍历一次循环且最多只可用到5个变量,找出这2个抽出的数字。 简单答案: long a=0,b=0;for(int i=1;i{ a += i; b += (i*i); if(i { a -= A[i-1转载 2012-03-11 19:50:10 · 661 阅读 · 0 评论 -
最少硬币问题
硬币个数有限,要求用最少的硬币找钱。书上的一道练习题,感觉挺有趣的。假设各种硬币面值t[i](顺排),个数c[i],C[i][j]为用t[0]..t[i]面值的硬币找钱j的最少硬币个数则C[i][j] = min{k + C[i - 1][j – k * t[i]]}, 0 /*** 最少钱币问题,每种钱币有个数限制* * @author qj* */publi转载 2012-03-11 20:16:59 · 733 阅读 · 0 评论 -
验证图有无回路的一般思路
1、广度优先遍历:使用level作为标记,在广度优先遍历的过程中,如果出现level小于当前level的节点,即出现回路。2、深度优先遍历:使用visit标记当前深度遍历的各节点,如果遍历过程中出现visit已经标记,可以说明存在回路。3、使用拓扑排序:如果拓扑排序过程中,出现不存在入度为0的节点,同时节点未全部遍历的情况,则存在回路。当然对于图为无向连通图,可以直接计算m = n -原创 2012-01-27 09:53:42 · 1545 阅读 · 0 评论 -
寻找第K大的数的方法总结
今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家。 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 解法1: 我们转载 2012-04-10 17:17:34 · 670 阅读 · 0 评论 -
左旋转字符串
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 编程之美上有这样一个类似的问题,咱们先来看一下:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。转载 2012-04-11 11:13:44 · 804 阅读 · 1 评论 -
海量数据处理
海量数据处理心得:1、使用哈希函数和分治的方法将数据分割到不同文件中,如果文件过大可以继续细分。2、对每个文件进行外部排序或者哈希统计的方法对记录进行排序。3、通过直接排序、部分排序或者最大/小堆的方法进行统计。4、归并被分割的文件,生成目标数据。方法:Bitmap(位图法)、N-Bitmap、Bloom filter、快速排序、堆排序、哈希函数、归并排序、二分查找。转载 2012-04-10 18:07:56 · 445 阅读 · 0 评论 -
外部排序
一、多路归并排序1、将每一块内存能够容纳的数组进行内部排序,并存入外存中。2、使用败者树或者最小堆,对M路已经有序的数组进行归并。3、将归并后的结果存入外存。 二、置换-选择排序1、从外存FI读入w个记录到内存WA中。2、从内存WA中选择最小的记录为MINIMAX。3、写入外存FO。4、如果外存FI中记录不为空,写入WA中一个记录。5、从WA中所有比MINI原创 2012-04-10 12:15:15 · 560 阅读 · 0 评论