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;
                }
            }
        }
    
    
  • 相关阅读:
    2014年互联网发展趋势如何
    服务器出现阶段性错误
    用互联网思想武装自己
    杭州互联网公司汇总
    互联网牛人网址大全
    ffmpeg开发指南
    Windows下FFmpeg快速入门
    FFmpeg介绍及参数详细说明
    windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
    FFMPEG视音频编解码零基础学习方法 【荐】
  • 原文地址:https://www.cnblogs.com/cqyp/p/14735860.html
Copyright © 2011-2022 走看看