20172319 2018.10.19 《Java程序设计教程》第7周课堂实践

  • 课程:《程序设计与数据结构》
  • 班级:1723
  • 学生:唐才铭
  • 学号:20172319
  • 指导老师:王志强
  • 日期:2018.10.19
  • 必修/选修:必修

目录


测试内容

  • 三种查找算法练习:
  • 给定关键字序列:11,78,10,1,3,2,4,21,试分别用顺序查找折半查找散列查找 (用线性探查法和链地址法)来实现查找。试画出它们的对应存储形式(顺序查找的顺序表,二分查找的顺序表,两种散列查找的散列表),并求出每一种查找的成功平均查找长度。其中,散列函数H(k) = k%11。
    (本次作业6分,每种算法2分,包括画出存储形式和ASL的计算。)

测试要求

  • 完成蓝墨云班课上的三种查找算法练习任务;并截图(类代码,测试代码,运行结果代码)发送至蓝墨云

  • 返回目录


实验步骤

需求分析

  1. 需要了解、掌握与三种查找相关的知识。
  2. 需要了解、掌握散列查找在发生冲突时的解决方法。
  3. 了解ASL是什么?

相关知识

  • 顺序查找折半查找ASL 此前在第五周学习总结第6周课堂实践中阐述过,这里不再做多余的叙述。

    散列查找:

  • 哈希表(Hash table,也叫散列表),根据关键码值(Key value)而直接进行访问的数据结构。即通过将关键码值映射到表中的一个位置来访问记录,以加快查找的速度。 。 映射函数称为散列函数 , 存放记录的数组称为 散列表
  • 例如:
  • 散列函数为:H(key)= key mod p (p = 11)
  • 对于元素: 17,21,41,38,25。
  • 可通过散列函数来确定其在表中的位置,如对于元素25,H(25)= 25%11 = 3,即其在表中处于第3位。
  • 索引 0 1 2 3 4 5 6 7 8 9 10 11 12
    元素 25 38 17 41 21
  • 而有些时候会发生这样一种情况:H(key1)= H(key2),key1≠key2。
  • 即在表中发生了冲突 ,这是不可避免的。
  • 介绍几个与其相关的因素:
  • 装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称a=n/m为散列表的填装因子,一般情况下0.6<a<0.9为宜,a越大越有可能发生冲突。
  • p:一般为素数,设散列表空间大小为n,则1.1n<p<1.7n为宜,这样可以尽可能避免发生冲突。

    处理冲突的几种方法

  • 举例:在长度为12的哈希表中已填有关键字分别为17,60,29的记录,(哈希函数H(key)= key MOD 11),现有第四个记录,其关键字为38,由哈希函数得到哈希地址为5,发生冲突。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 60 17 29

开发地址法:给元素换个位置。

  • 一旦产生冲突(该地址已有其他元素),就按照某种规则去寻找另一个空地址。
  • 若发生了第i 次冲突,试探的下一个地址将增加d
  • h (key) = (h(key)+ d ) mod TableSize (1< i < TableSize )
  • d 决定了不同的解决冲突方案:

    线性探测法:
  • d = i
  • 以增量序列1,2,3 …… (TableSize - 1)循环试探下一个存储地址。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 60 17 29 38
    二次探测法:
  • d = i 2
  • 以增量序列1 2 ,-1 2 ,2 2,-2 2 ,3 2 ,-3 2 …… q 2 ,-q 2 循环试探下一个存储地址;q≦【TableSize/2】。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 38 60 17 29
    伪随机探测再散列:
  • d = 伪随机数序列
  • 以伪随机数序列循环试探下一个存储地址。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 38 60 17 29

链地址法:

  • 开发地址法利用的是表中的剩余空间,如果空间不足,那其将无法处理冲突也无法插入数据,因此此刻需要装填因子≧1。
  • 原理:遇到冲突时,会在原地址新建一个空间,然后以链表节点的形式插入到该空间里。

  • 索引 元素
    0
    1
    2
    3
    4
    5 60 38
    6 17
    7 29
    8
    9
    10
  • 返回目录


实现及解释

  • 关键字序列:11,78,10,1,3,2,4,21。
  • 散列函数: H(k) = k%11。

    线性查找:

  • 索引 0 1 2 3 4 5 6 7
    元素 11 78 10 1 3 2 4 21
    查找次数 1 2 3 4 5 6 7 8
  • ASL = (1 +2 +3 +4 +5 +6 +7 +8)/ 8 = 4.5

    折半查找:

  • 索引 0 1 2 3 4 5 6 7
    元素 11 78 10 1 3 2 4 21
  • 索引 0 1 2 3 4 5 6 7
    元素 1 2 3 4 10 11 21 78
    查找次数 3 2 3 1 3 2 3 4
  • 因为所查找的元素为偶数,所以中值元素为4或10,无论是4还是10,不影响查找的结果。
  • 这里把4当成中值,判定树如下:
  • ASL = (1x1 + 2x2 + 4x3 + 1x4) / 8 = 2.625

