散列表描述


public class HashTable {

	public static final int CAPACITY = 10;
	private Node[] value = null;

	public static void main(String[] args) {
		HashTable hashtable = new HashTable();
		hashtable.insertData(22);
		hashtable.insertData(22);
		hashtable.insertData(123);
		hashtable.insertData(436);
		hashtable.insertData(55);
		hashtable.insertData(157);
		hashtable.insertData(235);
		hashtable.insertData(256);
		hashtable.insertData(525);
		hashtable.insertData(724);
		hashtable.insertData(278);
		hashtable.insertData(209);
		hashtable.insertData(67);
		hashtable.insertData(54);
		hashtable.insertData(546);
		hashtable.insertData(350);
		hashtable.insertData(101);
		hashtable.insertData(23);
		hashtable.printHashTable();
		hashtable.deleteData(55);
		hashtable.deleteData(350);
		hashtable.printHashTable();

	}

	public HashTable() {
		value = new Node[CAPACITY];
	}

	//在哈希表中查找数据
	private Node searchData(int data) {
		Node node = value[data % CAPACITY];
		if(null == node) {
			return null;
		}

		while(node != null) {
			if(data == node.key) {
				return node;
			}
			node = node.next;
		}
		return null;
	}

	//插入数据
	private boolean insertData(int data) {
		Node nd = value[data % CAPACITY];
		if(null == nd) {
			Node node = new Node(data);
			value[data % CAPACITY] = node;
			return true;
		}
		//如果已经有这个值了,插入无效
		if(null != searchData(data)) {
			return false;
		}
		while(nd.next != null) {
			nd = nd.next;
		}
		nd.next = new Node(data);
		return true;
	}

	private boolean deleteData(int data) {
		Node head = value[data % CAPACITY];
		Node node = searchData(data);

		if(null == head || null == node) {
			return false;
		}

		if(node == head) {
			//删除时要注意,head只是栈内存中的引用
			value[data % CAPACITY] = head.next;
			return false;
		}
		while(node != head.next) {
			head = head.next;
		}
		head.next = node.next;
		return true;
	}

	void printHashTable()
	{
		int i=0;

	    System.out.println("[Hash idx]     [value]");
	    do {
	    	System.out.print("   "+i+"-------------");
	        if(null == value[i]) {
	            i++;
	            System.out.println("NULL");
	            continue;
	        }
	        Node node = value[i];

	        while(node != null) {
	        	System.out.print(node.key+" ");
	            node = node.next;
	        }
	        System.out.println();
	        i++;
	    } while (i<10);

        System.out.println();
	}

	private static class Node {
		int key = 0;
		Node next = null;
		public Node(int key) {
			this.key = key;
		}
	}
}

时间: 2024-10-12 22:09:41

散列表描述的相关文章

算法导论-散列表(Hash Table)

目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内容 1.引言 如果想在一个n个元素的列表中,查询元素x是否存在于列表中,首先想到的就是从头到尾遍历一遍列表,逐个进行比较,这种方法效率是Θ(n):当然,如果列表是已经排好序的话,可以采用二分查找算法进行查找,这时效率提升到Θ(logn);  本文中,我们介绍散列表(HashTable),能使查找效率

[Linux] Linux进程PID散列表

linux系统中每个进程由一个进程id标识,在内核中对应一个task_struct结构的进程描述符,系统中所有进程的task_struct通过链表链接在一起,在内核中,经常需要通过进程id来获取进程描述符,最简单的方法可以通过遍历task_struct链表并对比id的值来获取,但这样效率太低,尤其当系统中运行很多个进程的时候. linux内核通过PID散列表来解决这一问题,能快速的通过进程ID获取到进程描述符. PID散列表包含4个表,因为进程描述符包含了表示不同类型PID的字段,每种类型的PI

[C++]实现散列表的分离链接法的数据结构

散列表,英文叫做Hash Table,因此也叫哈希表,是一种根据关键字值来确定主存中存储位置的数据结构.通过一个散列函数(关于键值的函数),来确定存储该关键字的位置. 主要的方法有: 1.分离链接法(拉链法) 分离链接法的散列函数为 position = key % n. 即关键字的存储位置为关键字的值对表项的数量取模.若表项大小为13,对于关键值为27的项,存储在1(27 % 13 = 1)的表项处.为了减少冲突,n往往取素数.对于同余的关键字,采用 队列(链表) 的方式连接在一起,新放入的元

算法导论第十一章 散列表

一.散列表的概念 本章介绍了散列表(or hash table)的概念.散列函数的设计及哈希冲突的处理.散列表(为了形象描述,我们通常叫槽)从表意上看是一种数据结构,但把它归为算法思想更为贴切.对于大部分的查找问题,使用散列表能达到O(1)的效率.现在很多大公司在面试大数据的题目时,解决方案里绝对少不了散列表的思想,例如百度的一道面试题:Top K查找问题: 问题描述: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万个记录(这

数据结构与算法——散列表类的C++实现(分离链接散列表)

散列表简介: 散列表的实现常被称为散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术. 散列的基本思想: 理想的散列表数据结构只不过是一个包含一些项的具有固定大小的数组.(表的大小一般为素数) 设该数组的大小为TbaleSize,我们向该散列表中插入数据,首先我们将该数据用一个函数(散列函数)映射一个数值x(位于0到TbaleSize1-1之间):然后将该数据插入到散列表的第x的单元.(如果有多个数据映射到同一个数值,这个时候就会发生冲突) 散列函数介绍: 为了避免散列函数生成的值不是

散列表的基本原理与实现

本篇博文主要介绍散列表(Hash Table)这一常见数据结构的原理与实现.由于个人水平有限,文章中难免存在不准确或是不清晰的地方,希望大家可以指正:) 一.概述 符号表是一种用于存储键值对(key-value pair)的数据结构,我们平常经常使用的数组也可以看做是一个特殊的符号表,数组中的“键”即为数组索引,值为相应的数组元素.也就是说,当符号表中所有的键都是较小的整数时,我们可以使用数组来实现符号表,将数组的索引作为键,而索引处的数组元素即为键对应的值,但是这一表示仅限于所有的键都是比较小

数据结构学习——散列表ADT(程序化)

不知道大家在刚开始看<数据结构与算法分析--C语言描述>散列一章的时候,能不能理解书上的内容,小ZZ看的时候就没怎么看明白.于是就去问度娘,度娘给了我这样一篇文章.里面介绍了散列的基本定义以及常用的实现方法,比较通俗易懂(可能是智商有点拙计). http://blog.csdn.net/u010275850/article/details/44963701 先看完了这篇博文,然后再看书上的结论,顿时恍然大悟有木有啊. 参考了书上的程序思路,下面将散列表的常用操作程序化如下: /*分离链接法构造

小橙书阅读指南(十一)——散列表

算法描述:散列表是一种在时间和空间上做出权衡的查找算法.使用查找算法分为两步.第一步是通过散列函数将被查找的键转化未数组的一个索引.理想情况下,不同的键都能转为不同的索引值.当然,这只是理想情况,所以我们需要面对两个或多个键都被散列到相同索引值的情况.因此,散列查找的第二部就是处理碰撞冲突的过程. 一个比较令人满意的散列函数能够均匀并独立地将所有键散布于0到M-1之间. 一.基于拉链法的散列表 算法图示: 拉链散列表算法的本质是将哈希值相同的键保存在一个普通链表中,当我们需要调整数组长度的时候,

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl