哈希表原理
来源:互联网 发布:python获取交集 编辑:程序博客网 时间:2024/04/30 09:30
设想一下,你有一个包含约一千条记录的数据文件,比如一个小企业的客户记录,还有一个程序,它把记录读到内存中进行处理。每个记录包含一个唯一的五位数的客户ID号、客户名字、地址、帐户结余等等。假设记录不是按客户ID号顺序分类的,所以,如果程序要将客户ID号作为“key” 来查找一个特殊的客户记录,唯一的查找方法就是连续地搜索每个记录。有时侯,它会很快找到你需要的记录;但有时侯,在程序找到你需要的记录前,它几乎已搜索到了最后一条记录。如果要在1,000条记录中搜索,那么查找任何一条记录都需要程序平均查核500.5 ((1000 + 1 )/2)条记录。如果你常需要查找数据,你应该需要一个更快的方法来找到一条记录。
一种加快搜索的方法就是把记录分成几段,这样,你就不用搜索一个很大的列表了,而是搜索几个短的列表。对于我们数字式的客户ID号,你可以建10个列表,以0开头的ID号组成一个列表,以1开头的ID号组成一个列表,依此类推。那么要查找客户ID号38016,你只需要搜索以3开头的列表就行了。如果有1,000条记录,每个列表的平均长度为100(1,000条记录被分成10个列表),那么搜索一条记录的平均比较次数就降到了约50。
当然,如果约十分之一的客户号是以0开头的,另外十分之一是以1开头的,等等,那么这种方法会很适合。如果90%的客户号以0开头,那么那个列表就会有900条记录,每次查找平均需要进行450次比较。另外,程序需要执行的搜索有90%都是针对以0开头的号码的。因此,平均比较数就大大超过简单数学运算的范围了。
如果我们可以按这样一种方式在我们的列表中分配记录,情况就会好一些,即每个列表约有相同条目的记录,而不管键值中数字的分布。我们需要一种方法能够把客户号码混合到一起并更好地分布结果。例如,我们可以取号码中的每位数,乘以某个大的数(随着数字位置的不同而不同), 然后将结果相加产生一个总数,把这个数除以10,并将余数作为索引值(index)(除数相同的分到一组)。当读入记录时,程序在客户号码上运行这个哈希(hash) 函数来确定记录属于哪个列表。当用户需要查询时,将同一个哈希函数作为一个“key”用于客户号码,这样就可以搜索正确的列表了。 像这样的一个数据结构就称为一个哈希表(hashtable)。
一种加快搜索的方法就是把记录分成几段,这样,你就不用搜索一个很大的列表了,而是搜索几个短的列表。对于我们数字式的客户ID号,你可以建10个列表,以0开头的ID号组成一个列表,以1开头的ID号组成一个列表,依此类推。那么要查找客户ID号38016,你只需要搜索以3开头的列表就行了。如果有1,000条记录,每个列表的平均长度为100(1,000条记录被分成10个列表),那么搜索一条记录的平均比较次数就降到了约50。
当然,如果约十分之一的客户号是以0开头的,另外十分之一是以1开头的,等等,那么这种方法会很适合。如果90%的客户号以0开头,那么那个列表就会有900条记录,每次查找平均需要进行450次比较。另外,程序需要执行的搜索有90%都是针对以0开头的号码的。因此,平均比较数就大大超过简单数学运算的范围了。
如果我们可以按这样一种方式在我们的列表中分配记录,情况就会好一些,即每个列表约有相同条目的记录,而不管键值中数字的分布。我们需要一种方法能够把客户号码混合到一起并更好地分布结果。例如,我们可以取号码中的每位数,乘以某个大的数(随着数字位置的不同而不同), 然后将结果相加产生一个总数,把这个数除以10,并将余数作为索引值(index)(除数相同的分到一组)。当读入记录时,程序在客户号码上运行这个哈希(hash) 函数来确定记录属于哪个列表。当用户需要查询时,将同一个哈希函数作为一个“key”用于客户号码,这样就可以搜索正确的列表了。 像这样的一个数据结构就称为一个哈希表(hashtable)。
- 哈希表原理
- 哈希表原理
- 哈希表原理
- 哈希表原理
- 哈希表原理
- 哈希表原理
- 哈希表原理
- hash 哈希表原理
- 哈希表之数学原理
- 哈希表工作原理
- 哈希表算法原理
- 哈希表工作原理
- 哈希表工作原理
- 哈希表工作原理
- 哈希表的工作原理
- 哈希表实现原理
- 什么是 哈希表的原理
- 数据结构-哈希表原理详解
- grep 用法介绍
- 学习笔记:文本过滤_____unix 下的通配符
- ubuntu 10.10 配置 tomcat6
- [转]技巧:Vim 的纵向编辑模式
- 转:初学者简易 .vimrc编写指南
- 哈希表原理
- 在Ubuntu/mint里安装VMware tools(虚拟机增强工具)
- Fedora17 开启ssh服务
- (转)Fedora 17 安装完全指南
- [转] fedora linux下安装vmware tools的最好方法
- 【转】usermod 添加用户多个附属组
- [转]在Fedora上安装Oracle 11g XE
- 【转】 Ubuntu 11.04 下安装配置 JDK 7
- [转]linux系统增加swap大小方法(安装oracle可能需要)
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
天梭怎么样
天梭电子表
天梭价格
天梭pr50
天梭专卖店
天梭prs200
天梭男士表
天梭女表
天梭情侣表
天梭腾智
天梭新款
天梭系列
天梭和浪琴
天梭俊雅
天梭t461
天梭港湾
天梭吧
天梭t17
天梭prs516
天梭专柜
天梭pr100
瑞士天梭
天梭t035
天梭瑞士表
天梭表价格
天梭t063
天梭石英表
天梭正品
天梭tissot
天梭经典
天梭天匠
天梭是什么档次
天梭手表怎么辨别真伪
天梭手表辨别真伪
天梭手表怎么调日期
天梭手表调日期
天梭表序列号查询系统
天梭1853价格及图片
天梭表1853各型号图
天梭手表日期
天梭手表怎么样档次