/* * 链结点,相当于是车厢 */ 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()); } }
相关推荐
常见的冲突解决策略有开放寻址法、链地址法、再哈希法等。在本例中,描述中提到的是开放寻址法,即当发生冲突时,不是在链表中寻找空位,而是通过特定的方式在数组中寻找下一个未被占用的位置。 - **开放寻址法**...
处理冲突的方法有:开放寻址法、链地址法、公共溢出区法等。开放寻址法是指在发生冲突时,通过探测其他地址来解决冲突。链地址法是指将所有冲突的关键字链接起来,形成一个链表。公共溢出区法是指将所有冲突的关键字...
为了解决这个问题,可以考虑优化哈希函数,或者采用其他冲突解决策略,如开放寻址法、再哈希法等。 在实际应用中,哈希表广泛用于数据库索引、缓存、字符串查找、集合和映射等场景。通过合理设计和使用哈希表,我们...
1. 开放寻址法:当发生冲突时,通过线性探测、二次探测或双哈希探测等方法寻找下一个空槽位。 2. 链地址法:在每个数组槽位上附加一个链表,冲突的元素都挂在同一个链表上。 3. 再哈希法:使用第二个或更多的哈希...
- 使用开放寻址法的哈希表通常不支持删除操作,因为删除后的空位可能影响后续插入的探测顺序。解决这个问题的方法包括标记删除、再哈希等。 总之,哈希表是高效的数据结构,而开放地址法中的线性探测是处理冲突的一...
常见的冲突解决策略有开放寻址法(线性探测、二次探测、双哈希等)和链地址法(每个数组元素连接一个链表,存储映射到同一索引的键值对)。 4. **插入操作**:当向哈希表中插入一个新的键值对时,首先通过哈希函数...
开放寻址法是在哈希表内部寻找下一个空位置,而链地址法则是用链表连接映射到同一位置的元素。 3. **装载因子**:装载因子是哈希表中已存储元素数量与数组大小的比值,它直接影响哈希表的性能。装载因子过高会导致...
开放寻址法是一种处理哈希冲突的方法,当发生冲突时,不是在已占用的位置旁边寻找空闲位置,而是通过特定的探测序列在哈希表中继续查找,直到找到空闲位置为止。这种方法要求哈希表的大小必须是素数,以避免探测序列...
然而,在实际应用中,完全避免冲突是很难做到的,因此需要设计有效的冲突解决策略,如开放寻址法、链地址法等。 1. **哈希函数**:哈希函数是哈希表的核心,它的目的是将任意大小的关键字转化为固定大小的哈希值。...
3. 冲突处理:由于哈希函数可能会导致不同的键映射到相同的索引,所以需要解决冲突的方法,如开放寻址法(open addressing)和链地址法(chaining)。开放寻址法是在冲突时寻找下一个空位置,而链地址法则是在每个...
因此,处理冲突的方法也是哈希表设计中的重要环节,常见的处理策略有开放寻址法、链地址法、再哈希法和建立公共溢出区等。 开放寻址法是当冲突发生时,寻找下一个空的哈希地址,直到找到为止。这可能会导致聚集现象...
哈希冲突是哈希表的一个关键问题,当两个不同的输入映射到相同的索引时,通常采用开放寻址法或链地址法来解决。 在C++中,我们可以使用STL中的`std::unordered_map`容器来实现哈希表。`std::unordered_map`提供了一...
处理哈希冲突的常见策略包括开放寻址法和链地址法: - 开放寻址法:当发生冲突时,寻找下一个空的哈希地址,直到找到为止。常见的查找序列有线性探测、二次探测和双哈希探测等。 - 链地址法:在每个数组位置上挂接...
2. 实现开放寻址法或链地址法处理冲突。 3. 编写插入、删除和查找操作的函数。 4. 考虑哈希表的动态扩展,当装载因子(已存储元素数 / 数组大小)超过一定阈值时,进行扩容。 5. 注意内存管理,避免内存泄漏。 理解...
解决冲突的方法有很多,常见的有开放寻址法、链地址法和再哈希法。在C语言中,可以使用指针来实现链地址法,每个数组元素指向一个链表,链表存储所有映射到该位置的键值对。 在C语言中实现哈希表,首先需要定义一个...
其中,开放寻址法是在哈希表中寻找下一个空位置,链地址法是每个槽位用链表连接所有映射至此的元素,再哈希法是使用第二个或更多的哈希函数解决冲突,而公共溢出区则是为所有冲突元素预留一个额外的存储区域。...
常见的解决冲突的方法有开放寻址法(线性探测、二次探测、双散列探测等)和链地址法。链地址法是在每个数组元素处存储一个链表,所有哈希值相同的元素都存储在这个链表中。 3. **哈希表结构**:在C语言中,可以定义...
处理冲突的方法主要有开放寻址法、链地址法、再哈希法和建立公共溢出区等。 1. **开放寻址法**:当发生冲突时,不是在当前位置插入元素,而是寻找下一个空的位置。常见的方法有线性探测再散列、二次探测再散列和双...
3. 冲突解决方法:哈希冲突是哈希表的常见问题,需要选择合适的冲突解决方法,例如开放寻址、链地址法等。 三、哈希表的实现 在C语言中,哈希表可以使用数组和链表来实现。以下是哈希表的实现步骤: 1. 定义哈希...