20182308 华罗晗 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

20182308 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

教材学习内容总结

本章内容基本分为查找和排序两个部分,
查找部分主要分为以下四种:顺序查找,折半查找、二叉排序树查找、散列查找;
而排序部分分为以下几种:选择排序、冒泡排序、快速排序、二叉排序。
主要讲了这些内容的数据结构原理性知识。

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

  • 问题1:什么是归并排序,归并函数有什么存在的必要?
  • 问题1解决方案:按照课本的说法,归并排序就是,将链表一直拆分一直拆分,直到子链表中只剩下一个单位为止。把剩下的元素调用递归的算法,再合并为一个有序的数列。这是一种比较高效稳定的算法,相比起快速排序来说,哪怕划分元素选得不好,它也能够达到O(nlogn)的复杂度,所以说是比较稳定的。
  • 问题2:二叉排序树是什么,二叉排序树的图要怎么画?
  • 问题2解决方案:二叉排序树就是一种比较特殊的排序方式,画法和代码实践的理念都是“大的放在右,小的放在左”,按照要求第二个、第三个数字要分别放在第一个数的左边(left)和右边(right)。在代码实践的过程中,可以通过创建指针链表来实现。

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

  • 问题1:在我们不需要写出代码来实践的时候,有什么快速实现简单数列的排序的方法吗?
  • 问题1解决方案:其实这个问题首先是在上个星期的查找中发现的,折半查找法要求在一个有序数列当中进行查找。int类被实例化的数据数组有一种自带的功能就是.sort,比如数组名叫xa[],那么我们只要进行xa.sort()就可以了。这个方法可以根据数组的复杂程度进行排序。在我们只需要对简单的数组进行排序的时候这样做是很高效的。
  • 问题2:散列排序(哈希函数)要如何进行代码实现?
  • 问题2解决方案:核心代码如下:
public HashTable(int size){
        arraySize = size;
        hashArray = new DataItem[arraySize];
        nonItem = new DataItem(-1);
    }
    public void displayTable(){
        System.out.print("Table:");
        for(int i=0;i<arraySize;i++){
            if(hashArray[i] != null){
                System.out.print(hashArray[i].getKey() + " ");
            }else {
                System.out.print("** ");
            }
        }
        System.out.println();
    }
    
public int hashFunc(int key){
        return key%arraySize;
    }
    public void insert(DataItem item){
        int key = item.getKey();
        int hashVal = hashFunc(key);
        while (hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1)
       {
            hashVal ++;
            hashVal = hashVal%arraySize;
        }
        hashArray[hashVal] = item;}

可见哈希函数要实现并不难,根据开放定址法的思想创建一个数组,通过判断这个位置是否为空、循环来进行实现。

代码托管

上周考试错题总结

上周没有考试。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182312
    • 结对学习内容
      • 主要沟通了一下关于散列排序的原理(两种方法的异同),他教会了我二叉排序树查找的原理以及绘图方法。
  • 上周博客互评情况

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 6000行 30篇 400小时
第一周 101/101 2/2 23/23 了解了一些Linux系统操作入门、学会了基本的JDB调试操作
第二、三周 353/441 3/5 42/67 能够基本记住Java代码编程中的格式代码。了解了一些有关方法的特殊命令(比如substring)。了解了一些有关类的基本知识。
第四周 327/768 2/7 28/95 基本已经适应IDEA的基本功能
第五周 807/1575 2/9 17/112 基本能够理解继承的作用和用法,初步了解了接口的代码原理,能够正确分析优秀同学的代码思路
第六周 1015/2590 1/10 22/134
第七周 1199/3789 3/13 42/176
第八周 825/4614 1/14 22/198
  • 计划学习时间:25小时

  • 实际学习时间:22小时

  • 改进情况:与上周类似,可以调用一些学习时间在纸上,理论学习和代码实践有机结合。

参考资料

猜你喜欢

转载自www.cnblogs.com/77599aa/p/11789849.html