`
baby69yy2000
  • 浏览: 187882 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

散列表的设计-->线性探查法

    博客分类:
  • Util
阅读更多
性能分析:
散列表中条目数的比例较小时,使用线性探查法的效率较高.

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)

    ### 散列表(Hashing)概述 在计算机科学领域中,散列表是一种高效的数据结构,用于存储和检索数据。其核心思想是通过一种特定的...通过对散列函数的设计和冲突解决策略的选择,可以有效地管理和优化散列表的性能。

    散列表实验报告(不同装载因子下的链表法和开放寻址法的对比)

    实验结果将揭示在特定负载因子下,链接法和开放寻址法的优劣,有助于理解这两种方法在实际场景中的适用性和性能表现,为优化散列表的设计提供依据。 综上所述,散列表实验报告不仅深入探讨了散列函数和碰撞解决机制...

    算法导论总结:散列表

    本文将基于提供的部分内容,详细介绍散列表的基本原理、散列函数的设计以及解决冲突的方法。 ### 直接寻址表 #### 定义 直接寻址表是一种简单的数据结构,其中每个位置代表一个可能的关键字。如果某个关键字对应的...

    哈希表的建立和查找

    1. 线性探查(Linear Probing):这是一种开放寻址法,当发现某个位置已经被占用时,线性探查会依次检查下一个位置,直到找到空位或达到数组边界。例如,如果索引i已被占用,则会尝试i+1,然后i+2,依此类推。这种...

    选取哈西函数h(k)=k%11,用线性探测在散列方法处理冲突。是

    选取哈西函数h(k)=k%11,用线性探测在散列方法处理冲突。是在0-10的散列地址中,对关键序列(22,41,53,46,30,01,67)构造哈希表并求等概率情 况下查找成功与不成功过的平均查找长度

    8-19算法L1

    这种算法适用于动态散列表,当一个元素的原始散列位置被其他元素占用时,它会沿着散列表线性地寻找下一个空闲的位置。 在这个算法中,`h(k)` 是散列函数,用于将输入值 `k` 映射到散列表的一个位置。散列表通常是一...

    Ch6部分习题解答1

    在散列表中,有三种常用的冲突解决方法:线性探查法、双散列法和开散列法(链地址法)。 1. 线性探查法 线性探查法是一种简单的冲突解决方法。当冲突发生时,探查下一个索引直到找到空闲的位置。在上面的例子中,H...

    散列表(哈希表).

    散列表,又称为哈希表,是一种高效的数据结构,其设计初衷在于通过关键码值(Key value)直接访问数据,从而极大提升数据检索速度。哈希表的核心在于“散列函数”(Hash function),该函数负责将关键码映射至表内的...

    【视频】Excel精讲专题-VBA变量

    VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它极大地扩展了Excel的功能,使得用户可以通过编写代码来自动化重复性任务。在"Excel精讲专题-VBA变量"这个视频教程中,我们将...

    201700130009_张愈博_实验81

    - 插入操作通过线性探查解决冲突,如果关键字已经存在,就寻找下一个空位置。 - 删除操作需遍历数组,移动相同关键字的元素,直至找到要删除的关键字,然后移除。 - 时间复杂度为O(n),因为最坏情况下可能需要...

    【课件】7.5.3_1处理冲突的方法_拉链法.pdf

    针对散列表中的冲突问题,主要有两种解决方法:开放地址法和拉链法。其中,拉链法是一种较为常用的解决方案。 ##### 拉链法 拉链法的基本思路是在每个散列位置上设置一个单链表,当发生冲突时,将冲突的元素插入该...

    数据结构试题B(03)1

    此外,题目还涉及到拓扑排序、广义表的深度、二叉树的先序和中序遍历、队列的操作特性、散列表的构造和搜索性能(如线性探查法解决冲突)、排序算法(如快速排序和二路归并排序)以及算法的时间复杂度分析(例如双重...

    广工数据结构实验报告

    开放定址法是指当发生冲突时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键码,或者碰到一个开放的地址为止(如未填入任何记录的空地址或填过了又删除了...

    数据结构实验报告

    - 要求设计散列表长 `m`,用除余法设计一个散列函数,构造散列表,并计算查找成功的平均查找长度及查找失败时的平均查找长度。 2. **实验步骤**: - **散列表设计**:设定散列表长度为 18。 - **散列函数**:...

    第五、六章部分习题答案1

    这意味着为了保持良好的性能,散列表的大小应设计为大约250/0.8=312.5,向上取整为313。 综上所述,这些知识点涉及了数据结构中的判定树、查找效率的计算、分块查找策略、B-树和B+树的区别、哈希表的构建与冲突解决...

Global site tag (gtag.js) - Google Analytics