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

第九周学习总结

一、学习目标

  • 二叉查找树的理解
  • 二叉查找树的实现
  • 平衡二叉查找树
  • 哈夫曼树的实现
  • 堆的理解
  • 堆的实现

二、学习内容

1.二叉查找树

思路:
二叉查找树与一般二叉树的区别在于,二叉查找树中保存的都是实现了Comparable接口的类型的对象,从而使得在将数据保存至树中的时候,就会进行比较,每次以根结点为分界点,比根结点的值大的元素都会被保存在根结点的右子树,反之被保存在左子树中。这样就使得树在被创建的时候就是已经排序好的,然后我们就可快速的对相应元素进行查找了。
实现:
书上已经帮我们实现好了接口和具体类,我们只需要实现其中没有完成的两个方法findMaxfindMin
代码:
 public T findMin() {
    BTNode<T> r =  root;
    while (r.getLeft() != null)
        r = r.getLeft();
    return  r.getElement();
 }
 public T findMax() {
     BTNode<T> r =  root;
    while (r.getRight() != null)
        r = r.getRight();
    return  r.getElement();
 }
测试截图:

1065476-20171105174026185-1045634778.jpg

2.平衡二叉查找树

优点:
在有n个结点的平衡树中进行查找及添加操作的效率是进行O(log2^n)次比较(最长路径的长度)。树越退化,查找及添加操作的时间复杂度越接近O(n),它低效率使用查找树带来的益处。

3.哈夫曼树

思路:

在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制,可分别用000、001、010、011、100、101对“A,E,R,T,F,D”进行编码发送,当对方接收报文时再按照三位一分进行译码。

实现:
//数据解压缩,将压缩compressed中的0/1序列进行Huffman译码,返回译码字符串
public String decode(String compressed)
{
    String[]arr = new String[charset.length()];
    String str ="";
    for(int i=0;i<arr.length;i++){
        arr[i] = getCode(i);
    }
    ArrayList<Character> list = new ArrayList<>();
    ArrayList<String> list1 = new ArrayList<>();
    ArrayList<String> list2 = new ArrayList<>();
    Map<String,String> map = new HashMap<>();
    for(int i=0;i<arr.length;i++){
        map.put(arr[i],((char)('A'+i))+"");
    }
    for(int i=0;i<compressed.length();i++) {
        list.add(compressed.charAt(i));
    }
    String temp = "";
    for(int i=0;i<list.size();i++){
        temp += list.get(i);
            if(OP(temp,arr)) {
                list1.add(temp);
                temp = "";
            }
    }
    for(String i:list1)
        list2.add(map.get(i));
    for(String i:list2)
        str += i;
    return str;
}

public boolean OP(String msg,String []arr){
    boolean result = false;
    for(int i=0;i<arr.length;i++) {
        result = msg.equals(arr[i]);
        if(result)
            break;
    }
    return result;
}
测试截图:

1065476-20171105180850982-1964210782.jpg

4.堆的理解与实现

堆:
首先堆是一颗完全树(完全树是可平衡树,他的最后一层的所有叶节点都在树的最左边),第二是要约束元素之间的关系。树中的根元素总是树中最大的元素,从根开始的每条路径上的值都是越来越小的。
堆的实现:
在书中已经帮我们实现好了大部分代码,我们只需要实现其中的一个获取最大值的方法就可以了。
public T getMax() throws Exception {
    if (root == null)
        throw new Exception ("Remove max operation " +
                "failed. Tree is empty.");

    T maxElement = root.getElement();

    if (root.count() == 1)
        root = last = null;
    else {
        HeapNode<T> newLast = ((HeapNode<T>)root).getNewLastNode(last);
        if (last.parent.left == last)
            last.parent.left = null;
        else
            last.parent.right = null;

        root.setElement(last.getElement());
        last = newLast;
    }
    return maxElement;
}
测试截图:

1065476-20171105182249873-1245347437.jpg

三、结对及互评

本周并没有在结对方面有什么合作项目

点评模板:

  • 博客中值得学习的或问题:
    • 界面很好看
    • 问题分析可以更详细
  • 其他
    希望我们结对在这学期能相互促进,技术更上一层楼。

    本周结对学习情况

    • 20162302
    • 结对学习内容
      • 一起讨论学习。

四.代码托管

1065476-20171105182459498-973273306.jpg

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周0/01/210/20了解数据结构及算法
第二周664/6642/310/20系统的学习了查找和排序
第五周1333/19972/515/60栈数据结构的学习
第七周812/30352/715/80树的学习和实现
第九周1364/43992/915/110二叉查找树、哈夫曼树、堆

参考资料

转载于:https://www.cnblogs.com/Zhangxusheng/p/7788136.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值