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小时

  • 相关阅读:
    Java常用的7大排序算法汇总
    swift 内存管理,WEAK 和 UNOWNED
    Java关键字final、static使用总结
    Swift对面向对象提供了良好的支持,下面介绍几个其独有的特性。
    如何自己动手实现 KVO(转)
    Method Swizzling 和 AOP 实践(转)
    Objective-C Runtime(转)
    在多线程中进行UI操作
    iOS 详解NSXMLParser方法解析XML数据方法
    用一张日落照片估算出地球的半径
  • 原文地址:https://www.cnblogs.com/VersionP1/p/7770525.html
Copyright © 2011-2022 走看看