zoukankan      html  css  js  c++  java
  • 哈希表的应用

    哈希表

    1.基本介绍

    散列表(Hash Table,也叫哈希表),是根据关键码值(Key Value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。

    2.例题

    有一个公司,当有新员工来时,要求将该员工信息加入(id,姓名),当输入id时查询信息

    package com.sratct.hashtable;
    
    public class HashTableDemo {
        public static void main(String[] args) {
            Hashtable hashtable = new Hashtable(7);
            Emp emp1 = new Emp(1, "张三");
            Emp emp2 = new Emp(2, "李四");
            Emp emp3 = new Emp(8, "王五");
            hashtable.add(emp1);
            hashtable.add(emp2);
            hashtable.add(emp3);
            hashtable.getList();
            hashtable.delete(1);
            hashtable.getList();
        }
    }
        // 创建哈希表
        class Hashtable {
            private EmpLinkedList[] empLinkedListArray;
            private int size;
            public Hashtable(int size) {
                this.size = size;
                empLinkedListArray = new EmpLinkedList[size];  // 初始化哈希表
                for (int i=0; i<size; i++) {
                    empLinkedListArray[i] = new EmpLinkedList();  //初始化哈希表中每一个链表
                }
            }
            // 新增雇员
            public void add(Emp emp) {
                int i = hashFun(emp.id);
                empLinkedListArray[i].add(emp);
            }
    
            // 遍历雇员
            public void getList() {
                for (int i=0; i<size; i++) {
                    empLinkedListArray[i].getList();
                }
            }
            // 根据id查找雇员
            public void get(int id) {
                int i = hashFun(id);
                Emp emp = empLinkedListArray[i].get(id);
                if (emp == null) {
                    System.out.println("未找到该雇员");
                } else {
                    System.out.println(emp.id+ ":" + emp.name);
                }
            }
            //删除雇员
            public void delete(int id) {
                int i = hashFun(id);
                empLinkedListArray[i].delete(id);
            }
            //编写散列函数,取模
            private int hashFun(int id) {
                return id % size;
            }
    
        }
    
    
        // 创建雇员表
        class Emp {
            public int id;
            public String name;
            public Emp next;
            public Emp(int id, String name) {
                this.id = id;
                this.name = name;
            }
        }
    
        //创建一个链表,存放雇员
        class EmpLinkedList {
            // 创建一个无头指针的链表,第一个节点就为第一个雇员,默认为null
            private Emp head;
    
             //添加元素
            public void add(Emp emp) {
                // 如果链表为空,直接插入
                if (head == null) {
                    head = emp;
                    return;
                }
                Emp temp = head;
                while (temp.next != null) {
                    temp = temp.next;
                }
                temp.next = emp;
            }
    
            // 遍历雇员
            public void getList() {
                // 判断链表是否为空
                if (head == null) {
                    System.out.println("没有雇员");
                    return;
                }
                Emp temp = head;
                while (temp != null) {
                    System.out.println(temp.id + ":" + temp.name);
                    temp = temp.next;
                }
            }
    
            //根据id查找雇员
            public Emp get(int id) {
                if (head == null) {
                    System.out.println("没有雇员");
                    return null;
                }
                Emp temp = head;
                while (temp != null) {
                    if (temp.id == id) {
                        return temp;  // 找到后返回
                    }
                    temp = temp.next;
                }
                return null;
            }
            // 删除雇员
            public void delete(int id) {
                if (head == null) {
                    System.out.println("没有雇员");
                    return;
                }
                Emp temp = head;
                while (true) {
                    if (temp.id == id) {
                        head = temp.next;
                        return;
                    }
                    if (temp.next.id == id) {
                        temp.next = temp.next.next;
                        return;
                    }
                     if (temp.next == null) {
                         System.out.println("未找到");
                         return;
                     }
                    temp = temp.next;
                }
            }
        }
    
    
  • 相关阅读:
    基础才是重中之重~用好configSections让配置信息更规范
    知方可补不足~开发人员可以自己定义VS文件模版
    基础才是重中之重~开发人员你应该认识一下Web主线程
    将不确定变为确定~.config文件,配置系统未能初始化
    EF架构~多对多关系的实现与更新原理(多主键关系表不见)
    php weblog 构建
    Dom children 属性及childNodes
    php 创建下载链接和中文文件名乱码解决
    hdu 1003 max sum
    http header前为什么不能有空格
  • 原文地址:https://www.cnblogs.com/cqyp/p/14735860.html
Copyright © 2011-2022 走看看