博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈希表
阅读量:5877 次
发布时间:2019-06-19

本文共 3989 字,大约阅读时间需要 13 分钟。

1.什么是哈希表?

  哈希表是一种数据结构,它提供了快速的插入操作和查找。其基于数组来实现。

2.哈希化

  1).直接将关键字作为索引。

  2).将单词转换成索引。

  • 将字母转换成ASCII码,然后进行相加(容易出现重复的哈希值,如:abc,bbb和cba的值是相同的
  • 幂的连乘(哈希值的长度可能超过int和long类型的长度
  • 压缩可选值(推荐使用

3.压缩后仍然可能出现的问题

  冲突,不能保证每个单词都映射到数组的空白单元。

解决办法:

  • 开放地址法:当冲突发生时,通过查找数组的一个空位,并将数据填入,而不再用哈希函数得到的数组下标,这个方法叫做开放地址法。
  • 链地址法:在哈希表每个单元中设置链表。某个数据项的关键字还是像通常一样映射到哈希表的单元中,而数据项本身插入到单元的链表中。

4.代码示例(开放地址法):

1 /** 2  * 员工信息类 3  */ 4  public class Info { 5      private String key;//哈希值 6      private String name;//员工姓名 7       8      public Info(String key, String name){ 9          this.key = key;10          this.name = name;11      }12      13      public String getKey(){14          return key;15      }16      public void setKey(String key){17          this.key = key;18      }19      20      public String getName(){21          return name;22      }23      public void setName(String name){24          this.name = name;25      }26      27  }

 

1 public class HashTable { 2      private Info[] arr; 3       4      /** 5       * 默认的构造方法 6       */ 7       public HashTable(){ 8           arr = new Info[100]; 9       }10       11       /**12        * 指定数组初始化大小13        */14       public HashTable(int maxSize){15           arr = new Info[maxSize];16       }17       18       /**19        * 插入数据20        */21       public void insert(Info info){22            23            //获得关键字24            String key = info.getKey();25            //关键字所指定的哈希数26            int hashVal = hashCode(key);27            //如果这个索引已经被占用,而且里面是一个未被删除的数据28            while(arr[hashVal] != null && arr[hashVal].getName() != null){29                //进行递加30                ++ hashVal;31                //循环32                hashVal %= arr.length;33            }34            arr[hashVal] = info;35            36       }37       38       /**39        * 查找数据40        */41       public Info find(int key){42           int hashVal = hashCode(key);43           while(arr[hashVal] != null){44               if(arr[hashVal].getKey().equal(key)){45                   return arr[hashVal];46               }47               ++ hashVal;48               hashVal %= arr.length;49           }50            return null;51       }52       53       /**54        * 删除数据55        */56       public Info delete(String key){57           int hashVal = hashCode(key);58           while(arr[hashVal] != null){59               if(arr[hashVal].getKey().equal(key)){60                   Info tmp = arr[hashVal];61                   tmp.setName(null);62                   return tmp;63               }64               ++ hashVal;65               hashVal %= arr.length;66           }67            return null;68       }69       70       public int hashCode(String key){71 //        int hashVal = 0;72 //        for(int i = key.length() - 1; i >= 0; i++){73 //            int letter = key.charAt(i) - 96;74 //            hashVal += letter;75 //        }76 //        return hashVal;77           78           BigInteger hashVal = new BigInteger("0");79           BigInteger pow27 = new BigInteger("1")80           for(int i = key.length() - 1; i >= 0; i++){81               int letter = key.charAt(i) - 96;82               BigInteger letterB = new BigInteger(String.valueOf(letter));83               hashVal = hashVal.add(letterB.multiply(pow27));84               pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));85           }86           return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();87 88       }89  }

 

1 /** 2  * 测试类 3  */ 4 public class TestHashTable { 5      public static void main(String[] args) { 6          HashTable ht = new HashTable(); 7          ht.insert(new Info("zhangsan","张三")); 8          ht.insert(new Info("lisi","李四")); 9          ht.insert(new Info("wangwu","王五"));10          11          System.out.println(ht.find("zhangsan").getName());12          System.out.println(ht.find("lisi").getName());13          System.out.println(ht.find("lisi").getName());14      }15  }

 

转载于:https://www.cnblogs.com/keynotes/p/8453041.html

你可能感兴趣的文章
鲍尔默:我可能说过Linux是“恶性肿瘤” 但现在我爱它
查看>>
台积电2016年6月营收公布:股价飙升创台个股新记录
查看>>
数据显示:雅虎员工偏爱公司 讨厌管理层
查看>>
sql 行列转换
查看>>
回归测试的最优方法
查看>>
车联网发展需加强网络建设
查看>>
云计算时代 未来CRM系统发展趋势
查看>>
让开发自动化:除掉构建脚本中的气味
查看>>
新一代服务器性能测试工具Gatling
查看>>
Google 将于4月25日关闭 Hangouts API
查看>>
中国程序员 VS 美国程序员,差距就在这五点
查看>>
《R与Hadoop大数据分析实战》一导读
查看>>
IESG 批准 HTTP 法律审查状态代码 451
查看>>
《仿人机器人原理与实战》一2.6 行为链搜索关键词
查看>>
《驯狮记——Mac OS X 10.8 Mountain Lion使用手册》——1 走进Mac OS世界 1.1 Mac OS X的沿革...
查看>>
《嵌入式 Linux C 语言应用程序设计(修订版)》——1.1 嵌入式系统概述
查看>>
作为一个新手程序员该如何成长?
查看>>
《C语言编程魔法书:基于C11标准》——1.6 本章小结
查看>>
芬兰诺基亚欲投靠Android 但需等到2016年
查看>>
第十四天:规划质量管理,一致性成本、非一致性成本、质量七工具
查看>>