摘要:
1 概述链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性能问题。2 经典字符串Hash函数介绍作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。2.1 PHP中出现的字符串Hash函数static unsigned lo 阅读全文
摘要:
要理解HashSet,可以按字面上把它分解为两部分,一方面它表示一个集合(Set),另一方面,它的实现使用了散列法(Hashing)。集合(Set)还记得吗?在中学里曾经学过,集合是某些指定对象的全体,集合的三个性质是确定性、互异性和无序性。本文提到的集合正是这个数学概念在计算机中的实现。说到集合,可能你会想到Collection这个词,以及.NET中的ICollection<T>接口,它们通常也被解释为“集合”,不过它们和Set有明显的不同。Collection可以看作是一组数据项的容器(Container),它与数学中的集合概念无关。同时,Set是一种特殊的容器。也就是说,Se 阅读全文
摘要:
在HashSet的实现(上)中,简要介绍了散列法(hashing)的内容,并以二次探测法实现了一个简单的HashSet。在本文中,将进一步讨论散列法,尤其是GetHashCode方法的实现,最后给出完整的HashSet实现。散列法再议通过散列法实现的容器,不管是HashSet、Hashtable还是Dictionary,需要支持的基本操作是insert、remove和find,特别是insert和find,三个操作的时间复杂度期望是O(1)。散列法的使用过程中,主要有两个问题:散列函数的实现;冲突的解决办法;下面将在上篇的基础上进一步讨论这两个问题的解决方案。散列函数的实现一般情况下,要存储的 阅读全文
摘要:
题目是从CU上看到的,我的算法是:int rand7(){int a;while( (a=rand5()*5+rand5()) > 26 );return (a-3)/3;}可惜没办法验证,不知道这个算法是否正确?(问题一)。(验证方法是通过双循环将两个rand5()分别换成1 2 3 4 5,但剔除掉(5,2)(5,3)(5,4)(5,5)这四个组合)算法思路是:1. 通过 rand5()*5+rand5() 产生 6 7 8 9 10 11 …… 26,27 28 29 30 这25个数,每个数的出现机率相等2. 只需要前面 3*7 个数,所以舍弃后面的4个数3. 将 6 7 8 转 阅读全文
摘要:
前段时间在BBS上看见一个问题:如何等概率的从N个元素中选取出K个元素?这个问题就是一个蓄水池抽样(Reservoir Sampling),算法可以如下描述 :Init: a reservoir with the size: kfori= k+1toNM=random(1, i);if( M < k)SWAPthe Mthvalueandithvalueend for网上有人给出了证明,先转过来:【转】证明:每次都是以 k/i 的概率来选择例: k=1000的话, 从1001开始作选择,1001被选中的概率是1000/1001,1002被选中的概率是1000/1002,与我们直觉是相符的 阅读全文
摘要:
如何在O(n)时间内处理字符串以每个位置为中心的最长回文。这里转载一个Manacher算法的论文翻译。原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长,这个算 阅读全文
摘要:
转自http://blog.csdn.net/liuxizhiyi/article/details/3097398给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?intrandom(intm,intn){intk=rand();intmax=n-1;while(k<m){k=k*n+rand();max=max*n+n-1;}returnk/(max/n);}如何产生如下概率的随机数?0出1次,1出现2次,2出现3次,n-1出现n次?intrandom(intsize){while(true){intm=rand(size);intn= 阅读全文
摘要:
package poj;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Arrays;import java.util.Iterator;import java.util.Scanner;public class Main1088_1 { static class Node implements Comparable<Node> { int x;... 阅读全文
摘要:
1 public class Main { 2 3 public int findMaxSumOneDimensions(int[] arr) { 4 int len = arr.length; 5 int max = arr[0], sum = max; 6 for (int i = 1; i < len; i++) { 7 sum += arr[i]; 8 if (sum < 0) 9 sum = arr[i];10 if (m... 阅读全文
摘要:
转自:http://hi.baidu.com/csdnail/blog/item/045fbed4a68dfbd850da4bcf.html问题:rand7是一个能生成1-7的整数随机数。要求利用rand7生成1-10的整数随机数。可以参看原帖。在lz提示下又找到了更简洁的方法,同余循环法,只需要一行代码!我很浅的探讨几种方法,还需要更深入的学习。感慨一下知识的浩瀚和自己的渺小。1.组合数学方法我在帖子里给出了这样的方法,这个很简单的算法,却似乎不那么容易被理解。第1次 1 2 3 4 5 6 7 之中用rand7取一个数第2次从 2 3 4 5 6 7 8 之中取一个数第3次从 3 4 5 阅读全文