zoukankan      html  css  js  c++  java
  • HashTable学习

    底层的存储结构划分成两种类型,一种是链表构成,一种就是数组。

    第一种,底层是由数组构成

    1、数据实体
    public class Info {
    	private String key;
    	private String name;
    	
    	public Info(String key, String name) {
    		this.key = key;
    		this.name = name;
    	}
    
    	public String getKey() {
    		return key;
    	}
    
    	public void setKey(String key) {
    		this.key = key;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	
    }
    2、Hashtable的一些操作
    /**
     * 数组组成的,轮训等插入算法
     */
    public class HashTable {
    	private Info[] arr;
    	
    	/**
    	 * 默认的构造方法
    	 */
    	public HashTable() {
    		arr = new Info[100];
    	}
    	
    	/**
    	 * 指定数组初始化大小
    	 */
    	public HashTable(int maxSize) {
    		arr = new Info[maxSize];
    	}
    	
    	/**
    	 * 插入数据
    	 */
    	public void insert(Info info) {
    		//获得关键字
    		String key = info.getKey();
    		//关键字所自定的哈希数
    		int hashVal = hashCode(key);
    		//如果这个索引已经被占用,而且里面是一个未被删除的数据
    		while(arr[hashVal] != null && arr[hashVal].getName() != null) {
    			//进行递加
    			++hashVal;
    			//循环
    			hashVal %= arr.length;
    		}
    		arr[hashVal] = info;
    	}
    
    	
    	/**
    	 * 查找数据
    	 */
    	public Info find(String key) {
    		int hashVal = hashCode(key);
    		while(arr[hashVal] != null) {
    			if(arr[hashVal].getKey().equals(key)) {
    				return arr[hashVal];
    			}
    			++hashVal;
    			hashVal %= arr.length;
    		}
    		return null;
    	}
    	/**
    	 * 删除数据
    	 * @param key
    	 * @return
    	 */
    	public Info delete(String key) {
    		int hashVal = hashCode(key);
    		while(arr[hashVal] != null) {
    			if(arr[hashVal].getKey().equals(key)) {
    				Info tmp = arr[hashVal];
    				tmp.setName(null);
    				return tmp;
    			}
    			++hashVal;
    			hashVal %= arr.length;
    		}
    		return null;
    	}
    	
    	public int hashCode(String key) {
    		BigInteger hashVal = new BigInteger("0");
    		BigInteger pow27 = new BigInteger("1");
    		for(int i = key.length() - 1; i >= 0; i--) {
    			int letter = key.charAt(i) - 96;
    			BigInteger letterB = new BigInteger(String.valueOf(letter));
    			hashVal = hashVal.add(letterB.multiply(pow27));
    			pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));
    		}
    		return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();
    	}
    }
    
    
    

    第二种,底层由数组+链表组成

    1、数据域的实体
    public class Info {
    	private String key;
    	private String name;
    	
    	public Info(String key, String name) {
    		this.key = key;
    		this.name = name;
    	}
    
    	public String getKey() {
    		return key;
    	}
    
    	public void setKey(String key) {
    		this.key = key;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    2、链表节点的构成
    public class Node {
    	//数据域
    	public Info info;
    	//指针域
    	public Node next;
    	
    	public Node(Info info) {
    		this.info = info;
    	}
    
    	
    }
    3、链表的一些基本操作
    public class LinkList {
    	//头结点
    	private Node first;
    	
    	public LinkList() {
    		first = null;
    	}
    	
    	/**
    	 * 插入一个结点,在头结点后进行插入
    	 */
    	public void insertFirst(Info info) {
    		Node node = new Node(info);
    		node.next = first;
    		first = node;
    	}
    	
    	/**
    	 * 删除一个结点,在头结点后进行删除
    	 */
    	public Node deleteFirst() {
    		Node tmp = first;
    		first = tmp.next;
    		return tmp;
    	}
    
    	
    	
    	/**
    	 * 查找方法
    	 */
    	public Node find(String key) {
    		Node current = first;
    		while(!key.equals(current.info.getKey())) {
    			if(current.next == null) {
    				return null;
    			}
    			current = current.next;
    		}
    		return current;
    	}
    	
    	/**
    	 * 删除方法,根据数据域来进行删除
    	 */
    	public Node delete(String key) {
    		Node current = first;
    		Node previous = first;
    		while(!key.equals(current.info.getKey())) {
    			if(current.next == null) {
    				return null;
    			}
    			previous = current;
    			current = current.next;
    		}
    		//当前节点是头节点
    		if(current == first) {
    			first = first.next;
    		} else {
    			previous.next = current.next;
    		}
    		return current;
    		
    	}
    }
    4、hashTable的整体的定义操作
    /**
     * 由数组+链表组成,每个元素是一个链表,所有列表都是采用头插入的方法实现
     */
    public class HashTable {
    	private LinkList[] arr;//相当于指针数组
    
    	
    	/**
    	 * 默认的构造方法
    	 */
    	public HashTable() {
    		arr = new LinkList[100];
    	}
    	
    	/**
    	 * 指定数组初始化大小
    	 */
    	public HashTable(int maxSize) {
    		arr = new LinkList[maxSize];
    	}
    	
    	/**
    	 * 插入数据
    	 */
    	public void insert(Info info) {
    		//获得关键字
    		String key = info.getKey();
    		//关键字所自定的哈希数
    		int hashVal = hashCode(key);
    		if(arr[hashVal] == null) {
    			arr[hashVal] = new LinkList();
    		}
    		arr[hashVal].insertFirst(info);
    	}
    	
    	/**
    	 * 查找数据
    	 */
    	public Info find(String key) {
    		int hashVal = hashCode(key);
    		return arr[hashVal].find(key).info;
    	}
    	
    	/**
    	 * 删除数据
    	 * @param key
    	 * @return
    	 */
    	public Info delete(String key) {
    		int hashVal = hashCode(key);
    		return arr[hashVal].delete(key).info;
    	}
    	
    	public int hashCode(String key) {
    
    		BigInteger hashVal = new BigInteger("0");
    		BigInteger pow27 = new BigInteger("1");
    		for(int i = key.length() - 1; i >= 0; i--) {
    			int letter = key.charAt(i) - 96;
    			BigInteger letterB = new BigInteger(String.valueOf(letter));
    			hashVal = hashVal.add(letterB.multiply(pow27));
    			pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));
    		}
    		return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();
    	}
    }
    
    
  • 相关阅读:
    wcf简单的创建和运用
    关于DevExpress的gridControl的简单使用
    泛型 Field 和 SetField 方法 (LINQ to DataSet)
    【转】string.Format对C#字符串格式化
    ashx实现文件下载以及文件MD5码测试
    【转】10分钟了解设计模式(C#)
    [转]Jquery中AJAX错误信息调试参考
    搭建Harbor docker镜像仓库
    安装python3.x
    shell替换
  • 原文地址:https://www.cnblogs.com/hbym/p/15691756.html
Copyright © 2011-2022 走看看