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

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

教材学习内容总结

主要是学习有关堆和优先队列的相关知是,堆是我们在树之后学习的又一个非线性的数据结构。

堆可以分为最小堆和最大堆两种,每一个元素的孩子都比他小就是最大堆,元素的每一个孩子都比它大就是最小堆;课本上主要介绍了最大堆。

堆的前提就是他首先是一个完全二叉树,其次就是满足要约束元素之间的关系。

堆的实现:
在课本上说明了堆要实现的主要的是三个方法,向堆中添加元素,从堆中删除最大元素,获取堆中的最大元素;
添加元素:

从堆中删除最大元素:

获取堆中最大的元素:
这个方法比较简单,直接的返回根中的元素就可以(因为书中介绍的是最大堆);

  • 优先队列:
    在前几周的学习中我们了解了队列的知识点,最主要的就是FIFO原则,但是优先队列就与我们原先学习的队列相比就多了一个规则,就是优先级高的就算后入对也要比优先级低的元素先出队,只有在优先级相同的时候才会遵循FIFO的原则;

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

  • 问题1:这周老师提出拉有关哈夫曼树的问题,并且用哈夫曼树来加密字符串,之后然后让我们自己实现解码的过程,虽然自己写出来了一个方法但是之后在见到同学的代码之后我才发现自己的代码的局限性太大。
String  re = "";
        int a = compressed.length();
        for (int i = 0; i< a; i++){
            int b = compressed.charAt(i);
            //第一个字符为0就是A
          if (compressed.charAt(i) == 48)// 十进制的ASCII码表示0为48
              re += "A";
          // 第一个字符为1 且第二个字符为1就是B;
         else if (compressed.charAt(i + 1) == 49){// 十进制的ASCII码表示的1为49
             re += "B";
             i ++;// 为B所以就跳过后一个字符
          }
          //第一个字符为1且第二个字符为0,第三个字符为0就是C
          else if (compressed.charAt(i + 2) == 48){
             re += "C";
             i = i + 2;//为C则跳过后面的两个字符;
          }
          else{
              re += "D";
              i = i + 2;// 如果为D就与C相同跳过后面的两个字符;
          }
        }
        return re;

这段代码虽然好像看着挺巧妙的,但是它就只能用来解决这一种唯一的情况的解码的问题,所以我才会觉得这个代码的局限性太大。

String result = "";
        String compressed1 = compressed;
        while(compressed1.length()!= 0)       //遍历压缩字符串,获取解压每个编码以后剩下的压缩码长度
        {
            String in = "";
            int index;
            re:
            for (index = 0; index < compressed1.length(); index++) { //将能解压的压缩码解压,解压出来的结果加入返回值
                in = in + compressed1.charAt(index);
                for (int i = 0;i<charset.length();i++){
                    if(in.equals(getCode(i))){
                        result += charset.charAt(i);
                        break re;
                    }
                }
            }
            compressed1 = compressed1.substring(index+1);  //将解压后的压缩码去掉
        }
        return  result;

他在这里用到了一个带有标签的break的语句,并且它的代码明显应用的范围比我的要广很多。

代码托管

上周考试错题总结

  • 错题1

    平衡树的定义就是,所有叶子都在同一层或者不超过一层,C没有考虑到相差一层的问题。只有D的描述才是最完备的答案;

  • 错题2

    这题主要是翻译的问题,看成了顺序,没有想到他是度,所以就会错。

  • 错题3

    这题现在看起来觉得错的有点可惜,不知道什么原因,竟然错了,先遍历左子树后再遍历右子树最后在遍历根,就是后序遍历的形式;

  • 错题4

    这里没有注意到的是至多这个词,我当时是这么想的还有叶子没有子结点,所以不是每一个结点都有两个子结点

  • 错题5

    这题答案和解析好像有问题,就算是后续表达式也应该先访问的左子树,之后才是右子树,最后是根,所以根是最后被访问的所以答案应该是true,而答案却是false,解析与答案好像并不一样。

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

这周过的很快很快,韶华易逝,让你我尽可能的让时光慢些吧!!!想逼自己多读一些书,莫让时光虚度,希望我可以成功。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 196/196 1/1 11/11 对于算法有了进一步的了解
第二周 76/270 1/2 10/21 了解一种新的方法,提高代码的复用性。
第三周 757/1027 2/4 10/31 了解很多的高效率的排序的方法和两种查找方法
第四、五、六 1768/2805 6/10 45/76 了解队列、栈等相关知识
第七周 1037 /3842 3/13 14/90 了解了非线性结构树
第八周 下周一起统计 2/15 15/105 进一步了解树
第九周 1578/5420 1/16 15/120 对于堆与优先队列的了解加深
  • 计划学习时间:18小时

  • 实际学习时间:15小时

参考资料

posted on 2017-11-03 19:09  20162324-春旺  阅读(200)  评论(0编辑  收藏  举报

导航