• 1.集合数据结构 Java


    资料:https://gitee.com/chuanqi1995/java

    数组

    特点

    1. 查询快,因为内存地址是连续的,通过索引可以找到某个元素
    2. 增加、删除慢,因为长度是固定的,如果增加一个元素,就需要创建一个与新加元素的长度相同的数组,把原数组的内容添加进来。删的话与之相同

    链表

    单向链表

    双向链表

    特点

    1. 内存地址不连续
    2. 不支持下标搜索,支持顺序的遍历搜索
    3. 增加、删除操作找到对应节点改变链表的头尾指向即可,无需移动元素的节点位置

    Demo

    LinkedList

    private static class Node<E> {
      E item; //节点的元素
      Node<E> next; //下一个节点
      Node<E> prev; //上一个节点
    
      Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    	}
    }
    

    二叉树

    1. 某节点的左子树的值必须小于该节点的值
    2. 某节点的右子树的值必须大于该节点的值

    不平衡二叉树

    特点

    查询效率太低,如果我现在要查1,必须要查6次才能查到。下面的红黑树就是为了优化二叉树平衡的一种解决方案

    红黑树

    红黑树是一个自平衡(不是绝对的平衡)的二叉查找树

    特点

    1. 每个节点要么是黑色,要么是红色
    2. 根节点都是黑色
    3. 每个叶子节点都是黑色
    4. 每个红色节点的两个字节点一定是黑色
    5. 任意一节点到每个叶子节点的路径中都包含相同的黑色节点

    红黑树练习网站: http://algoanim.ide.sk/index.php?page=showanim&id=63

    红黑树能自平衡,它靠的是什么?三种操作:左旋、右旋和变色

    原理

    1. 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
    2. 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
    3. 变色:结点的颜色由红变黑或由黑变红。

    Demo

    在理解原理的时候,先需要知道下节点描述

    原理中第1种场景

    原理中第2种场景

    原理中第3种场景(叔叔节点存在且为红节点)

    1. 将P和S设置为黑色,PP设置为红色

    2. 将PP设置为当前插入节点【再套一次规则】

    原理中第3种场景(叔叔节点存在不存在或为黑节点)

    P为PP的左节点
    插入节点是P的左节点
    1. 最初

    1. 插入2后,将P设置为黑色,PP设置为红色,PP进行右旋

    插入节点是P的右节点
    1. 最初

    1. 插入8,对P进行左旋

    1. 把P设置为插入节点,得到上一个场景,再来一个右旋

    P为PP的右节点

    剩下几种情况与上面相同,举一反三即可

  • 相关阅读:
    redis 之redis集群与集群配置
    redis 之redis-sentinel主从复制高可用
    Python 基础之函数的嵌套与nonlocal修改局部变量及闭包函数
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/chuanqi1995/p/15951836.html
Copyright © 2020-2023  润新知