20162325 2017-2018-2 《程序设计与数据结构》第6周学习总结

教材学习内容概要


队列是先进先出(FIFO)的集合

队列是保存重复编码k值的一种有效结构

实现模拟时常用队列来表示等待的一列

队列的链式实现方式便于找到指向链表中的第一个和最后一个元素的引用

入队和出队操作在集合的两端进行

因为队列修改集合的两端,所以将一端固定在下标为0的位置就会让元素移动

非循环数组实现队列时元素的移动得到O(n)阶复杂度

采用数组实现队列时,把数组看成一个环,可以避免移动元素

队列(Queue)是只允许在一端进行插入工作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头

队列的抽象数据类型:


ADT 队列(Queue)

  • 一个线性集合、它在一端添加元素,另一端删除元素,一端为对头(front),另一端称为队尾(rear)【入队enqueue是指在队尾添加新元素,出队dequeue是指从对头删除元素,first是检测队头元素】

  • 在非空队列中,front始终指向队头元素,rear始终指向队尾元素的下一个位置。

队列的顺序存储


  • 假设队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并将n个元素存储在数组的前n个单元中,数组下标为0的一端为队头。所谓的插入队列操作,其实是在队尾追加一个元素,不需要移动任何元素,时间复杂度为 O(1) 。和栈不同,队列的出列操作在队头进行,即下标为0的位置,即队列中的所有元素都要向前移动,保证队列的队头在下标为0的位置且不为空,此时的时间复杂度为 O(n) 。

循环队列


  • 头尾相接的顺序存储结构被称为循环队列。数组末尾元素占用后,将尾指针改为指向下标为0的位置,继续插入。

队列的链式存储结构


  • 队列的链式存储结构,其实是线性表的单链表,只不过是只能尾进头出而已,将其简称为链队列。将队头指针指向链队列的头结点,队尾指针指向终端结点。当队列为空时,front和rear均指向头结点。

循环队列与链队列的对比:


  • 时间上,基本操作均为常数时间 O(1) ,不过循环队列事先申请存储空间,且使用期间不释放,而链队列,每次申请和释放结点均会产生时间开销,若入出队频繁,二者还是存在差异的。就空间上来说,循环队列有一固定长度,所以存在空间浪费的情况,虽然链队列不存在这个情况,但会产生空间开销,在可接受范围内,所以空间上链队列要更灵活些。

总而言之,在能确定队列长度最大值的情况下,建议使用循环队列,如果无法预估队列长度时,使用链队列。

教材学习中的问题和解决过程


  • 问题1:何为“假溢出”?为何出队列是一定要全部移动呢?若不限制队列的元素不需要存储在数组的前n个单元,即队头不需再下标为0的位置,这样不是能提高队列出列的性能?

  • 问题1解决方案:询问同学并查阅CSDN博客后,得出如下结论——

    引入两个指针,front指针指向队头元素,rear指针指向队尾指针元素的下移位置,这样当front等于rear时,该队列为空队列。

    假设这个队列的总数不超过5个,但是因为数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上,队列在数组前面的位置还是空闲的,这种情况就是”假溢出”现象。

  • 问题2:空队列时,frontrear,而队列满时,还是frontrear,那如何判断队列是空还是满呢?

  • 问题2解决方案:

第一种方法,设置标志变量,当frontrear且flag0时队列为空,当frontrear且flag1时队列为满;

第二种方法,当frontrear时,队列为空,当队列满是,修改其条件,保留一个元素空间(当队列满是,数组中还有一个空闲单位)。假设队列的最大尺寸为QueueSize,则队列满时的条件为(rear+1)%QueueSizefront。(因为rear可能大于也可能小于font,但它们之间总是相差一个元素空间)

代码调试中的问题和解决过程


  • 问题1:不理解循环数组扩充容量的那一行代码
public void expandCapacity(){
T[] larger = (T[])(new Object[queue.length * 2]);
for (int i = 0; i < queue.length; i++){
larger[i] = queue[(front+i)% queue.length];
}
front = 0;
rear = count;
queue = larger;
}
  • 问题1解决方案:阅读到后一页“数组中已存在的元素必须按它们在相对次序复制到新数组中”就明白了

代码托管


上周考试错题总结


  • 尚未公布答案和解析

本周结对学习情况


  • 20162311
  • 结对学习内容

    - 用循环数组实现队列

