最简单的哈希-字符哈希
public class Solution { public static void main(String[] args) { int[] map=new int[128]; String str="abcdefgaaxxy"; for(int i=0;i<str.length();i++) { map[str.charAt(i)]++; } for(int i=0;i<128;i++) { if(map[i]>0) { System.out.println((char)i+" "+map[i]); } } } }哈希表排序整数
//哈希表排序整数 public class Solution { public static void main(String[] args) { int[] arr={6,5,1,2,7,7,128,321,13,7}; int[] map=new int[1000]; for(int i=0;i<arr.length;i++) { map[arr[i]]++; } for(int i=0;i<1000;i++) { for(int j=0;j<map[i];j++) { System.out.print(i+" "); } } } }
问题引入:任意元素的映射
当遇到负数或非常大的整数、字符串、浮点数、数组、对象等等如何进行哈希(映射)
利用哈希函数,将关键字值(大整数、字符串、浮点数等)转换为整数再对表长取余,
从而关键字值被转换为哈希表的表长范围内的整数。
拉链法解决冲突,构造哈希表
将所有哈希函数结果相同的结点连接在同一个单链表中。
头插法
拉链法构造哈希表代码实现:
(哈希表的表长取为质数,冲突会比其他数字少)
//拉链法解决哈希冲突 class ListNode { int val; ListNode next; ListNode(int val) { this.val=val; } } public class Solution { public int hash_func(int key,int table_len) { return key%table_len; } public void insert(ListNode[] hash_table,ListNode node,int table_len) { int hash_key=hash_func(node.val,table_len); node.next=hash_table[hash_key];//使用头插法插入节点 hash_table[hash_key]=node; } public boolean search(ListNode[] hash_table,int value,int table_len) { int hash_key=hash_func(val,table_len); ListNode head=hash_table[hash_key]; while(head!=null) { if(head.val==value) { return true; } head=head.next; } return false; } }