摘要:
我们经常使用的数的进制为“常数进制”,即始终逢p进1。例如,p进制数K可表示为K = a0*p^0 + a1*p^1 + a2*p^2 + ... + an*p^n (其中0 pi,那么,如果在排列Q中qi之前的元素x与qi构成逆序对,即有x > qi,则在排列P中pi之前也有相同元素x > pi... 阅读全文
随笔分类 - 算法---哈希
各种字符串Hash函数比较
2013-10-05 05:24 by youxin, 856 阅读, 收藏, 编辑
摘要:
常用的字符串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, 2540 阅读, 收藏, 编辑
摘要:
1 概述链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性能问题。打造最快的Hash表(和Blizzard的对话)先提一个简单的问题,如果有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?有一个方 阅读全文
程序员面试题精选100题(40)-扑克牌的顺子
2013-09-07 01:43 by youxin, 912 阅读, 收藏, 编辑
摘要:
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。分析:这题目很有意思,是一个典型的寓教于乐的题目。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果. 阅读全文
从第一字符串中删除第二个字符串中所有的字符
2013-09-01 02:39 by youxin, 2793 阅读, 收藏, 编辑
摘要:
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的字符串变成”Thy r stdnts.”。分析:题目可分解为如何判断一个字符串中包含特定字符以及如何在一个字符串中删除特定字。判断一个字符串是否包含是定字符,可首先创建一个字符串的Hash表,把字符串中对应的字符对代表的hash元素置为1.字符参数所代表Hash元素值是为1就表示字符存在。(这种“字符串hash”的思想要掌握,可以快速在一些字符中查找某个字符)在一个字符串中删除指定字符,比较好的方法是通过快慢消除法。具体实现如下:#include # 阅读全文
在一个字符串中找到第一个只出现一次的字符
2013-09-01 02:27 by youxin, 834 阅读, 收藏, 编辑
摘要:
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:可通过循环每一个字符看后面的子串是否包含这个字符。但是效率不高。一种比较有效的方法是创建一个字符数次hash表。具体实现如下:#include #include #define N 256 int charHash[N] = {0}; void initCharHash(const char *s){ while(*s) { charHash[*s]++; s++; }}char findFirstOnceChar(const ch... 阅读全文