• 20162314 Experiment 2


    Experiment report of Besti

    course:《Program Design & Data Structures》

    Class: 1623

    Student Name: Wang, Yixiao

    Student Number:20162314

    Tutor:Mr.Lou、Mr.Wang

    Experiment date:2017.10.27

    Secret level: Unsecretive

    Experiment time:60 minutes

    Major/Elective:Major

    Experiment order:6

    Experiment content

    1. LinkedBinaryTreeTest
    1. BinaryTree
    1. DecisionTree
    1. Expression Tree
    1. BinarySearchTree

    6.Analyze Source Code (Red-Black Tree)

    Experiment situation

    Exp1 LinkedBinaryTreeTest

    • It's easy to finish this experiment.
    • To start with , import to form a new LinkedBinaryTree to start the experiment.
    • Next , use the method GetRight GetLeft to ealuation.
    • Then , new element "ABC".
    • Last , Assert.assertequals();

    Exp2 BinaryTree

    • To start with , use the number to replace "A B C D ....."
    • Next , new newNode
    • Then, creat BinTree to get left child and right child
    • Use three methods preOrderTraverse,inOrderTraverse,postOrderTraverse.

    Exp3 Decision Tree

    • To start with , creat a class TwentyQuestionsPlayer
    • String the Questions and the answers as the order
    • New them
    • Write a method play(),Yes =Y , No=N .
    • Next , write a function to finish this experiment.

    Exp4 ExpressionTree

    Exp5 BinarySearchTreeTest

    • To start with , creat a class BinarySearchTree
    • public method Node find, insert,preorder,inorder,postorder,getMinNode get MaxNode,Delete.
    • creat three new Nodes(id and name);
    • Node n1 n2 n3 n4 ...n7 n8
    • Use method insert to n4 n5 n6 n7 n8
    • Bst.inorder and Systemin.

    Exp6 Red-Black Tree (Analyze Source Code)

    • TreeMap底层通过红黑树(Red-Black tree)实现,也就意味着containsKey(), get(), put(), remove()都有着log(n)的时间复杂度。

    • SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

    • 结构调整过程包含两个基本操作:左旋(Rotate Left),右旋(RotateRight)。

    • Rotate Left

      //Rotate Left
    private void rotateLeft(Entry<K,V> p) {
        if (p != null) {
            Entry<K,V> r = p.right;
            p.right = r.left;
            if (r.left != null)
                r.left.parent = p;
            r.parent = p.parent;
            if (p.parent == null)
                root = r;
            else if (p.parent.left == p)
                p.parent.left = r;
            else
                p.parent.right = r;
            r.left = p;
            p.parent = r;
        }
    }
    

    • Rotate Right
      //Rotate Right
    private void rotateRight(Entry<K,V> p) {
        if (p != null) {
            Entry<K,V> l = p.left;
            p.left = l.right;
            if (l.right != null) l.right.parent = p;
            l.parent = p.parent;
            if (p.parent == null)
                root = l;
            else if (p.parent.right == p)
                p.parent.right = l;
            else p.parent.left = l;
            l.right = p;
            p.parent = l;
        }
    }
    
    • .get()
      //getEntry()方法
    final Entry<K,V> getEntry(Object key) {
        ......
        if (key == null)//不允许key值为null
            throw new NullPointerException();
        Comparable<? super K> k = (Comparable<? super K>) key;//使用元素的自然顺序
        Entry<K,V> p = root;
        while (p != null) {
            int cmp = k.compareTo(p.key);
            if (cmp < 0)//向左找
                p = p.left;
            else if (cmp > 0)//向右找
                p = p.right;
            else
                return p;
        }
        return null;
    }
    
    • .put()
      public V put(K key, V value) {
        ......
        int cmp;
        Entry<K,V> parent;
        if (key == null)
            throw new NullPointerException();
        Comparable<? super K> k = (Comparable<? super K>) key;//使用元素的自然顺序
        do {
            parent = t;
            cmp = k.compareTo(t.key);
            if (cmp < 0) t = t.left;//向左找
            else if (cmp > 0) t = t.right;//向右找
            else return t.setValue(value);
        } while (t != null);
        Entry<K,V> e = new Entry<>(key, value, parent);//创建并插入新的entry
        if (cmp < 0) parent.left = e;
        else parent.right = e;
        fixAfterInsertion(e);//调整
        size++;
        return null;
    }
    

      //红黑树调整函数fixAfterInsertion()
    private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;
        while (x != null && x != root && x.parent.color == RED) {
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {//如果y为null,则视为BLACK
                    setColor(parentOf(x), BLACK);              // 情况1
                    setColor(y, BLACK);                        // 情况1
                    setColor(parentOf(parentOf(x)), RED);      // 情况1
                    x = parentOf(parentOf(x));                 // 情况1
                } else {
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);                       // 情况2
                        rotateLeft(x);                         // 情况2
                    }
                    setColor(parentOf(x), BLACK);              // 情况3
                    setColor(parentOf(parentOf(x)), RED);      // 情况3
                    rotateRight(parentOf(parentOf(x)));        // 情况3
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);              // 情况4
                    setColor(y, BLACK);                        // 情况4
                    setColor(parentOf(parentOf(x)), RED);      // 情况4
                    x = parentOf(parentOf(x));                 // 情况4
                } else {
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);                       // 情况5
                        rotateRight(x);                        // 情况5
                    }
                    setColor(parentOf(x), BLACK);              // 情况6
                    setColor(parentOf(parentOf(x)), RED);      // 情况6
                    rotateLeft(parentOf(parentOf(x)));         // 情况6
                }
            }
        }
        root.color = BLACK;
    }
    

    Code hosting

    PSP5.1(Personal Software Process)

    Steps Time percent
    requirement 45minutes 16.7%
    design 50minutes 18.5%
    coding 1.5hours 32.2%
    test 30minutes 11.1%
    summary 55minutes 19.2%
  • 相关阅读:
    ArrayList排序Sort()方法(转)
    sqlserver2008 insert语句性能
    Installing TensorFlow on Ubuntu
    自动下载和安装 MNIST 到 TensorFlow 的 python 源码 (转)
    c# BackGroundWorker 多线程操作的小例子 (转)
    c# 修改winform中app.config的配置值
    ffmpeg 编译graph2dot
    ffmpeg常用命令
    live555例子程序编译连接时发现函数未定义问题
    编译代码是提示某些类型错误问题
  • 原文地址:https://www.cnblogs.com/CS162314/p/7742410.html
Copyright © 2020-2023  润新知