数据结构与算法
文章平均质量分 70
Java2King
淘宝。。。。数据平台
展开
-
URL散列算法-ELF Hash法
//ELFhash函数unsigned int ELFHash( char * str) { unsigned int hash = 0 ; unsigned int x = 0 ; while ( * str) { hash = (hash 4 ) + ( * str ++ ); // hash值左移4位加上一个字符 if ((x = hash & 0xF0000000L )原创 2009-07-30 13:02:00 · 4459 阅读 · 2 评论 -
双数组trie树基本构造及简单优化
Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实 现。它本质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在词典中这此状态包括"词前缀","已成词"等。双数组Trie(Double-Array Trie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一转载 2009-12-24 16:36:00 · 1115 阅读 · 0 评论 -
A*算法详解
第一部分:A*算法简介 A*算法在人工智能中是一种典型的启发式搜索算法。 一、何谓启发式搜索算法: 在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从 初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从 求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程转载 2009-12-24 17:18:00 · 1375 阅读 · 0 评论 -
Trie树|字典树的简介及实现
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.其基本性质可以归纳为:1. 根节点不包含字符,除根节点外每一个节点都只包含一转载 2009-12-24 17:05:00 · 1439 阅读 · 1 评论 -
R树介绍及其发展历程
R-Tree空间索引算法的研究历程和最新进展分析收藏摘要:本文介绍了空间索引的概念、R-Tree数据结构和R-Tree空间索引的算法描述,并从R-Tree索引技术的优缺点对R-Tree的改进结构——变种R-Tree进行了论述。最后,对R-Tree的最新研究进展进行了分析。 关键词:空间索引技术;R-Tree;研究历程;最新进展当前数据搜索的一个关键问题是速度。提高速度的核心技术是空间索转载 2009-12-27 14:06:00 · 1262 阅读 · 0 评论 -
数据结构笔试题目总汇
第一篇 笔试题目 Intel今年笔试题 ●第一道是一个编译器优化的题目。条件大致说在ZF为0或者不为0的情况下,分别有两条移位指令可以移进去。然后出了两个小题,要你优化。 ●第二道是N个人围成一圈报数,报到某一个数的就出局,问你最后剩下来的那个人的号码。编程题。 ●第三道大致如下: 以下两个程序哪个的performance高,并解释为什么。 a) extern int foo(void); int转载 2009-12-30 22:28:00 · 1665 阅读 · 1 评论 -
浙大一位同学的中文分词算法
1.1.1 最大匹配法分词的缺陷尽管最大匹配法分词是常用的解决的方案,但是无疑它存在很多明显的缺陷,这些缺陷也限制了最大匹配法在大型搜索系统中的使用频率。最大匹配法的问题有以下几点:一、长度限制由于最大匹配法必须首先设定一个匹配词长的初始值,这个长度限制是最大匹配法在效率与词长之间的一种妥协。我们来看一下以下两种情况:(1)词长过短,长词就会被切错。例如当词长被设成5时,也就意味着转载 2010-01-04 20:06:00 · 1673 阅读 · 0 评论 -
KMP算法
如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回 答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="Im matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你转载 2010-01-05 18:57:00 · 925 阅读 · 0 评论 -
多路归并排序【JAVA实现】
对远远大于内存的数据进行外排序,在多路比较的时候用败者树效率会更高。这个算法可以在建立倒排索引的时候使用 package my.sort;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedWriter;import j原创 2010-01-07 17:40:00 · 5146 阅读 · 1 评论 -
基于朴素贝叶斯分类器的文本分类算法(上)
转载请保留作者信息:作者:phinecos(洞庭散人)Blog:http://phinecos.cnblogs.com/Email:[email protected] Preface 本文缘起于最近在读的一本书-- Tom M.Mitchell的《机器学习》,书中第6章详细讲解了贝叶斯学习的理论知识,为了将其应用到实际中来,参考了网上许多资料,从而得此文。文章将分为两转载 2010-01-08 10:04:00 · 1700 阅读 · 1 评论 -
基于朴素贝叶斯分类器的文本分类算法(下)
源代码下载:NaviveBayesClassify.rar Preface文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇blog《基于K-Means的文本聚类算法》,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得。在本文的上半部分《基于朴素贝叶斯分类器的文本分类算法(上)》一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文转载 2010-01-08 10:06:00 · 2092 阅读 · 0 评论 -
已知二叉树的先序和中序求后序遍历
二叉树的遍历算法在其他树操作的基础已知先序和中序求二叉树的后序遍历算法核心是1、从先序遍历中读入根节点2、从中序遍历中找到与根节点相等的元素,以此节点将中序序列分成两个部分,左边的为二叉树的 左子树,右边为二叉树的右子树;3、递归调用上述步骤得到根节点的左右子树#include#include#includetypedef struct node{ ch原创 2010-05-06 19:34:00 · 1914 阅读 · 1 评论 -
hashtable和hashmap的区别
<br /> <br />1.最明显的区别在于Hashtable 是同步的(每个方法都是synchronized),而HashMap则不是.<br /> <br />2.HashMap继承至AbstractMap,Hashtable继承至Dictionary ,前者为Map的骨干, 其内部已经实现了Map所需要做的大部分工作, 它的子类只需要实现它的少量方法即可具有Map的多项特性。而后者内部都为抽象方法,需要它的实现类一一作自己的实现,且该类已过时<br /> <br />3.HashMap允许将null原创 2010-07-01 19:08:00 · 1108 阅读 · 0 评论 -
用邻接表表示图【java实现】
自己用java写了个图数据结构的简单实现,可以设置有向图和无向图。该类还实现了迭代方法,广度优先和深度优先源代码:package my.graph;import java.util.ArrayList;import java.util.Iterator;import my.queue.*;import my.stack.StackX;/** * 邻接表表示 * @author xiayi * */public class Graph { private int M原创 2010-06-21 11:38:00 · 12500 阅读 · 9 评论 -
CONSISTENT HASHING算法实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务。 常用的算法是对hash结果取余数 (hash() mod N):对机器编号从0到N-1转载 2010-08-13 16:15:00 · 1083 阅读 · 0 评论 -
阿里巴巴技术部面试题——经典智力问题收集
技术部面试题——经典智力问题收集 ——鉴于很多题目大家都做过,如果可以把思维的过程写出来,也是一次很好锻炼。我们公司技术部的面试题,当时挂在这上面了,没答出来。 我一直在想,这些问题是属于什么问题,数学问题?物理问题?还是语文问题?第一部分题目开始:1、有两根不均匀分布的香,香烧完的时间是一个小时,你能用什么方法来确定一段15分钟的时间?2、一个经理有三个女儿,三个女儿的年龄加起来等于13,三个女儿的年龄乘起来等于经理自己的年龄,有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有原创 2010-09-26 10:22:00 · 14707 阅读 · 3 评论 -
Paxos算法
<br /><br />Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。[1] 这个算法被认为是类似算法中最有效的。<br />Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个「转载 2010-11-11 10:11:00 · 2708 阅读 · 0 评论 -
逆波兰表达式算法实现
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。 逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+* 它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下: 如果当前字符为变量或者为数字,则压栈,如果是运算符原创 2009-12-10 21:58:00 · 1474 阅读 · 0 评论 -
Warshall算法JAVA实现
Warshall算法JAVA实现package graph;class Vertex { public char label; // ------------------------------------------------------------- public Vertex(char lab) // constructor { label = la原创 2009-12-11 21:58:00 · 1850 阅读 · 1 评论 -
计算0到N中包含数字1的个数
有这样一个函数f(n),对于任意正整数n,它表示从 0 到 n 之间出现“1”的个数,比如 f(1) = 1, f(13) = 6,请列出从 1 到 1234567890 中所有的 f(n) = n 的n, 要求准确快速. 相信很多人都能立刻得出以下的解法: for(n:N) { 判断n包含1的个数; 累加计数器; }这是最原创 2009-07-12 09:35:00 · 1585 阅读 · 3 评论 -
S先生与P先生谜题
美国斯坦福大学的麦卡锡提出的 设有两个自然数X、Y,2 S:我确信你不知道这两个数是什么,但我也不知道。 P: 一听你说这句话,我就知道这两个数是什么了。 S: 我也是,现在我也知道了。 现在你能通过他们的会话推断出这两个数是什么吗?(当然,S和P先生都是非常聪明的) 方法一: 我把思路说一下吧 1.s先生自己不知道x,y 说明和数s不是4,5转载 2009-09-26 12:27:00 · 1691 阅读 · 0 评论 -
k-means聚类算法的【java描述】
1. 什么是 k-means 聚类算法? 从网上找到了很多定义,这里选取比较典型的几个; K-Mean 分群法是一种分割式分群方法,其主要目标是要在大量高纬的资料点中找出 具有代表性的资料点;这些资料点可以称为群中心,代表点;然后再根据这些 群中心,进行后续的处理,这些处理可以包含 1 )资料压缩:以少数的资料点来代表大量的资料转载 2009-09-27 13:57:00 · 1327 阅读 · 0 评论 -
如何判断链表中有环
前提是不能使用标记符号 struct node { char val; node* next;} bool check(const node* head) {} //return false : 无环;true: 有环一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):bool check(const node*原创 2009-09-27 14:18:00 · 1040 阅读 · 0 评论 -
如何判断一个有向图中是否含有环路?
拓扑排序 (1)在有向图中选一个没有前驱的顶点且输出之 (2)从图中删除该顶点和所有以它为尾的弧。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止,后一种情况则说明有向图中存在环。 可采用邻接表作为有向图的存储结构。具体算法如下: int TopoSort(ALGraph G) {转载 2009-09-27 14:48:00 · 3192 阅读 · 0 评论 -
Google Hilltop算法
一、Hilltop算法的由来Hilltop算法同PageRank算法同样是搜索引擎结果排序的一项专利。PageRank页面级别系统单纯根据网页上的外部链接站点的数量,质量及页面等级决定该网页的“重要性”,但却忽略了链接页面对查询条件的主题相关性,导致一些网页即使主题与该查询条件并无关系,但也由于偶而提及该查询关键词而在搜索结果中得到很好的排名。从而影响了搜索结果的相关性与精准性。 早在20转载 2009-09-30 21:26:00 · 1223 阅读 · 0 评论 -
基于Bloom-Filter算法的URL过滤器的实现[避免重复抓取]
一、 Bloom-Filter算法简介。Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中,其优点是空间效率和查询时间都远远超过其他算法,其不足在于Bloom-Filter存在着误判。二、 Bloom-Filter的基本思想。Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。计算某元素x是否在一个集合中转载 2009-10-18 14:36:00 · 2688 阅读 · 0 评论 -
Hash算法大全
Hash算法有很多很多种类。具体的可以参考之前我写的Hash算法的一些分析。本处给大家提供一个集合了很多使用的Hash算法的类,应该可以满足不少人的需要的: Java代码 /** * Hash算法大全 * 推荐使用FNV1算法 * @algorithm None * @author Goodzzp 2006-11-20 * @lastEdi转载 2009-10-25 11:05:00 · 2441 阅读 · 1 评论 -
模拟退火算法
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目转载 2010-01-24 20:20:00 · 1321 阅读 · 0 评论 -
数据结构 B-树 源代码 IntBalancedSet.java
R-Bayer和M.McCreight 于1972年提出B-树中节点的元素个数由一个MINIMUM的正整数决定 B-树规则1:节点至少包含MINIMUM个元素.根节点不受此限制B-树规则2: 节点至多可以包含的元素个数为2*MIMNIMUMB-树规则3:B-树中每个节点的元素按从小到大的顺序存放在数组中,数组可以没有存满B-树规则4:非叶子节点的子树数目比原创 2009-11-26 21:27:00 · 1912 阅读 · 0 评论 -
智能算法的通俗解释(转载)
在工程实践中,经常会接触到一些比较“新颖”的算法或理论,比如模拟退火,遗传算法,禁忌搜索,神经网络等。这些算法或理论都有一些共同的特性(比如模拟自然过程),通称为“智能算法”。它们在解决一些复杂的工程问题时大有用武之地。 这些算法都有什么含义?首先给出个局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻: 为了找出地球上最高的山,一群有志气的兔子们开始想办法。 1.兔原创 2010-01-25 16:10:00 · 1604 阅读 · 0 评论 -
KMP字符串模式匹配详解
个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊:原创 2010-01-30 22:10:00 · 1049 阅读 · 0 评论 -
字符串匹配的Sunday算法--性能上超过KMP和BM算法
第一次听到Sunday算法,是大饼饼说的。在他图文并茂的解释中,我发现这个算法果然是一个又容易理解,效率又强过kmp和BM的算法。Sunday的移动次数更少! 于是试着写了一个,果真是好东东,分享一下。转一些概念先:Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行原创 2010-01-30 22:32:00 · 3656 阅读 · 1 评论 -
2-3-4树的分裂核心代码【JAVA实现】
2-3-4树节点分裂分两种情况。1:节点分裂;2:根的分裂。先要分裂的数据项设为A,B,C节点分裂1.创建一个新的空节点。它是要分裂节点的兄弟,在要分裂节点的右边。2.数据项C转移到新节点上。3.数据项B转移到要分裂节点的父节点上。4.数据项A保留在原来的节点上。5.最右边的两个子节点从要分裂节点处断开,连接到新节点上。根的分裂1.创建新的节点,作为根。原创 2009-12-06 15:59:00 · 1841 阅读 · 0 评论 -
外部排序算法【java实现】
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;im原创 2009-12-09 16:06:00 · 3950 阅读 · 0 评论 -
2-3-4树和红黑树的转变方法
2-3-4树和红黑树看上去可能完全不不一样。但是,在某种意义上两者又是完全相同的。 有一个数据项和两个子节点的叫做2-节点有二个数据项和三个子节点的叫做3-节点有三个数据项和四个子节点的叫做4-节点 2-3-4树转换红黑树的规则1. 2-3-4树中每个2-节点转化成红黑树的黑色节点。2. 3-节点转化成一个子节点和一个父节点。子节点有两个自己的子节点。父节点有另一个原创 2009-12-09 16:10:00 · 2027 阅读 · 0 评论 -
1GB 的4字节整数,内存排序时间为多少?
<br /> 拿到这个问题,我们往往会计算CPU运算次数,如快排的运算次数为1.4 * N * log(N),其中1.4为快排的系数,再根据CPU的运算频率计算出排序耗时。不过这种方法很土也不是很准,Jeff Dean告诉我们可以这样估算:排序时间 = 比较时间(分支预测错误) + 内存访问时间。快排过程中会发生大量的分支预测错误,所以比较次数为2^28 * log (2^28) ≈ 2^33,其中约1/2的比较会发生分支预测错误,所以比较时间为1/2 * 2 ^ 32 * 5ns = 21s,另原创 2010-11-11 09:59:00 · 3601 阅读 · 0 评论