其他(感悟、思考等,可选)


  • 这周因为平时早上加晚上的校运会训练,周六当天的比赛,再加上系礼仪的任务,能好好学习完成作业的时间不多,哪怕熬了一整个通宵也没能来得及提交第六周的博客,故在此补上。这两天遇到疑难时,查阅了不少相关博客,感觉通读易懂,一目了然(比书上更加清晰),希望自己在理解的基础上也能写出这样的文字。这周的作业量是真的大,五篇博客外加两个课下测试和几个项目,感觉与其提交粗糙的作业,不如能有适当充足的时间,好好看书,仔细查阅,认真写博客,这样实际学到的东西也更多。

学习进度条


代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 58/ 1/1 10/10
第二周 8/18
第三周 134/ 3/4 12/ 30
第四周 2/6 12/42
第五&六周 750/ 6595 5/11 24/66
  • 计划学习时间: 12小时

  • 实际学习时间:12小时

  • 改进情况:多思考,多尝试

参考资料


20162325 金立清 S2 W6 C15的更多相关文章

  1. 20162325 金立清 S2 W9 C18

    20162325 2017-2018-2 <程序设计与数据结构>第9周学习总结 教材学习内容概要 堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值. 向堆中添加一个元素的方法是,首 ...

  2. 20162325 金立清 S2 W7 C16

    20162325 2017-2018-2 <程序设计与数据结构>第7周学习总结 教材学习内容概要 树是非线性结构,其元素组织为一个层次结构 树的度表示树种任意结点的最大子结点数 有m个元素 ...

  3. 20162325 金立清 S2 W5 C14

    20162325 2017-2018-2 <程序设计与数据结构>第5周学习总结 关键内容摘要 集合是收集并组织其他对象的对象 集合中的元素一般由加入集合的次序或元素之间某些固有的关系而组织 ...

  4. 20162325 金立清 S2 W3 C13

    20162325 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容概要 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Com ...

  5. 20162325 金立清 S2 W11 C20

    20162325 2017-2018-2 <程序设计与数据结构>第11周学习总结 教材关键概念摘要 在哈希方法中,元素保存在哈希表中,其在表中的位置由哈希函数确定. 两个元素或关键字映射到 ...

  6. 20162325 金立清 S2 W10 C19

    20162325 2017-2018-2 <程序设计与数据结构>第10周学习总结 认识 线性表和树两类数据结构,线性表中的元素是"一对一"的关系,树中的元素是" ...

  7. 20162325 金立清 S2 W8 C17

    20162325 2017-2018-2 <程序设计与数据结构>第8周学习总结 教材学习内容概要 二叉查找树是一棵二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,而右子树上的元素 ...

  8. 20162325金立清 实验四 Android程序设计 实验报告

    实验四 Android程序设计 实验报告 代码托管地址 码云链接 实验内容 安装使用Android Stuidio Activity测试 UI测试 布局测试 事件处理测试 Android程序设计-1 ...

  9. 2017-2018 第一学期201623班《程序设计与数据结构》-第9&10周作业问题总结

    一.作业内容 第8周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK08 第9周作业 http://www.cnblogs.com/rocedu ...

随机推荐

  1. 【leetcode 简单】第十五题 加一

    给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: ...

  2. python初步学习-面向对象之 类(二)

    方法重写 如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法: #!/usr/bin/env python #coding:utf8 class Parent: def myMeth ...

  3. VScode格式化ESlint

    打开 文件-首选项- 设置 mac可以按快捷键(command和,) 然后在右上角的省略号选择open setting json { // vscode默认启用了根据文件类型自动设置tabsize的选 ...

  4. 用js拼接url为pathinfo模式

    用js拼接url为pathinfo模式

  5. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  6. Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式

    史诗级Java/JavaWeb学习资源免费分享 欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回 ...

  7. php中的转义函数

    <?php parse_url 解析URL, 返回各组成部分 urlencode/urldecode url编码/解码 htmlentities 将字符串转化为html实体 htmlentiti ...

  8. 【Git/GitHub学习笔记】一键更新多个git仓库至远程

    因为同时在本地维护几个Github的仓库,每次更新后每个仓库要重复三步提交同步,有点麻烦. 发现可以写.sh文件来实现一键更新. 比如我要更新我的BlogBackup和CodeRepo两个仓库的代码如 ...

  9. FPGA与CPLD的概念及其区别

    一.FPGA与CPLD的基本概念 1.CPLD CPLD主要是由可编程逻辑宏单元(LMC,Logic Macro Cell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复杂的I/ ...

  10. kernel编译速度提高

    1. 使用tmpfs来代替部分IO读写 2. ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失 3.distcc,多机器编译 4.将 ...