算法和数据结构学习
文章平均质量分 68
码农SW
这个作者很懒,什么都没留下…
展开
-
simhash算法的原理-用于实现文本判重复算法
<br /><br />第一次听说google的simhash算法[1]时,我感到很神奇。传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义上来说,要设计一个hash算法,对相似的内容产生的签名也相近,是更为艰难的任务,因为它的签名值除了提供原始内容是否相等的信转载 2010-11-08 11:12:00 · 1851 阅读 · 0 评论 -
suggestTree-实现rank-ordered autocomplete suggestions的数据结构
通过该数据结构可以实现:当用户输入一个字符串,返回以这个字符串为前缀的排名最靠前的k个字符串。和现在搜索引擎提供的关键词提示功能一样。该数据结构以Ternary Search Tree(TST)为基础实现的。关于Ternary Search Tree是什么,可以参看前面的博文http://blog.csdn.net/suwei19870312/article/details/74675原创 2012-04-21 21:58:19 · 1986 阅读 · 0 评论 -
suggestTree C++版本及测试
// suggestTree.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "sugggestTree.h"#include #include #include using namespace std;int main(){原创 2012-04-21 22:06:02 · 568 阅读 · 0 评论 -
Ternary Search Trees 三分搜索树
这几天在研究suggest tree, suggest tree是以Ternary Search Tree为基础,所以先转一个3分搜索树博客。转自: http://chenzongzhi.info/?p=173英文原版:http://drdobbs.com/database/184410528?pgno=1经常碰到要存一堆的string, 这个时候可以用hash tables, 虽然h转载 2012-04-16 22:07:08 · 6827 阅读 · 0 评论 -
错排问题的递推解决
也谈“装错信封问题”广东省江门一中 王 旭( 529000 )颜书先生《“装错信封问题”的数学模型与求解》一文(见《数学通报》 2000 年第 6 期 p.35 ),给出了该经典问题的一个模型和求解公式:编号为 1 , 2 ,……, n 的 n 个元素排成一列,若每个元素所处位置的序号都与它的编号不同,则称这个排列为 n 个不同元素的一个错排。记 n 个不同元素的错排总数为 f(n转载 2010-08-15 09:24:00 · 848 阅读 · 0 评论 -
计算直线的交点数
Problem Description平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。Input输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(nOutput每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。Sam转载 2010-08-15 09:34:00 · 763 阅读 · 0 评论 -
动态hash之linear Hash的实现和性能比较
linear hash 一,在介绍linear hash 之前,需要对动态hash和静态hash这两个概念做一下解释: 静态hash:是指在hashtable初始化得时候bucket的数目就已经确定了,当需要插入一个元素的时候,通过hash函数找到对应的bucket number,之后插入即可。不论用什么冲突解决方法,当插入的元素越来越多时,在这个hash表中查找元素的效率会变的越原创 2011-07-31 20:22:59 · 5666 阅读 · 0 评论 -
扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值)
问题描述:扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。问题分析:拿到这道题,我们最先的思考往往是,设计一个算法从栈中拿到最小值,所以开始考虑任何可以用来实现该功能的排序和查找算法。假设栈中有n个元素,一切排序和查找都不可能实现O(1)的时间复杂度找到最小值。再看题目,既然是扩展sta转载 2012-07-18 22:40:12 · 2046 阅读 · 0 评论 -
概率论基础知识-条件概率,乘法公式,全概率公式和贝叶斯公式
(好像越来越笨了,概率的问题都不记得了,现在记录下来,希望对以后有所帮助。)1.条件概率定义 设A, B是两个事件,且P(A)>0 称P(B∣A)=P(AB)/P(A)为在条件A下发生的条件事件B发生的条件概率。2.乘法公式设P(A)>0 则有P(AB)=P(B∣A)P(A) 3. 全概率公式和贝叶斯公式定义 设S为试验E的样本空间,B1, B2, …Bn为转载 2010-03-17 21:14:00 · 5430 阅读 · 0 评论 -
Efficient auto-complete with a ternary search tree
Over the past couple of years, auto-complete has popped up all over the web. Facebook, YouTube, Google, Bing, MSDN, LinkedIn and lots of other websites all try to complete your phrase as soon as you s转载 2012-04-18 18:03:44 · 1112 阅读 · 0 评论 -
trie(字典树)的双数组实现
trie的双数组实现是为了减少空间复杂度。http://www.cnblogs.com/cuberub/archive/2012/03/24/2416195.htmlhttp://hi.baidu.com/%CF%B5%B4%C7%CF%C2%B4%CE/blog/item/3ae945d5368db9c5572c84e8.htmlhttp://linux.thai.net/~原创 2012-04-17 15:07:18 · 3743 阅读 · 0 评论 -
一个简单的simhash算法
<br />simhash是个很常用的计算文本相似度的算法,网上一般说用64bit的签名,这里采用times33作为普通hash函数,用32bit的签名,算法如下:<br />#!/usr/bin/env perl#sub hash { my ($input) = @_; my @chars = split "", $input; my $hash = 5381; foreach(@chars){ $hash = $hash + ord($_转载 2010-11-08 11:13:00 · 2126 阅读 · 0 评论 -
最强的排序算法是sleep sort
最强的排序算法是sleep sort,他的时间复杂度O(n),空间复杂度 0!!!!! 时间复杂度完爆了快排,空间复杂度完爆了hash,并且还是稳定排序!逆天了逆天了 没代码我说个jb: #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & sh转载 2011-06-18 13:25:00 · 4266 阅读 · 1 评论 -
在GCC和Visual Studio中使用hash_map
熟悉STL或熟悉ACM/ICPC的话,其中的set, map, multiset, multimap一定用过无数次了,它们都是用平衡二叉树(红黑树)实现的,复杂度为O(lgn)。我们也知道set, map可以通过哈希来实现,复杂度只有O(1),可惜直到现在,unsorted_se转载 2011-08-05 21:57:44 · 1100 阅读 · 0 评论 -
牛人写得一些算法和数据结构
http://www.keithschwarz.com/interesting/原创 2011-12-03 20:30:20 · 791 阅读 · 0 评论 -
一个关于各种排序算法的网站
模拟动画很形象,还有对应的代码和性能分析。 http://www.sorting-algorithms.com/原创 2011-12-07 15:26:09 · 1125 阅读 · 0 评论 -
Cuckoo Hash 基本思想和代码实现
Cuckoo Hash 是一种hash冲突解决方法, 其目的是即时使用简易的hash function 也能够实现hash key的均匀分布。基本思想是使用2个hash函数来处理碰撞,从而每个key都对应到2个位置。插入操作如下:1. 对key值hash,生成两个hash key值,hashk1和 hashk2, 如果对应的两个位置上有一个为空,那么直接把key插入即可。2. 否则原创 2012-04-09 21:43:33 · 18243 阅读 · 7 评论 -
Ternary Search Trees 三分搜索树-源码
#include #include #include #include using namespace std;class TernarySearchTree{private: struct tnode { char s; tnode *lkid, *mkid, * rkid; bool mbEnd; tnode(char is) { s = i原创 2012-04-16 22:16:28 · 1179 阅读 · 0 评论 -
跳表(skip list)
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前转载 2012-10-22 16:52:43 · 973 阅读 · 0 评论 -
杨氏矩阵搜索算法
问题:已知一个2维矩阵,其中的元素每一行从左至右依次增加,每一列从上到下依次增加。即对于矩阵Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我们也称这样的矩阵为杨氏矩阵。给出判定某个数是否存在该矩阵中的高效算法。 分析:为了便于复杂度分析,我们暂时假定该矩阵为大小n*n。如下图所示为一个杨氏矩阵。转载 2013-05-21 09:53:52 · 847 阅读 · 0 评论 -
全排列算法原理和实现
转自:http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1191914.html全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列转载 2013-05-08 02:01:01 · 752 阅读 · 0 评论 -
STL算法之 next_permutation、prev_permutation 的原理和实现
两个函数类似,重点介绍next_permutation.template bool next_permutation (BidirectionalIterator first, BidirectionalIterator last ); template bool next_permutatio转载 2013-10-15 11:27:10 · 2100 阅读 · 0 评论 -
求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
前言:做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法. 经过总结, 本人觉得这些问题都可以使用一个通用的K sum求和问题加以概括消化, 这里我们先直接给出K Sum的问题描述和算法(递归解法), 然后将这个一般性的方法套用到具体的K, 比如leet转载 2013-10-18 18:13:10 · 1252 阅读 · 0 评论 -
leetcode之 median of two sorted arrays
这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉。后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下。 首先对leetcod转载 2013-11-10 11:58:10 · 780 阅读 · 0 评论 -
Mahout的taste里的几种相似度计算方法
欧几里德相似度(Euclidean Distance)最初用于计算欧几里德空间中两个点的距离,以两个用户x和y为例子,看成是n维空间的两个向量x和y, xi表示用户x对itemi的喜好值,yi表示用户y对itemi的喜好值,他们之前的欧几里德距离是 对应的欧几里德相似度,一般采用以下公式进行转换:距离越小 ,相似度越大 在taste里,计算user之间转载 2013-12-16 16:27:26 · 6643 阅读 · 0 评论 -
海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相似度、最长公共子串、编辑距离等。这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重。最简单的做法是拿着待比较的文本转载 2013-12-16 16:40:03 · 3174 阅读 · 0 评论 -
一致性hash算法 - consistent hashing
一致性 hash 算法( consistent hashing )张亮consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N转载 2014-02-18 14:36:28 · 1027 阅读 · 0 评论 -
找出有环链表中环的起点
给定一个有环的链表,写一个算法,找出环的起点。例如:输入:A->B->C->D->E->C[与前面的C是同一个节点]输出:C判断一个链表是否存在环有一个简单的方法,就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和2的指转载 2014-03-19 22:27:27 · 1334 阅读 · 0 评论 -
[珠玑之椟]随机数函数取样与概率
[珠玑之椟]随机数函数取样与概率 本节主要受到《编程珠玑》第12章随机取样问题的启发,但不仅仅限于随机取样问题,进一步地,研究讨论了一些在笔试面试中常见的和随机函数以及概率相关的问题。 阅读本文所需的知识: 1.对C语言中或其他语言中等价的rand()、srand()有所了解。本文不讨论种子的设定和伪随机数的问题; 2.中学或以上水平的概率基本概念。转载 2013-09-02 12:59:33 · 1349 阅读 · 0 评论 -
LeetCode-Valid Number - 有限状态机
判断合法数字,之前好像在哪里看到过这题,记得当时还写了好久,反正各种改,今天看到了大神的解法(https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp),用有限状态机,非常简洁,不需要复杂的各种判断!先枚举一下各种合法的输入情况:1.空格+ 数字 +空格2.空格+ 点 + 数字转载 2013-09-27 14:50:47 · 7686 阅读 · 5 评论 -
[leetCode]Search in Rotated Sorted Array
问题1:Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).You are given a target value to search. If found in the arr原创 2013-10-10 16:37:41 · 806 阅读 · 0 评论 -
shuffling(洗牌)
Shuffling is a procedure used to randomize a deck of playing cards to provide an element of chance in card games. —wikipedia 1.如何洗牌?我们玩扑克牌时洗牌可以使用Riffle方法,可以参考http://www.youtube.com/watch?v转载 2013-05-26 23:05:21 · 1379 阅读 · 0 评论 -
实现加法:不使用加减乘除运算
转自:http://sllovewsy149.blog.163.com/blog/static/108734178201245114626125/参考: http://blog.csdn.net/morewindows/article/details/8710737Q:写一个算法,将两个数相加,但是不使用加法(+)和其他的算术运算A:首先考虑下我们是如何对两个十进制数做加法转载 2013-05-26 22:18:17 · 837 阅读 · 0 评论 -
geohash:用字符串实现附近地点搜索
上回说到了用经纬度范围实现附近地点搜索。 一些小型应用中这样做没问题,但在大型应用中它有个显著的缺点:速度慢。慢的原因有两个, 第一是范围比较的索引利用率并不高,第二是SQL语句极其不稳定(不同的当前位置会产生完全不同的SQL查询),很难缓存。可以考虑使用geohash算法。geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串。比如,北海公园的编码是wx4g0ec1。转载 2013-07-08 02:31:34 · 4742 阅读 · 0 评论 -
硬币选择问题-动态规划
最少硬币问题假设有3种不同的硬币,币值分别是CoinValue[] = {1, 2, 5},每一种硬币的数量是有限的,分别是CoinNum[] = {3, 3, 3},给定一个数值target=18,找出一种硬币数最少的方法, 输出最少的硬币数。思路: 动态规划。问题定义: dp[n][m] 表示当目标值为n,有m种硬币可选的时候的最少硬币数,那么对于问题来说,dp[18][3原创 2013-07-11 03:17:54 · 8811 阅读 · 1 评论 -
最大滑动窗口
参考:http://blog.csdn.net/ssjhust123/article/details/7967489http://codercareer.blogspot.com/2012/02/no-33-maximums-in-sliding-windows.htmlhttp://leetcode.com/2011/01/sliding-window-maximum.html转载 2013-07-11 05:37:18 · 4690 阅读 · 0 评论 -
如何测试洗牌程序
我希望本文有助于你了解测试软件是一件很重要也是一件不简单的事。我们有一个程序,叫ShuffleArray(),是用来洗牌的,我见过N多千变万化的ShuffleArray(),但是似乎从来没人去想过怎么去测试这个算法。所以,我在面试中我经常会问应聘者如何测试ShuffleArray(),没想到这个问题居然难倒了很多有多年编程经验的人。对于这类的问题,其实,测试程序可能比算法更难写,代码更多。转载 2013-05-30 05:32:43 · 1120 阅读 · 0 评论 -
求平方根sqrt()函数的底层算法效率问题
转: http://www.nowamagic.net/algorithm/algorithm_EfficacyOfFunctionSqrt.php我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?虽然有可能你平时没有想过这个问题,不过正所转载 2013-06-28 03:40:30 · 3678 阅读 · 0 评论 -
[LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
Q:Given an unsorted integer array, find the first missing positive integer.For example,Given [1,2,0] return 3,and [3,4,-1,1] return 2.Your algorithm should run in O(n) time and uses co转载 2013-10-09 16:16:53 · 2727 阅读 · 0 评论 -
LRU cache的一个简单实现
用一个结构表示Key 和 Value:class LRUCacheNode{friend LRUCache;int mKey, mVal;LRUCacheNode* next;LRUCacheNode* pre;LRUCacheNode(int iK, int iV):mKey(iK), mVal(iV), next(NULL), pre(NULL){};};原创 2014-06-16 15:58:22 · 1140 阅读 · 0 评论