算法跟數據結構的入門

什麼是算法算法

  算法的五個特徵:有窮性,肯定性,可行性,有輸入,有輸出數組

  算法的設計原則:正確性,可讀性,健壯性bug/高效率與低存儲。內存+cpu內存佔用最小。緩存

  評價算法的兩個重要指標:時間複雜度(運行一個程序花費的時間),空間複雜度(運行程序所須要的內存 OOM 通常就是找數組容器等)。安全

    1.常數性時間複雜度0(1)數據結構

     及運行代碼:多線程

      

 

     2.線性性0(m)併發

    

      線性性O(m)高併發

      

 

 

    3.性能

      對數性 nlog(n) 快速排序優化

      

 

     4.

     

    平方性

      

 

     5.

 

    時間複雜度優化標準就是:儘可能往低的優化,通常在程序中找for while 遞歸等就能大概算出時間複雜度

    以上幾個性能對比:O(1)>O(n)>O(nlogn)>O(n^2)

什麼是數據結構

    數據結構是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。

  基礎數據結構

    1.數組

    元素之間能夠快速的隨機訪問

    每一個元素都必須是連續的,當須要擴容時,就須要將已有的數據複製到已有的存儲空間

    ArrayList:使用最多的數據結構,訪問快,線程不安全

    Vector:線程安全,通常用在高併發系統中

    2.鏈表

    不能夠隨機訪問  插入刪除快

    LinkedList:不能隨機訪問

    

    3.Vector,LinkedList,ArrayList三者的區別

    性能上來講,ArrayList最好,也是使用最多。

    當集合中的元素須要頻繁的插入刪除的話  能夠考慮使用LinkedList   

    Vector是線程同步的,因此性能最差,可是安全性最高,通常用於高併發

 

    

      若是能用數組的時候(元素類型固定,數組長度固定),請儘可能使用數組來代替List 

      若是沒有頻繁的刪除插入操做,又不用考慮多線程問題,優先選擇ArrayList 

      若是在多線程條件下使用,考慮Vector 

      若是須要頻繁地刪除插入,LinkedList 

      若是不清楚的狀況下ArrayList 

    

     Set

 

    Set用來去重

 

    Set Java裏面有3種實現方式

 

    (1)HashSet 就是用來去重的 並且去重後元素的順序和插入的不同的

 

    (2)TreeSet 是用來排序的,其底層數據結構爲紅黑樹 元素的順序和插入的不同的

 

    (3)LinkedHashSet 維護了一個鏈表,記錄了順序,能夠保持插入和輸出後的順序一致

 

 

 

    隊列

 

    隊列在項目中使用很是普遍主要有如下一些場景:

 

    (1)等待隊列

 

    (2)//排隊場景 若是一個系統流量高 要作這種排隊系統

 

    (3)//Mq消息隊列

 

      Java中有不少種隊列的實現方式,大部分狀況下只須要掌握如下幾個:

 

        ArrayBlockingQueue:基於數組的阻塞隊列實現,也長度是須要定義的,能夠指定先講先出或者先講後出,是有界隊列,在多線程池中的等待隊列就就用了這種。

 

 

 

        LinkedBlockingQueue:基於鏈表的阻塞隊列,〈該隊列由一個鏈表構成),

 

        其內部實現採用分離鎖(讀寫分離兩個鎖),從而實現生產者和消費者操做的徹底並行運行,是無界隊列。

 

        PriorityBlockingQueue:基於優先級的阻塞隊列(排隊場景比較適合,具體實現看代碼例子)

 

        DelayQueue:帶有延遲時間的Queue,其中的元素只有當其指定的延遲時間到了,

 

        纔可以從隊列中獲取到該元素。應用場景主要有:緩存超時的數據進行移除、空閒鏈接的關閉等等。

 

         

 

 參考子龍老師的課件

相關文章
相關標籤/搜索