`
李媛媛liyuanyuan
  • 浏览: 15178 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

初识“哈希”

    博客分类:
  • hash
阅读更多
今天刚刚写了一下有关哈希链表的代码:感觉还是挺简单的,虽然我的是没啥技术含量的因为我没有解决哈希表冲突的问题,不过以后会解决的,解决的方法就是“挂链”。



其实我是不能说很了解hash的,我只是把它当做数组与链表的结合,数组为主,链表在数组上,我按我的理解把它实现出来,它的形式就是一个一定长度的数组加上n条链表。

首先我先简单介绍一下我所知道哈希链表:

哈希表是基于数组的,用于存储大批量的数据;如果说数组是查找数据的能手,链表是
增删数据的能手,那么哈希表便是奉行的我们中国的“中庸之道”。他可以说是数组与链表的结合。

如果你不追求完美的话,只想着体验一下哈希表,那么建立一个哈希表其实很简单:你只需要一个节点类和一个方法类就可以。
一下是节点类:
public class Student {
	//声明学生的属性
	private String name ;
	private int namber ;
	private Student stuNext ;
/**
 * 构造方法
 * @param name
 */
	public Student(String name,int namber){
		this.name = name ;
		this.namber = namber ;
	}
	

	public void setName(String name){
		this.name = name ;
		
		
	}
	public String getName(){
		return name ;
	}
	
	
	public void setNamber(int namber){
		this.namber = namber;
		
		
	}
	public int getNumber(){
		return namber ;
	}
	
	public void setStu(Student stuNext){
		this.stuNext = stuNext ;
	}
	public Student getStu(){
		return stuNext;
	}

}

其实方法类也就是包括最基本的增删改查的类,理想情况下 ,用递归方法比较好,但是由于我当时没有想到如何用递归方法所以我采用的是其他方法。
这里我只展示其中一部分代码(增,查)

其中方法可以根据个人的想法来写并没有固定模式,这里我用的是取余法。
/**
	 * 添加student的方法
	 */
	public void add(Student stu) {
		int key = stu.getNumber();
		int index = key % 7;

		if (hashline[index] == null) {

			hashline[index] = stu;
			//System.out.println("hashline[index]=" + hashline[index].getName());

		} else if (hashline[index] != null) {

			Student stu1 = this.getFinal(hashline[index]);
			System.out.println("stu111"+stu1);
			stu1.setStu(stu);
			System.out.println("stu1=" + stu1.getStu().getName());

		}
		//
	}



/**
	 * 查找的方法
	 */
	public Student find(int key) {
		int index = key % 7;
		if(hashline[index]==null){
			System.out.println("没有此人!");
			return null;
		}
		Student stu = hashline[index];
		int i = 0;
		if (this.getlenght(stu) == 0) {
			System.out.println("没有此人");
			return null;
		}
		while (i != this.getlenght(stu)) {
			if (stu == null) {
				System.out.println("没有此人");
								return null;
			} else if (stu != null) {
				if (stu.getNumber() == key) {
					return stu;
				} else {
					stu = hashline[index];
				}
			}
			i++;
			System.out.println("i=" + i);
		}

		return null;
	}

特别提示:用递归方法比较好,这个方法一不注意就有可能报空。里面有一些嵌套的方法没有给出。

测试:
public static void main(String[] args) {
		HashLine hf = new HashLine();
		//
		Student stu1 = new Student("张三", 01);
		Student stu2 = new Student("里斯", 02);
		Student stu13 = new Student("王五", 05);
		Student stu3 = new Student("liuzi", 8);
		Student stu4 = new Student("起", 9);
		Student stu5 = new Student("吧", 11);
		Student stu6 = new Student("就", 15);

		hf.add(stu13);
		hf.add(stu2);
		hf.add(stu1);
		hf.add(stu3);
		hf.add(stu6);
		hf.add(stu4);
		hf.add(stu5);
		System.out.println("找到此人 " + hf.find(01).getName());
				 hf.find(13);

	}

输出结果为:找到此人张三 
            没有此人



分享到:
评论

相关推荐

    头歌初识redis答案

    - **丰富的数据结构**:Redis支持多种数据结构,包括字符串(Strings)、列表(Lists)、集合(Sets)、哈希(Hashes)和有序集合(ZSets),这些数据结构能够满足不同应用场景的需求。 - **持久化机制**:提供了RDB(Redis ...

    头歌初识redis答案.rar

    在初识Redis的过程中,我们通常会关注以下几个关键知识点: 1. **数据类型**:Redis支持五种基本数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。每种类型都有其独特的...

    初识Git&Gerrit.pptx

    初识 Git&Gerrit Git 是一种分布式的代码管理工具,不需要中心服务器,在没有网络的情况下也能进行版本管理。Git 与 SVN 相比,有许多不同的理念设计。Git 的分支策略不同于 SVN,Git 的分支创建、切换都非常简单。...

    初识memcached

    相比于简单的余数计算,一致性哈希能更好地处理服务器动态增减的情况,减少了数据重新分布的次数,从而降低了缓存失效的影响。 4. **LRU(Least Recently Used)数据清理策略**: 当内存空间不足时,Memcached采用...

    redis初识

    Redis初识:深入理解键值存储数据库 Redis是一款开源、高性能、基于键值对的数据存储系统,常用于数据缓存、消息队列以及数据库持久化等场景。它以内存为数据存储介质,支持多种数据结构,如字符串、哈希、列表、...

    头歌初识redis答案.docx

    ### 头歌初识Redis知识点详解 #### 一、Redis基础知识概述 Redis是一种开源的、高性能的键值存储系统,以其快速的数据存取速度而著称。它支持多种数据结构,能够满足不同的应用场景需求。 - **数据库管理**: - ...

    前端开源库-hashmap

    在前端开发中,数据结构和算法的高效使用对于优化代码性能至关重要。`HashMap`作为一种常见的数据结构,它在JavaScript中的应用广泛,...同时,`README.md`文件通常会提供安装、使用和贡献指南,是初识项目的好起点。

    Beginning Perl

    《初识Perl》是官方推荐的一本入门级Perl编程教材,专为那些希望涉足Perl编程领域的初学者设计。Perl是一种强大的、灵活的脚本语言,广泛应用于文本处理、系统管理、网络编程以及Web开发等多个领域。这本书深入浅出...

    Redis实战《红丸出品》

    - **hashes类型及操作**:包括`hset`(设置哈希表键字段的值)、`hsetnx`(只有在字段不存在时才设置哈希表键字段的值)、`hmset`(同时设置哈希表中多个字段的值)、`hget`(获取哈希表中字段的值)、`hmget`(获取...

    Redis实战中文

    **1.3 初识Redis** - **数据类型**:Redis提供了五种主要的数据类型,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(ZSet),每种类型都有其独特的应用场景。 - **持久化**:Redis支持两种...

    redis实战.pdf

    **1.3 初识Redis** - **数据类型**:Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Sorted Set)。 - **持久化**:为了防止数据丢失,Redis提供了两种持久...

    Redis实战 中文完整版

    ##### 1.3 初识Redis **1.3.1 数据类型** Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Sorted Set)。这些丰富的数据结构使得Redis不仅可以用作简单的...

    杭州电子科技大学ACM课件

    首先,"初识ACM.ppt"为入门者提供了ACM竞赛的基本介绍,包括ACM/ICPC的起源、比赛形式、参赛规则等,帮助新手理解这个比赛的背景和意义。它还可能涵盖了如何组建团队、训练方法以及竞赛中需要注意的事项,为初学者...

    Redis实战.pdf

    #### 三、初识Redis - **1.3.1 数据类型** - Redis支持多种数据类型,如字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。 - **1.3.2 持久化** - Redis提供了两种持久化方式:RDB...

Global site tag (gtag.js) - Google Analytics