集合、數據結構、時間復雜度


集合、數據結構、時間復雜度

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

    1. 內部通過數組+鏈表實現

      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;
        }
      }
      
    2. Hashmap put流程為

      int newhash = 獲取key的新hash;
      通過新hash定位桶的坐標;
      if(坐標位為空?){
        在該位置創建節點 ;
      }
      else{
        if(新hash相同?){
        	if(key是同一對象?){
        		key相同,覆蓋value的值。
        	}
        	else{
        		if(key的equals是否相同?){
        			key相同,覆蓋value
        		}
        		else{
        			繼續尋找下一個Node;
        		}
        	}
        }
        else{
        	繼續找下一個Node;
        }
      }
      
    3. 新hash計算方法

      舊hash碼的高低16位做異或運算,實現計算結果的更加分散,高位右移是想讓更多的特征值參與進來。

      static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
      }
      

  • TreeMap

    內部通過紅黑二叉樹實現,具體見我的數據結構一文。

作業

  1. 設計一個類Person含有height、weight、age和blood是整數屬性,實現hashcode方法,將四個屬性編排到一個整數中作為hashcode.

    答:

    class Person{
    	private int height ;
      	private int weight ;
      	private int age ;
      	private int blood ;
      
      	public int hashCode(){
        	return (height & 0xff) << 24
              		| (weight & 0xff) << 16
              		| (age & 0xff) << 8
              		| (blood & 0xff) << 0 ;
        }
      
      	public boolean equals(Object o){
        	if(o == null || o.getClass() != Person.class)
              return false ;
          	return this.hashCode() == o.hashCode() ;
        }
    }
    
  2. 折半查找的時間復雜度問題

    折半查找的時間復雜度為\(O(log_{2}n)\),具體過程見時間復雜度一文。

  3. 99乘法表的時間復雜度

    99乘法表的時間復雜度為\(O(n^2)\) ,具體過程見時間復雜度一文。

  4. 兩個n階方陣的乘積的時間復雜度

    兩個n階方陣的乘積的時間復雜度為\(O(n^3)\) ,具體過程見時間復雜度一文。

  5. 紅黑樹依次存放1,2,3,4,5,6,7,8做為key,給出樹的最終結構。

    樹結構為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM