性能分析:
散列表中条目数的比例较小时,使用线性探查法的效率较高.
package Hash;
import java.nio.BufferOverflowException;
/**
* 散列表的设计
* 线性探查法(linear probing)
* @author baby69yy2000
*/
public class LinearProbingHash<T> {
private T[] table;
private int tableCapacity;
private int size;
public LinearProbingHash(int tableSize) {
table = (T[]) new Object[tableSize];
this.tableCapacity = tableSize;
size = 0;
}
public void add(T item) {
int index, origIndex;
index = (item.hashCode() & 0x7FFFFFFF) % tableCapacity;
origIndex = index;
do {
if(table[index] == null) {
table[index] = item;
size++;
return;
}else
index = (index + 1) % tableCapacity;
} while(index != origIndex);
throw new BufferOverflowException();
}
public boolean contains(T item) {
return (find(item) < 0)? false: true;
}
public int size() {
return size;
}
private int find(T item) {
int index, origIndex;
index = (item.hashCode() & 0x7FFFFFFF) % tableCapacity;
origIndex = index;
do {
if(item.equals(table[index]))
return index;
else
index = (index + 1) % tableCapacity;
if(index == origIndex)
return -1;
} while(index != origIndex);
return -1;
}
public String toString() {
int max = tableCapacity - 1;
StringBuffer buf = new StringBuffer();
buf.append("[");
for(int i = 0; i < tableCapacity; i++) {
if(table[i] != null) {
buf.append(table[i]);
if(i < max)
buf.append(", ");
}
}
buf.append("]");
return buf.toString();
}
public static void main(String[] args) {
LinearProbingHash<Integer> lp = new LinearProbingHash<Integer>(10);
lp.add(new Integer(54));
lp.add(new Integer(77));
lp.add(new Integer(94));
lp.add(new Integer(89));
lp.add(new Integer(14));
lp.add(new Integer(45));
lp.add(new Integer(35));
lp.add(new Integer(76));
System.out.println(lp); // [35, 76, 54, 94, 14, 77, 45, 89]
System.out.println(lp.contains(new Integer(45))); // true
System.out.println(lp.size()); // 8
}
}
分享到:
相关推荐
《散列表线性探查实验报告》 散列表是一种数据结构,它提供了快速存取、插入和删除元素的能力。在本实验中,我们探讨了两种处理冲突的方法:线性探查和拉链法。这两种方法都是为了确保在哈希函数产生相同哈希值时,...
总结起来,线性探查是散列表处理冲突的一种基础方法,虽然在高负载下性能可能下降,但通过合理的设计和优化,仍能在许多场景下提供高效的服务。理解并掌握线性探查,有助于我们更好地理解和使用散列表这一强大的数据...
### 散列表(Hashing)概述 在计算机科学领域中,散列表是一种高效的数据结构,用于存储和检索数据。其核心思想是通过一种特定的...通过对散列函数的设计和冲突解决策略的选择,可以有效地管理和优化散列表的性能。
实验结果将揭示在特定负载因子下,链接法和开放寻址法的优劣,有助于理解这两种方法在实际场景中的适用性和性能表现,为优化散列表的设计提供依据。 综上所述,散列表实验报告不仅深入探讨了散列函数和碰撞解决机制...
本文将基于提供的部分内容,详细介绍散列表的基本原理、散列函数的设计以及解决冲突的方法。 ### 直接寻址表 #### 定义 直接寻址表是一种简单的数据结构,其中每个位置代表一个可能的关键字。如果某个关键字对应的...
1. 线性探查(Linear Probing):这是一种开放寻址法,当发现某个位置已经被占用时,线性探查会依次检查下一个位置,直到找到空位或达到数组边界。例如,如果索引i已被占用,则会尝试i+1,然后i+2,依此类推。这种...
选取哈西函数h(k)=k%11,用线性探测在散列方法处理冲突。是在0-10的散列地址中,对关键序列(22,41,53,46,30,01,67)构造哈希表并求等概率情 况下查找成功与不成功过的平均查找长度
这种算法适用于动态散列表,当一个元素的原始散列位置被其他元素占用时,它会沿着散列表线性地寻找下一个空闲的位置。 在这个算法中,`h(k)` 是散列函数,用于将输入值 `k` 映射到散列表的一个位置。散列表通常是一...
在散列表中,有三种常用的冲突解决方法:线性探查法、双散列法和开散列法(链地址法)。 1. 线性探查法 线性探查法是一种简单的冲突解决方法。当冲突发生时,探查下一个索引直到找到空闲的位置。在上面的例子中,H...
散列表,又称为哈希表,是一种高效的数据结构,其设计初衷在于通过关键码值(Key value)直接访问数据,从而极大提升数据检索速度。哈希表的核心在于“散列函数”(Hash function),该函数负责将关键码映射至表内的...
VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它极大地扩展了Excel的功能,使得用户可以通过编写代码来自动化重复性任务。在"Excel精讲专题-VBA变量"这个视频教程中,我们将...
- 插入操作通过线性探查解决冲突,如果关键字已经存在,就寻找下一个空位置。 - 删除操作需遍历数组,移动相同关键字的元素,直至找到要删除的关键字,然后移除。 - 时间复杂度为O(n),因为最坏情况下可能需要...
针对散列表中的冲突问题,主要有两种解决方法:开放地址法和拉链法。其中,拉链法是一种较为常用的解决方案。 ##### 拉链法 拉链法的基本思路是在每个散列位置上设置一个单链表,当发生冲突时,将冲突的元素插入该...
此外,题目还涉及到拓扑排序、广义表的深度、二叉树的先序和中序遍历、队列的操作特性、散列表的构造和搜索性能(如线性探查法解决冲突)、排序算法(如快速排序和二路归并排序)以及算法的时间复杂度分析(例如双重...
开放定址法是指当发生冲突时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键码,或者碰到一个开放的地址为止(如未填入任何记录的空地址或填过了又删除了...
- 要求设计散列表长 `m`,用除余法设计一个散列函数,构造散列表,并计算查找成功的平均查找长度及查找失败时的平均查找长度。 2. **实验步骤**: - **散列表设计**:设定散列表长度为 18。 - **散列函数**:...
这意味着为了保持良好的性能,散列表的大小应设计为大约250/0.8=312.5,向上取整为313。 综上所述,这些知识点涉及了数据结构中的判定树、查找效率的计算、分块查找策略、B-树和B+树的区别、哈希表的构建与冲突解决...