集合、数据结构、时间复杂度

集合、数据结构、时间复杂度

1、集合

1.1 概述

java集合分为三种类型,List、set和Map。List有序,可以重复。Set无序不重复。Map是Key-value对类型,其中Key具有set的特点。

1.2 List

List java中有ArrayList和LinkedList两种实现。

  • ArrayList

    通过数组来实现,擅长读操作,有容量概念,扩容发展50%。

  • LinkedList

    内部通过链表实现,通过指针实现,检索的对象时从两头检索,看索引位于哪个半段范围中。内部存放了首尾两个节点,元素通过node连接在一起。Node由item 、 prev、 next构成,检索最坏情况不会超过半数。

  • 性能评测

    Arraylist LinedList 结论
    写(100w) 90,255ms 40ms 200x
    读(5wth) 0.036,538ms 0.637,157ms 20x

1.3 Map

map是通过key-value关联起来的映射构成的集合。其中key具有set的特点。java中Map有HashMap和TreeMap。

  • HashMap

    内部通过数组+链表实现。

    class HashMap{
      //
      transient Node<K,V>[] table;
      //
      static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
      }
    }
  • TreeMap

    内部通过红黑二叉树实现。


    put过程分析

    put(K key, V value){
    //
    //hash(key)取出key的新hash值。
    //
    return putVal(hash(key), key, value, false, true);
    }

    //新hash的计算方式使用key的旧hash的高16位和低16位做异或运算。
    //移位运算的目的是让更多的特征值参与计算。
    //异或运算的目的是让值更加分散。
    //默认分配16个桶,
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

    //hashmap中判断key是否存在的算法:
    (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

    //新哈希不等
    if(新哈希不等?){
    //key不等
    }
    //相等
    else{
    if(是否是同一key?){
    存在
    }
    else{
    if(key是否equals?){
    存在
    }
    else{
    不同
    }
    }
    }

数据结构

数组          //[]
链表          //通过引用关联实现
Stack           //先进后出, push | pop,通过list实现
队列          //先进先出,enqueue ,通过list实现
Map             //数组 + 链表(引用)。
Tree            //树形.

[红黑树]
    1.节点有颜色(红|黑)
    2.根式黑色的
    3.所有叶子是黑色的
    4.节点为红,孩子为黑
    5.节点到可达的叶子节点都有相同数量的黑色节点.
    如果出现歪楼的情况,就会进行旋转,歪到左边就右旋,歪到右边就左旋。

/**

  • 定义key
    */
    public class MyKey {
    int n ;
    public MyKey(int n){
    this.n = n ;
    }
    public int hashCode() {
    return n;
    }

    public boolean equals(Object obj) {
    return false ;
    }
    }
    //测试hashMap
    @Test
    public void testMap(){
    Map<MyKey,String> map = new HashMap<MyKey, String>() ;
    map.put(new MyKey(0), "1") ;
    map.put(new MyKey(16), "2") ;
    map.put(new MyKey(32), "3") ;
    System.out.println(map.size());

}

时间复杂度

xxx = 3N^3 + 2n^2 + 5n
O(n^3)

byte[] aa = new byte[n] ;
aa[0] ; = O(1)

for(){
}

O(n)
for(int i = 0 ; i < arr.length ; i ++){
sum = sum + arr[i] ;
...
}

HashMap的时间复杂度:

1.最好情况
    O(1)
2.最差情况
    O(n)

练习

1.冒泡排序时间复杂度
    [最差]
                                n^2 - n
    1 + 2 + 3 + .. + n - 1 = ----------- = O(n^2)
                                  2
    [最好]
    O(n)

作业

  1. 设计一个类Person含有height、weight、age和blood是整数属性。

    实现hashcode方法,将四个属性编排到一个整数中作为hashcode.

  2. 折半查找的时间复杂度问题

  3. 99乘法表的时间复杂度

  4. 两个n阶方阵的乘积的时间复杂度

  5. 红黑树依次存放1,2,3,4,5做key,给出树结构

    put(1,"x");
    put(2,"x");
    put(3,"x");
    put(4,"x");
    put(5,"x")

猜你喜欢

转载自www.cnblogs.com/xupccc/p/9594157.html