`
韩悠悠
  • 浏览: 842034 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

哈希表处理冲突的开放寻址法

 
阅读更多
/*
 * 链结点,相当于是车厢
 */
public class Node {
	//数据域
	public Info info;
	//指针域
	public Node next;
	
	public Node(Info info) {
		this.info = info;
	}
	
}

 

/*
 * 链表,相当于火车
 */
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;
		
	}
}

 

/**
 * 员工信息类
 * @author Administrator
 *
 */
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;
	}
	
	
}

 

import java.math.BigInteger;

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) {
//		int hashVal = 0;
//		for(int i = key.length() - 1; i >= 0; i--) {
//			int letter = key.charAt(i) - 96;
//			hashVal += letter;
//		}
//		return hashVal;
		
		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();
	}
}

 

public class TestHashTable {
	public static void main(String[] args) {
		HashTable ht = new HashTable();
		ht.insert(new Info("a","张三"));
		ht.insert(new Info("ct","李四"));
		ht.insert(new Info("b","王五"));
		ht.insert(new Info("dt","赵柳"));
		
		System.out.println(ht.find("a").getName());
		System.out.println(ht.find("ct").getName());
		System.out.println(ht.find("b").getName());
		System.out.println(ht.find("dt").getName());
		
//		System.out.println(ht.hashCode("a"));
//		System.out.println(ht.hashCode("ct"));
		
		System.out.println(ht.delete("a").getName());
		System.out.println(ht.find("a").getName());

	}
}

 

分享到:
评论
3 楼 w283873585 2014-07-03  
2333333333
2 楼 w283873585 2014-07-03  
[color=red][/color]11111111111
1 楼 w283873585 2014-07-03  
[color=red][/color][color=blue][/color]东西南北中

相关推荐

    哈希表设计 哈希表 哈希表

    常见的冲突解决策略有开放寻址法、链地址法、再哈希法等。在本例中,描述中提到的是开放寻址法,即当发生冲突时,不是在链表中寻找空位,而是通过特定的方式在数组中寻找下一个未被占用的位置。 - **开放寻址法**...

    哈希表及处理冲突的方法.doc

    处理冲突的方法有:开放寻址法、链地址法、公共溢出区法等。开放寻址法是指在发生冲突时,通过探测其他地址来解决冲突。链地址法是指将所有冲突的关键字链接起来,形成一个链表。公共溢出区法是指将所有冲突的关键字...

    建造哈希表的算法,并用链坡地法处理冲突

    为了解决这个问题,可以考虑优化哈希函数,或者采用其他冲突解决策略,如开放寻址法、再哈希法等。 在实际应用中,哈希表广泛用于数据库索引、缓存、字符串查找、集合和映射等场景。通过合理设计和使用哈希表,我们...

    哈希表的建立和查找哈希表的建立和查找哈希表的建立和查找

    1. 开放寻址法:当发生冲突时,通过线性探测、二次探测或双哈希探测等方法寻找下一个空槽位。 2. 链地址法:在每个数组槽位上附加一个链表,冲突的元素都挂在同一个链表上。 3. 再哈希法:使用第二个或更多的哈希...

    哈希表,开放地址法之线性探测代码(JAVA)

    - 使用开放寻址法的哈希表通常不支持删除操作,因为删除后的空位可能影响后续插入的探测顺序。解决这个问题的方法包括标记删除、再哈希等。 总之,哈希表是高效的数据结构,而开放地址法中的线性探测是处理冲突的一...

    哈希表相关操作实现

    常见的冲突解决策略有开放寻址法(线性探测、二次探测、双哈希等)和链地址法(每个数组元素连接一个链表,存储映射到同一索引的键值对)。 4. **插入操作**:当向哈希表中插入一个新的键值对时,首先通过哈希函数...

    数据结构哈希表设计实验报告

    开放寻址法是在哈希表内部寻找下一个空位置,而链地址法则是用链表连接映射到同一位置的元素。 3. **装载因子**:装载因子是哈希表中已存储元素数量与数组大小的比值,它直接影响哈希表的性能。装载因子过高会导致...

    cpp-HashmapsC中开放寻址哈希表算法的实现

    开放寻址法是一种处理哈希冲突的方法,当发生冲突时,不是在已占用的位置旁边寻找空闲位置,而是通过特定的探测序列在哈希表中继续查找,直到找到空闲位置为止。这种方法要求哈希表的大小必须是素数,以避免探测序列...

    哈希表设计 哈希表的具体实现代码

    然而,在实际应用中,完全避免冲突是很难做到的,因此需要设计有效的冲突解决策略,如开放寻址法、链地址法等。 1. **哈希函数**:哈希函数是哈希表的核心,它的目的是将任意大小的关键字转化为固定大小的哈希值。...

    哈希表源代码-哈希表模型

    3. 冲突处理:由于哈希函数可能会导致不同的键映射到相同的索引,所以需要解决冲突的方法,如开放寻址法(open addressing)和链地址法(chaining)。开放寻址法是在冲突时寻找下一个空位置,而链地址法则是在每个...

    哈希表哈希表哈希表.zip

    因此,处理冲突的方法也是哈希表设计中的重要环节,常见的处理策略有开放寻址法、链地址法、再哈希法和建立公共溢出区等。 开放寻址法是当冲突发生时,寻找下一个空的哈希地址,直到找到为止。这可能会导致聚集现象...

    哈希表的文本处理

    哈希冲突是哈希表的一个关键问题,当两个不同的输入映射到相同的索引时,通常采用开放寻址法或链地址法来解决。 在C++中,我们可以使用STL中的`std::unordered_map`容器来实现哈希表。`std::unordered_map`提供了一...

    浅谈哈希表及哈希冲突.ppt

    处理哈希冲突的常见策略包括开放寻址法和链地址法: - 开放寻址法:当发生冲突时,寻找下一个空的哈希地址,直到找到为止。常见的查找序列有线性探测、二次探测和双哈希探测等。 - 链地址法:在每个数组位置上挂接...

    数据结构试验 哈希表设计

    2. 实现开放寻址法或链地址法处理冲突。 3. 编写插入、删除和查找操作的函数。 4. 考虑哈希表的动态扩展,当装载因子(已存储元素数 / 数组大小)超过一定阈值时,进行扩容。 5. 注意内存管理,避免内存泄漏。 理解...

    哈希表的设计与实现C语言

    解决冲突的方法有很多,常见的有开放寻址法、链地址法和再哈希法。在C语言中,可以使用指针来实现链地址法,每个数组元素指向一个链表,链表存储所有映射到该位置的键值对。 在C语言中实现哈希表,首先需要定义一个...

    哈希表-浙大数据结构课件

    其中,开放寻址法是在哈希表中寻找下一个空位置,链地址法是每个槽位用链表连接所有映射至此的元素,再哈希法是使用第二个或更多的哈希函数解决冲突,而公共溢出区则是为所有冲突元素预留一个额外的存储区域。...

    hashtab2_C语言_哈希表删除、添加、寻找_codeblocks_

    常见的解决冲突的方法有开放寻址法(线性探测、二次探测、双散列探测等)和链地址法。链地址法是在每个数组元素处存储一个链表,所有哈希值相同的元素都存储在这个链表中。 3. **哈希表结构**:在C语言中,可以定义...

    哈希表的练习,举例

    处理冲突的方法主要有开放寻址法、链地址法、再哈希法和建立公共溢出区等。 1. **开放寻址法**:当发生冲突时,不是在当前位置插入元素,而是寻找下一个空的位置。常见的方法有线性探测再散列、二次探测再散列和双...

    哈希表的设计与实现(C语言课程设计)

    3. 冲突解决方法:哈希冲突是哈希表的常见问题,需要选择合适的冲突解决方法,例如开放寻址、链地址法等。 三、哈希表的实现 在C语言中,哈希表可以使用数组和链表来实现。以下是哈希表的实现步骤: 1. 定义哈希...

Global site tag (gtag.js) - Google Analytics