java 复习003

时间:2022-12-08 18:53:09
今天主要复习下数据结构的东西 

  1. 自平衡二叉查找树

    1. AVL树(高平衡树)(wiki)
      java 复习003
      1. 特性:任何节点的两个子树的高度最大差别为一
      2. 时间复杂度:查找、插入和删除在平均和最坏情况下都是O(log n)
    2. 红黑树(对称二叉B树)(wiki)
      java 复习003
      1. 特性:
        1. 节点是红色或黑色
        2. 根是黑色
        3. 所有叶子都是黑色(叶子是NIL节点)
        4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
        5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
      2. 优势:
        1. 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,在高度上的理论上限允许红黑树在最坏情况下都是高效的
        2. 统计性能好
      3. 用途:用来构造关联数组(Map)和集合(Set)
  2. B树

    1. B-树 (百度百科)
      java 复习003
      1. 特性:关键字分布在整颗树中,查找成功立即结束(区别于B+树)
      2. 性能:搜索效率等价于二分查找
      3. 用途:常用于文件引索系统
    2. B+树
      java 复习003
      1. 特性:每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点,查找成功也要跳到叶子节点才结束(区别于B-树)
      2. 用途:通常用于数据库和操作系统的文件系统中
    3. B*树
      java 复习003
      1. B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;B树定义了非叶子结点关键字个数至少为(2/3)M,即块的最低使用率为2/3(代替B+树的1/2);
  3. 键树

    1. 键树(数字查找树)
      1. 每条通往叶子节点的路径都是一个关键字符串
    2. trie树(字典树)
      java 复习003
      1. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计
      2. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高

排序(java实现)

参见我的另一篇博客:some-sort-algorithms
这里用java再实现一遍,代码比较多,放到另一篇博客去了:some-sort-algorithms-java

查找

  1. 二分查找
    package vell.bibi.algorithms.search;
    
    public class BinarySearch {
        
        // 非递归实现
        public static int search(int[] a, int key){
            int low=0, high=a.length-1, mid = 0;
            while(high>=low){
                mid = (high + low) / 2;
                if(key == a[mid]) return mid;
                else if(key > a[mid]) low = mid + 1;
                else high = mid - 1;
            }
            return -1;
        }
        
        // 递归实现
        public static int search(int[] a, int low, int high, int key){
            if(high < low) return -1;
            int mid = (low + high) / 2;
            if(key == a[mid]) return mid;
            else if(key > a[mid]) return search(a, mid+1, high, key);
            else return search(a, low, mid-1, key);
        }
        
        public static void main(String[] args) {
            int[] a = {2,3,4,5,6,7,8,9,10,11};
            System.out.println(search(a, 5));
            System.out.println(search(a, 0, a.length-1, 5));
        }
    }