用开放地址法中的线性探查法解决冲突实现哈希表的运算
来源:互联网 发布:g76螺纹编程第一刀 编辑:程序博客网 时间:2024/05/19 22:06
为了更深的理解哈希算法,自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算。
/** * Created by lirui on 14-8-13. * 用开放地址法中的线性探查法解决冲突实现哈希表的运算。 */public class MyHashSearch { public static final int SIZE = 10; public static final int NULLKEY = -1; public static final int DELKEY = -2; public static MyHashTable[] hashTables1 = new MyHashTable[SIZE]; // 记录hash表中的数量。 public static int count = 0; // 哈希函数 h(key)= key mod p public static int hashFunction(int key, int p) { return key % p; } // 解决冲突的函数 public static int ConlictFunction(int adress) { return (adress + 1) % SIZE; } /** * @param hashTables * @param p 选择的那个被除数 h(key)= key mod p h(key)代表地址 * @param key 要查的关键字 * @return */ public static int searchHT(MyHashTable[] hashTables, int p, int key) { int i = 0, adr; adr = hashFunction(key, p); while (hashTables[adr].key != NULLKEY && hashTables[adr].key != key) { i++; adr = ConlictFunction(adr); } if (hashTables[adr].key == key) { return adr; } else { return -1; } } public static int deleteHT(MyHashTable[] myHashTables, int p, int key) { int adr; adr = searchHT(myHashTables, p, key); if (adr != -1) { myHashTables[adr].key = DELKEY; count--; return 1; } else { return 0; } } // 将key插入到哈希表中 public static void insertHT(MyHashTable[] hashTables, int key, int p) { int i, adr; adr = hashFunction(key, p); // 当没有冲突发生的时候 if (hashTables[adr].key == NULLKEY || hashTables[adr].key == DELKEY) { hashTables[adr].key = key; hashTables[adr].findcount = 1; } else { // 如果发生了冲突 i = 2; adr = ConlictFunction(adr); while (hashTables[adr].key != NULLKEY && hashTables[adr].key != DELKEY) { adr = ConlictFunction(adr); i++; } hashTables[adr].key = key; hashTables[adr].findcount = i; } count++; } /** * @param hashTables * @param x 要存入哈希表中的数组 * @param m 哈希表的长度 * @param p 哈希参数 */ public static void createHT(MyHashTable[] hashTables, int[] x, int m, int p) { int i, length = x.length; for (i = 0; i < m; i++) { hashTables[i].key = NULLKEY; hashTables[i].findcount = 0; } for (i = 0; i < length; i++) { insertHT(hashTables, x[i], p); } } public static void main(String[] args) { MyHashTable[] hashTables1 = MyHashSearch.hashTables1; for (int i = 0; i < MyHashSearch.SIZE; i++) { hashTables1[i] = new MyHashTable(); } //int[] x = {2, 49, 303, 100, 30, 1}; int[] x = {7, 8, 30, 11, 18, 9 ,14}; createHT(hashTables1, x, MyHashSearch.SIZE, 7); for (MyHashTable myHashTable : hashTables1) { System.out.println(myHashTable.key + " 探查次数:" + myHashTable.findcount); } System.out.println(searchHT(hashTables1, 7, 30)); System.out.println(count); deleteHT(hashTables1,7,7); System.out.println(count); for (MyHashTable myHashTable : hashTables1) { System.out.println(myHashTable.key + " 探查次数:" + myHashTable.findcount); } }}class MyHashTable { int key; // 关键字域 String info; // 其他数据域 int findcount;// 探查次数域 MyHashTable() { } MyHashTable(int key, String info, int findcount) { this.key = key; this.info = info; this.findcount = findcount; }}
0 0
- 用开放地址法中的线性探查法解决冲突实现哈希表的运算
- C++中的线性探查法
- hash(开放地址法解决冲突)
- 哈希表的线性探查法搜索算法
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- hash线性探测开放定址法解决冲突
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- (第13讲)哈希表的开放地址法中的线性探测
- 第13题用线性探查法实现的散列表 POWERBY KTL
- c语言实现最简单的哈希表(开放地址线性探测法)
- 哈希表-开放地址法之线性探测
- 算法学习 - HashTable开放地址法解决哈希冲突
- 哈希表开放寻址法之线性探测法解决冲突问题
- 用链地址法解决冲突的哈希表
- 开放定址法解决hash冲突问题(C语言实现)
- 合并排序的c语言实现
- 产品与项目
- Matrix multiplication
- Balanced Binary Tree
- poj 1061 青蛙的约会 数论
- 用开放地址法中的线性探查法解决冲突实现哈希表的运算
- jmap详解
- javascript实现获取json数据分页功能
- TX电话面试小结
- HDU-2258-Continuous Same Game (1)(DFS+模拟)
- C++中两个类的头文件互相包含问题
- Java中的FileOutputStream与FileInputStream
- 字符串运算
- Oracle遇到错误