1 概述
链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。
设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、空间利用率等方面的性能问题。
2 经典字符串Hash函数介绍
作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数。
2.1 PHP中出现的字符串Hash函数
static unsigned long hashpjw(char *arKey, unsigned int nKeyLength)
{
阅读全文>发表于 @ 2008年06月30日 10:59:00|评论(loading...)|编辑|收藏
一个含有数值的值类型的实例,和一个指向对象的引用类型的实例,它们有什么区别呢?除了存储对象所需的内存之外,每一个对象都会有一个对象头,目的是为面向对象的编程提供基本的服务,如存在虚方法的类,嵌入其中的元数据等等。由虚方法和接口间接结合的对象头,其内存开销通常会很大,哪怕你所需要的只是一个静态类型的数值,也会带来一些编译器的强制操作。有趣的是,在某些情况下,编译器能优化掉一些对象开销,但不总是能起作用。如果你非常在意托管代码的执行效率,那么使用数值或值类型将会有所益处,但在本地C++的类型中,这不算一个很大的区别,当然,C++也没有强制任何编程范式,所以也有可能在C++之上,通过创建库来建立一个这样截然不同的类型系统。 阅读全文>
发表于 @ 2008年06月30日 09:41:00|评论(loading...)|编辑|收藏
2008年06月28日
注意:在装箱的过程中,会新生成一个堆(托管堆)对象,他值类型的值复制到引用类型(堆对象)中,此后,值类型变量的更改,不会影响引用类型。在拆箱时,会生成一个新的堆栈类型变量,将引用类型的值复制到值类型(堆栈对象)中,此后新的值类型的变化,也不会影响原来的引用类型。
阅读全文>
发表于 @ 2008年06月28日 15:34:00|评论(loading...)|编辑|收藏
第一组类型是一组接口,用来定义集合必须遵守的一系列协定。第二组类型包括一组常用集合类型。例如:ArrayList、Hashtable、Stack、Queue。我们可以非常方便地使用这些来检索和存储内存中的数据。第三组类型用来支持类型严格的集合的创建。通过CollectionBase类提供数据存储,我们可以方便地创建自定义集合而且是类型严格的——这一点很重要。 下面我们逐一深入探讨上面提到的三组类型。首先,我们要全面了解一下命名空间里面的接口,看一看这些接口能够为我们提供哪些协定。然后讨论如何使用常用的集合类型。最后讨论利用CollectionBase类创建自定义的集合类型。阅读全文>
发表于 @ 2008年06月28日 10:35:00|评论(loading...)|编辑|收藏
2008年06月14日
'SQL防注入函数,调用方法,在需要防注入的地方替换以前的request("XXXX")为SafeRequest("XXXX")
阅读全文>
发表于 @ 2008年06月14日 13:26:00|评论(loading...)|编辑|收藏
2008年05月27日
1. 数据库访问性能优化
2. 字符串操作性能优化
3. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要
.............阅读全文>
发表于 @ 2008年05月27日 16:22:00|评论(loading...)|编辑|收藏
2008年04月30日
什么是二维码?二维码的历史!二维码技术指标!二维码使用流程及应用!二维码产业链!二维码前景!阅读全文>
发表于 @ 2008年04月30日 11:24:00|评论(loading...)|编辑|收藏
2008年04月22日
执行一个存储过程,能否实现同时返回几个值和一个行集?或者同时返回几个值和几个行集. 阅读全文>
发表于 @ 2008年04月22日 14:11:00|评论(loading...)|编辑|收藏
mssql数据库最大容量规范和限定,每个基础数据表的最大列数1024阅读全文>
发表于 @ 2008年04月22日 00:57:00|评论(loading...)|编辑|收藏