/hash

2016年信息学院嵌入式面试题,简单利用c/c++模拟了Hash的增删改查

Primary LanguageC++

hash

2016年信息学院嵌入式面试题,简单利用c/c++模拟了Hash的增删改查

我们都使用过字典,如英汉字典、成语字典,图书的检索目录、电话簿等也可以看作广义上的字典。在计算机科学中,把字典也当成一种数据结构。我们把字典定义为“键- 值对” (Key-Value Pair) 的集合。根据不同的问题,我们为名字和值赋予不同的含义,比如,在英汉字典中,英文单词是名字,此单词的中文解释条目是值;在电话簿中,人名是名字,此人名对应的电话号码是值。字典最基本的操作包括:find(查找)、add(插入)、remove(删除),分别用来从字典中检索数据、插入数据和删除数据。在实际存储中,我们将“键 - 值对”存储于记录中,通过键 (也就是“键 - 值对”中的名字)来标识该“键 - 值对”。“键 - 值对”的存放位置和其键之间的对应关系用一个二元组表示: (键 - 值的位置)。从字典中查找“键 - 值对”的最简单方法就是使用数组存储,然后在查找的时候遍历此数组,当遍历到和被查找的“键 - 值对”的名字相同项的时候,这个“键 - 值对”就被找到了。这种最朴实的方式肯定是不能满足实际要求的,因此人们发明了一种检索效率非常高的组织字典数据的方法 ,即哈希表结构。 哈希方法在“键 - 值对”的存储位置与它的键之间建立一个确定的对应函数关系hash(),使得每一个键与结构中的一个唯一的存储位置相对应: 存储位置=hash(键); 在搜索时,首先对键进行hash运算,把求得的值当做“键 - 值对”的存储位置,在结构中按照此位置取“键 - 值对”进行比较,若键相等,则表示搜索成功。在存储“键 - 值对”的时候,依照相同的hash函数计算存储位置,并按此位置存放,这种方法就叫做哈希方法,也叫做散列方法。在哈希方法中使用的转换函数hash被称作哈希函数 (或者散列函数)。按照此中算法构造出来的表叫做哈希表 (或者散列表)。 哈希函数建立了从“键 - 值对”到哈希表地址集合的一个映射,有了哈希函数,我们就可以根据键来确定“键 - 值对”在哈希表中的位置的地址。使用这种方法由于不必进行多次键的比较,所以其搜索速度非常快,很多系统都使用这种方法进行数据的组织和检索。 问:有一组“键值对”:其中键表示序号0-100,值表示姓名。给出了几组数据如下:<7,” tom ” >、<9,” Jane ” >、<11,” Bit ” >、<12,” Lily ” >、<20,” sunny ” >。

(1)如果是通过哈希存储以上数据,给出该hash函数的算法。

我们按照如下哈希函数对键进行计算:hash(x)=x*2+1,得出如下结果:hash(5)=11、hash(8)=17、hash(12)=25、hash(17)=35、hash(20)=41。我们把<5,”tom”>、<8,”Jane”>、<12,”Bit”>、<17,”Lily”>、<20,”sunny”>分别放到地址为11、17、25、35、41的位置。 #include int hash(int x) { return x * 2 + 1; } void main() { int key; printf("输入搜寻的键:"); scanf_s("%d", &key); printf("hash运算后的地址为:%d", hash(key)); }

(2)在以上hash函数的基础之上,完成一个hash的增、删、改、查功能.


顺便记录一下gitHub的文本编辑器的格式代码 https://github.com/guoyunsky/Markdown-Chinese-Demo 总结的不错。