2020年2月24日09:06:11,Hash散列

  • 问题描述
/** 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,* 要求查找到该员工的所有信息.* ?要求: 1)不使用数据库,,速度越快越好=>哈希表(散列)* 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]* 3)使用链表来实现哈希表, 该链表不带表头** */
  • 代码实现
package day0223

/*
* 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,
* 要求查找到该员工的所有信息.
* ?要求: 1)不使用数据库,,速度越快越好=>哈希表(散列)
* 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]
* 3)使用链表来实现哈希表, 该链表不带表头
*
* */

import scala.io.StdIn
import util.control.Breaks._

object HashTabDemo {
    def main(args: Array[String]): Unit = {
        // 创建一个hashTab
        val hashTab = new HashTab(7)
        // 创建一个菜单
        var key = ""
        while (true) {
            println("add:list:find")
            key = StdIn.readLine()
            key match {
                case "add" => {
                    println("请输入ID")
                    val id = StdIn.readInt()
                    println("请输入Name")
                    val name = StdIn.readLine()
                    val emp = new Emp(id, name)
                    hashTab.add(emp)
                }
                case "list" => {
                    hashTab.list()

                }
                case "find" => {
                    println("请输入ID")
                    val id = StdIn.readInt()
                    hashTab.findEmpById(id)
                }
            }
        }
    }

}

// 创建emp类
class Emp(eId: Int, eName: String) {
    val id = eId
    var name = eName
    var next: Emp = null
}

// 创建empLinedList
class EmpLinkedList {
    // 定义头指针,直接指向一个雇员
    var head: Emp = null

    // 添加雇员,雇员的id总是从小到大的排列,都是递增的(找到链表的最后加入即可)
    def add(emp: Emp): Unit = {
        if (head == null) {
            head = emp
            return
        }
        // 定义辅助指针
        var cur = head
        breakable {
            while (true) {
                if (cur.next == null) {
                    break()
                }
                cur = cur.next
            }
        }
        cur.next = emp
    }

    def list(i: Int): Unit = {
        print(s"第${i}条链表的数据为\t")
        if (head == null) {
            println("链表为空")
            return
        }
        // 定义一个辅助的指针
        var cur = head
        breakable {
            while (true) {
                if (cur == null) {
                    break()
                }
                printf("=>id=%d,name=%s\t", cur.id, cur.name)
                cur = cur.next
            }
        }
        println()
    }

    def findEmpById(id: Int): Emp = {
        // 遍历查找
        if (head == null) {
            println("链表为空")
            return null
        }
        var cur = head
        breakable {
            while (true) {
                if (cur == null) {
                    break()
                }
                if (cur.id == id) {
                    break()
                }
                cur = cur.next
            }
        }
        return cur
    }

}

class HashTab(val size: Int) {
    val empLinkedListArr: Array[EmpLinkedList] = new Array[EmpLinkedList](size)
    // 初始化empLinkedListArr中的各个元素
    for (i <- 0 until size) {
        empLinkedListArr(i) = new EmpLinkedList
    }

    def add(emp: Emp): Unit = {
        // 返回该员工应该加入的那条链
        val empLinkedListNo = hashFun(emp.id)
        empLinkedListArr(empLinkedListNo).add(emp)
    }

    def hashFun(id: Int): Int = {
        id % size
    }

    // 遍历整个hash表
    def list(): Unit = {
        println("遍历结果展示开始:")
        for (i <- 0 until size) {
            empLinkedListArr(i).list(i)
        }
        println("遍历结果展示结束")
    }

    def findEmpById(id: Int): Unit = {
        val empLinkedListNo = hashFun(id)
        printf("查找元素散列在第%d线上\n", empLinkedListNo)
        println("查找结果展示开始:")
        val emp = empLinkedListArr(empLinkedListNo).findEmpById(id)
        if (emp != null) {
            printf("=>id=%d,name=%s\n", emp.id, emp.name)
        } else {
            printf("没找到id=%d的雇员信息\n", id)
        }
        println("查找结果展示结束")
    }

}

原文地址:https://www.cnblogs.com/cerofang/p/12355551.html

时间: 2024-11-04 21:07:28

2020年2月24日09:06:11,Hash散列的相关文章

预告/预期/预想/预案 - 2020年3月24日

