代码改变世界

各种字符串Hash函数比较

2013-10-05 05:24 by youxin, 867 阅读, 0 推荐, 收藏,
摘要:常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。Hash函数数据1数据2数据3数据4数据1得分数据2得分数据3得分数据4得分平均分BKDRHash20477448196.5510090.9582.0592.64APHash23475 阅读全文

字符串经典的hash算法

2013-10-05 05:01 by youxin, 2558 阅读, 0 推荐, 收藏,
摘要:1 概述链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性能问题。打造最快的Hash表(和Blizzard的对话)先提一个简单的问题,如果有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?有一个方 阅读全文

二分图简介

2013-10-05 04:51 by youxin, 4652 阅读, 0 推荐, 收藏,
摘要:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集。无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。选择这样的边数最大的子集称为图的最大匹配问题(maximal 阅读全文

面试题之括号匹配分析( 出栈序列是否合法,给定一个入栈序列,求所有可能的出栈序列等等)

2013-10-04 21:52 by youxin, 2786 阅读, 0 推荐, 收藏,
摘要:题目:括号匹配分析给定字符串,输出括号是否匹配,例如,"()" yes;")(" no;"(abcd(e)" no;"(a)(b)" yes。要求必须用递归写,整个实现不可以出现一个循环语句。分析这个题目很多同学都见过了,如果没有后面的条件,会张口就说就来用栈来实现,时间复杂度O(n),空间复杂度O... 阅读全文

XOR双向链表

2013-10-04 15:52 by youxin, 830 阅读, 0 推荐, 收藏,
摘要:这是一个数据结构。利用计算机的的位异或操作(⊕),来降低双向链表的存储需求。... A B C D E ... –> next –> next –> next –> A⊕C B⊕D C⊕E link(B) = addr(A)⊕addr(C), link(C) = addr(B)⊕addr(D), ..要求addr(D),使用:addr(D) = link(C) ⊕ addr(B)地址指针中存放的地址的异或。 比如B中就存放了A⊕C的值。这样从头开始便利时,我们需要知... 阅读全文

转: 等概率随机函数的实现

2013-10-04 04:01 by youxin, 3869 阅读, 1 推荐, 收藏,
摘要:题目:已知随机函数rand(),以p的概率产生0,以1-p的概率产生1,现在要求设计一个新的随机函数newRand(), 使其以1/n的等概率产生1~n之间的任意一个数。解决思路:可以通过已知随机函数rand()产生等概率产生0和1的新随机函数Rand(),然后调用k(k为整数n的二进制表示的位数)... 阅读全文

给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数(均匀概率问题)

2013-10-04 03:38 by youxin, 5412 阅读, 0 推荐, 收藏,
摘要:google面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。问题分析:现在给了一个能随机生成1~5的随机函数,怎样利用这个已知条件生成一个1~7的随机函数呢?既然要生成的是随机数那么生成1,2,3,4,5,6,7的概率就应该是一样的。显然现在光生成1~5之间的数就不够了,我们想到应该要加大生成数的范围,并且加大范围的同时还要保证每个数产生的概率一样,于是有这样一种方法用这个表达式来扩大生成数范围:rand5()*5+rand5(),新的数据范围变成:6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 阅读全文

统计一个数字在排序数组中出现的次数(二分法)

2013-10-04 00:54 by youxin, 2585 阅读, 0 推荐, 收藏,
摘要:问题:计一个数字在排序数组中出现的次数如: 整数数组arr,数组中元素的个数是n,数组arr已经排好序,要在arr中找到某个某个整数x出现的次数,比如arr[] = {1,2,2,3,5,10},找到2的出现次数就是2。问题分析:相必看到有序数组的字样,想到利用二分应该是很顺利成章的事了。我们可以利用二分搜索求出x在arr中出现的第一个位置lo和最后一个位置hi,然后计算hi-lo+1的值就是x在arr出现的次数了,当然也有可能x并没有在arr中出现过,这时hi和lo都等于-1。时间复杂度是两个二分的复杂度:2*O(log n)。/******************************* 阅读全文

并查集详解

2013-10-03 21:34 by youxin, 3122 阅读, 1 推荐, 收藏,
摘要:以前经常遇到并查集,但一直没有总结。今天把并查集的相关知识总结下。 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定 阅读全文

二进制逆序方法

2013-10-03 04:46 by youxin, 3722 阅读, 0 推荐, 收藏,
摘要:逆序分析原题一个整数,可以表示为二进制的形式,请给出尽可能多的方法对二进制进行逆序操作。 例如:10000110 11011000的逆序为 00011011 01100001分析题目中说是一个整数,对它的二进制进行逆序。并不是一个01字符串,或者01的数组。那么我们该如何解决这个问题呢?方法还是比较多的,有的中规中矩、有的非常巧妙。我们要掌握中规中规的方法,见识更多的巧妙的方法。慢慢的,能够举一反三,在遇到新的问题时,能够有灵思妙想。最直接的方法直接的方法,很容易想到:有如下代码:直接的方法,很容易想到:有如下代码: int v = 111;int r = v;int s = 32; for 阅读全文
上一页 1 ··· 123 124 125 126 127 128 129 130 131 ··· 269 下一页