zoukankan      html  css  js  c++  java
  • 20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆

    20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆

    教材学习内容总结

    1、 堆的引入

    .

    2、堆的用处

      1.实现优先队列

      2.总能方便地得到元素集合中的最大(小)值(最大(小)值在根部)

      3.能够用来进行排序

    3、堆的概念与性质

    4、 堆的实现

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

    • 问题1:我在课本中看到这么一句话:“堆是一棵完全二叉树,其中每个元素都要大于或小于它的所有孩子”但下面的关键概念中也写着:“堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值”那每个元素是大于或小于其所有子结点还是大于等于其所有子结点??
    • 问题1解决方案:翻阅书后面的自测题SR18.1的答案,上面写着:“堆中的结点大于等于它的两个子结点”。

      因此可以得出结论,应该是每个元素大于或等于其所有子结点的值。

      补充:实际上,上面我得到的结论是最大堆的结论,最小堆的性质是:每个元素都小于等于它的孩子,也就说明了小于也是正确的。

    • 问题2:我在书中看到这么一句话:“堆是一种经典的是数据结构,常用来实现优先队列”,什么是优先队列,它与队列是否不同,若不同,不同处在哪里??
    • 问题2解决方案:在书的后面有对优先队列进行解释:
    1. 具有更高优先级的项排在前面
    2. 具有相同优先级的项按先进先出的规则排序
    • ...

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

    • 问题1:在单步跟踪LinkedMaxHeap的过程中,有个add方法:
    @Override
        public void add(T element) {
            HeapNode<T> node = new HeapNode<T>(element);
            HeapNode<T> newParent = null;
    
            if (root == null) {
                root = node;
            } else {
                newParent = ((HeapNode<T>) root).getParentAdd(last);
    
                if (newParent.getLeft() == null) {
                    newParent.setLeft(node);
                } else {
                    newParent.setRight(node);
                }
            }
    
            node.setParent(newParent);
            last = node;
    
            ((HeapNode<T>) root).heapifyAdd(last);
        }
    

    其中有段代码:

     node.setParent(newParent);
    

    在add方法中已经明确表明

    newParent.setLeft(node);
    

    那设置node结点的父节点是newParent有什么意义?

    • 问题1解决方案:解决这个问题要结合HeapNode的代码。在HeapNode的代码中有个HeapNode的变量parent,在里面的很多方法里面,都有用到这个变量,书上也有说:“有到父节点的引用,这样就可以沿树中的路径移动。”因此setParent方法是在堆中必要的
    • 问题2:在看HeapNode中的heapifyAdd方法的时候,看到这么一句代码:
    current = current.parent;
    

    current都成为它自己的父节点了,那子结点还在吗?

    • 问题2解决方案:在!current只是当前结点的其中一个引用罢了,上面那段代码只是引用改变了而已,堆还是原来的样子。

    代码托管

    上周考试错题总结

    • 错题1:在一棵二叉查找树中,左子树的元素________根的元素

        A.大于

        B.小于

        C.大于或等于

        D.小于或等于

        E.等于

    我的答案:B    标准答案:D

    解析:当出现元素重复的情况,一个元素会作根,另一个相同的元素会作根的左子结点或右子结点

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
    目标 5000行 15篇 400小时
    第一周 200/200 2/2 20/20
    第二周 20/220 1/3 20/40
    第三周 645/865 1/4 14/54
    第五周 654/1519 1/5 18/72
    第六周 436/1955 1/6 16/88
    第七周 839/2794 2/8 20/108
    第八周 2143/4937 2/10 25/133
    第九周 1368/6305 2/12 18/151
    • 计划学习时间:16小时

    • 实际学习时间:18小时

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/VersionP1/p/7770525.html
Copyright © 2011-2022 走看看