刚刚在 iOS 里下了一个软件,它给我发了一封邮件,我觉得它说得很不错. 邮件大概的意思是"日拱一卒,功不唐捐",之前其实已经摸了很久,但我还是希望自己也能够做到这样. 本来这个博客是拿来存档电脑的各种改动/配置的,相当于一个复盘用 log,不过现在觉得,在日常记录上,这里也用得上.起码感觉比简书要好一点.毕竟个人还是比较倾向于/习惯于在 pc 上做内容输出工作. 之前想过很久要不要运营自己的 GitHub-pages 站点,但是总是有着各样的顾虑.相比来说,博客园能让我首先将注意力集

static2014年6月9日09:27:29

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Static再谈 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 A a = new A(); 14 a.Hello();//实例对

OOP 2014年6月8日09:45:33

1 /// <summary> 2 /// 字段.方法.属性都可以叫做类的成员Member,它们都需要定义访问级别. 3 /// 访问级别的用处在于控制成员在哪些地方可以被访问,这样达到面向对象中"封装"的目的. 4 /// public:公共成员,完全公开,没有访问限制: 5 /// private:默认级别.私有成员, 在类的内部才可以访问: 6 /// internal:当前程序集内可以访问: 7 /// protected:保护成员,该类内部和继承类中可以访问. 8

全球域名商(国际域名)解析新增量排名(6月24日)

IDC评述网(idcps.com)06月29日报道:根据DailyChanges公布的最新数据显示,在2015年6月24日,全球域名解析新增量大战中,位居前三的分别是DOMAINCONTROL.COM.中国万网与DNSPod,解析新增量依次为35,727.5,943.3,405个.环比上期,DNSPod排名上升1位.接下来,请看IDC评述网整理的详细数据分析. (图1)全球域名解析商(国际域名)解析新增量Top20分布图 如图1所示,在6月24日全球域名解析市场中,DOMAINCONTROL.C

微信公众号智能绑定功能实现(2014年10月24日 更新)

微信公众号智能绑定功能实现(2014年10月24日 更新) 继微信企业号公布后,腾讯改动了公众号的接入方式,在之前的基础上加入了2个表单,之前版本号的智能绑定失效了! 在文章 微信公众号之智能绑定实现初始版本号  的基础上改动,新增腾讯这次添加的表单,本次新增的表单有: encoding_aeskey :EncodingAESKey(消息加解密密钥.长度43位!) callback_encrypt_mode: 消息加解密方式(0:明文模式.1:兼容模式.3:安全模式(推荐)) operation

高级学员:2015年10月24日作业

高级学员:2015年10月24日作业一.信息安全系统和安全体系1.信息安全系统三维空间示意图中,X.Y.Z轴的名称,及它们各自包括的内容:2.MIS+S.S-MIS.S2-MIS的特点分别有哪些:二.信息安全风险评估1.什么是威胁:2.什么是脆弱性(弱点):3.什么是影响三.安全策略1.安全策略的核心内容是哪七定:2.<计算机信息安全保护等级划分准则>将信息系统分为哪5个安全保护等级,以及它们的适用范围:四.信息安全技术基础1.常见的对称密钥算法有哪些?它们的优缺点:2.常见的非对称密钥算法有

OOP 2014年6月8日09:54:07

1 [1] //new的操作相当于根据类的定义在内存中创建一块独立的区域 2 //所以两个对象修改各自的属性不受影响. 3 4 Person p1 = new Person(); 5 p1.Height = 180;//修改p1指向的对象的Height属性的值为180 6 7 Person p2 = new Person(); 8 p2.Height = 190; 9 10 Console.WriteLine(p1.Height);//输出180 11 Console.WriteLine(p2.

2014年6月7日09:44:05

1 //int i传进来的的时候是复制了一份传进来,折腾的是复制品 2 static void DotIt(int i) 3 { 4 Console.WriteLine(i); 5 i++; 6 Console.WriteLine(i); 7 } 8 9 int i1 = 1; 10 DotIt(i1); 11 Console.WriteLine(i1); 12//输出结果为1 2 1 1 static void Swap(int i1, int i2) 2 { 3 int temp = i1;

5月24日,HCNP弹射起步

同学们请注意,有辆AE86要上山了. 这次叶司机带你学网络已经到HCNP的难度 就好比秋名山的九节发卡弯 充满着挑战又散发着独特的魅力 HCNP即将弹射起步,各位同学请坐稳手扶好~ 讲师:叶焕新 知行网络创办人,RS和ISP方向互联网认证专家,目前专注于思科认证与华为认证培训,致力于提高网络从业人员的实战能力,独特的上课风格以及妙趣横生的段子带你学习最新.最实用的技术技巧,为你剖析解密网络工程师的世界. 往期学员评价: 上课时间: 2017年5月24日起,每周一.三.六(仅周六下午晚上两次课)晚