散列查找:

  • 开发地址法:
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 11 78 1 3 2 4 21 10
    查找次数 1 1 2 1 3 2 8 1
  • ASL = (1 + 1 + 2 + 1 + 3 + 2 + 8 + 1 ) / 8 = 2.375

  • 链地址法:

  • 查找次数(头) 查找次数(节点) 索引 元素
    1 0 11
    1 2 1 78 1
    1 2 2
    1 3 3
    1 4 4
    5
    6
    7
    8
    9
    1 2 10 10 21
  • ASL = (6x1 + 2x2)/8 = 1.25

  • 返回目录


错误分析

已提交至蓝墨云上的错误:

  1. 除余错误:21%11=9.。。。٩(º﹃º٩)
  2. 索引标识错误。
  3. 查找错误:在开发地址中先放置好相应元素,再对有冲突元素进行处理;如当11、78、10处在了其相应位置后,对冲突元素1不做处理,直接放3,接着对冲突元素2不做处理,直接放4.

参考资料

20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)的更多相关文章

  1. 《Java程序设计》第12周课堂实践总结

    <Java程序设计>第12周课堂实践总结 实践一 教材代码检查-p98 要求 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 提交在IDEA或命令行中运行结查截 ...

  2. 《Java程序设计》第15周课堂实践总结

    <Java程序设计>第15周课堂实践总结 实践一 教材代码检查-p242 要求 在IDEA中或命令行中运行P242 StackTraceDemo2.java 代码运行结果和教材一致吗?为什 ...

  3. 20155233 《Java程序设计》 第十一周课堂练习总结

    20155233 <Java程序设计> 第十一周课堂练习总结 测试题目 1.修改教材P74 一行代码 NineNineTable.java, 让执行结果是个三角形: 提交在IDEA或命令行 ...

  4. 20175316盛茂淞 《java程序设计》第三周课堂测试错题总结

    20175316盛茂淞 <java程序设计>第三周课堂测试错题总结 出现问题 错题总结 题目1 在Ubuntu中用自己的有位学号建一个文件,教材p87 Example4_15 1. 修改代 ...

  5. 20155233 《Java程序设计》 第十三周课堂练习总结

    20155233 <Java程序设计>第十三周课堂练习总结 测试题目 测试1 在IDEA中对P145 MathTool.java 使用JUnit进行单元测试,测试用例不少于三个,要包含正常 ...

  6. 最近准备把安卓和java的知识再回顾一遍,顺便会写博客上!千变万化还都是源于基础,打扎实基础

    最近准备把安卓和java的知识再回顾一遍,顺便会写博客上!千变万化还都是源于基础,打扎实基础,加油吧 距离去北京还有23天

  7. 20172319 2018.10.12《Java程序设计教程》第6周课堂实践(补写博客)

    20172319 2018.10.12 <Java程序设计教程>第6周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  8. 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)

    20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  9. 20145209刘一阳《JAVA程序设计》第八周课堂测试

    第八周课堂测试 1.下面代码中共有(C)个线程? public class ThreadTest { public static void main(String args[]){ MyThread ...

随机推荐

  1. ASP.NET Core Identity 实战(3)认证过程

    如果你没接触过旧版Asp.Net Mvc中的 Authorize 或者 Cookie登陆,那么你一定会疑惑 认证这个名词,这太正式了,这到底代表这什么? 获取资源之前得先过两道关卡Authentica ...

  2. WPF 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项

    1.检查代码不存在问题,最后找到问题,Nut管理包没有安装CefSharp.wpf. 2.安装对应的版本即可.

  3. Oracle 正则表达式函数-REGEXP_REPLACE

    背景 当初写oracle的一个存储过程,以前不知道sql里也有正则表达式,关于正则表达式教程很多了,这里只是记录下Oracle也有这个功能,下次再有类似需求用这个处理的确方便很多. 想起存储过程,就想 ...

  4. c++ 引用方式传递数组

    值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元.当传递是对象时,要调用拷贝构造函数.而且指针最后析构时,要处理内存释放问题 ...

  5. Jquery hover方法使用及 mouseenter与mouseleave和 mouseover与mouseout的区别

    定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数. jQuery 1.7 版本前该方法触发 mouseenter 和 mouseleave 事件. jQuery 1.8 ...

  6. OCM_第八天课程:Section4 —》数据管理

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  7. Luogu P4944 【PION贪吃蛇】

    简单模拟题 用一个数据结构存储这条蛇 考虑蛇的移动 1,如果死了,就把整个蛇清空,所有位置标记为食物 2,如果吃了东西,把这个位置更新为蛇头 3,如果正常走路,这个位置设为蛇头,同时删掉尾巴 蛇的存储 ...

  8. poj2114 树分治(点分治)

    poj1741板子套一套,统计对数的方式改一下,可以在O(n)时间内统计对数 最后不要忘记输出最后的“.” /* 给定一棵边权树,是否存在一条路径使得其长度为恰好为x 把1741的板子改为求点对之间的 ...

  9. 《转》利用cxf实现webservice

    首先下载cxf包,目前最新的版本是apache-cxf-2.1.,下栽地址http://cxf.apache.org/download.html. 1. 首先新建一个web工程CxfService,倒 ...

  10. poj 2406 求字符串中重复子串的个数

    Sample Input abcdaaaaababab.Sample Output 1 //1个abcd4 //4个a3 //3个ab #include<stdio.h> #include ...