數據結構和算法緒論筆記整理

程序設計 = 數據結構 + 算法


數據結構:就是數據元素相互之間存在的一種或多種特定關係的集合(關係就是講邏輯結構,集合就是將物理結構);

        a.邏輯結構
            集合:數據元素之間只有"同屬於一個集合"的關係
            線性結構:數據元素之間存在一個對一個的關係
            樹形結構:數據元素之間存在一個對多個關係
            圖形結構或網狀結構:數據元素之間存在多個對多個的關係
http://i.cnblogs.com/EditPosts.aspx?postid=3938456
        b.物理結構(存儲結構)
            順序存儲:數據元素存放在地址連續的存儲單元裏,其數據間的邏輯關係和物理關係是一致的(數組)
            鏈式存儲:數據元素存放在任意的存儲單元裏,這組存儲單元能夠是連續的,也能夠是非連續的
 
算法:是解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,而且每條指令表示一個活多個操做,泡妞的技巧和方式而已

        a.算法的特徵:  
                 輸入     參數
                 輸出、   能夠是打印、可使返回值
                 有窮性、 有限步驟以後會自動結束,每個步驟在可接受的時間內完成
                 肯定性、  每個步驟都有其肯定的含義,不會出現二義性,在必定條件下
                           執行同一條執行路徑,相同的輸入只能有惟一的輸出結果
                 可行性    每一步都可以經過執行有限次數完成
                
        b.算法設計的要求:
                正確性
                      算法程序沒有語法錯誤
                      對於合法輸入可以產生知足要求的輸出
                      對於非法輸入可以產生知足規格的說明
                      對於故意刁難的測試輸入都有知足要求的輸出結果
                可讀性:便於他人閱讀和本身往後閱讀修改
                健壯性:輸入不合法時,可以作出相關處理,而不是崩潰
                時間效率高和存儲量低
 高斯算法java

 

 

算法效率的度量方法:

    過後統計方法:要先寫好測試程序,不一樣的服務器,測試效率也不同
    事前分析估算方法:在計算機程序編寫前,依據統計方法對算法進行估算

    程序運行時間的影響因素:
          算法
          編譯產生的代碼質量
          問題的輸入規模
          機器執行指令的速度
    拋開這些與計算機硬件、軟件有關的因素,一個程序的運行時間依賴與算法的好壞和問題的輸入規模(好比for循環的次數)算法

 

 

漸近增加:數據庫

此時咱們給出這樣的定義,輸入規模n在沒有限制的狀況下,只要超過一個數值N,這個函數就老是大於另外一個函數,咱們稱函數是漸近增加的。設計模式

函數的漸近增加:給定兩個函數f(n)和g(n),若是存在一個整數N,使得對於全部的n > N,f(n)老是比g(n)大,那麼,咱們說f(n)的增加漸近快於g()。數組

 

算法複雜度:服務器

分爲時間複雜度和空間複雜度。其做用: 時間複雜度是指執行算法所須要的計算工做量;而空間複雜度是指執行這個算法所須要的內存空間。(算法的複雜性體如今運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,所以複雜度分爲時間和空間複雜度)。數據結構

 

時間複雜度:多線程

在計算機科學中,算法的時間複雜度是一個函數,它定量描述了該算法的運行時間。這是一個關於表明算法輸入值的字符串的長度的函數。時間複雜度經常使用大O符號表述,不包括這個函數的低階項和首項係數。架構

通常狀況下,算法的基本操做重複執行的次數是模塊n的某一個函數f(n),所以,算法的時間複雜度記作:T(n)=O(f(n)) 分析:隨着模塊n的增大,算法執行的時間的增加率和 f(n) 的增加率成正比,因此 f(n) 越小,算法的時間複雜度越低,算法的效率越高。併發

用大寫O()來體現算法時間複雜度的記法,咱們稱之爲大O記法

推導大O階方法

 常數設爲1,只保留最高項,去掉與最高項相乘的乘數 ( n^2/2+n/2+1000 -> 獲得n的平方n^2)

 

空間複雜度:經過計算算法所需的存儲空間實現,公式 S(n)=O(f(n)),其中n爲問題的規模,f(n)爲語句關於n所佔存儲空間的函數。

一般咱們都是用時間複雜度來指運行時間的需求,是用空間複雜度指空間需求。

 

 

衡量一個程序是否優質,能夠從多個角度進行分析。其中,最多見的衡量標準是程序的時間複雜度、空間複雜度,以及代碼的可讀性、可擴展性。針對程序的時間復 雜度和空間複雜度,想要優化程序代碼,須要對數據結構與算法有深刻的理解,而且熟悉計算機系統的基本概念和原理;而針對代碼的可讀性和可擴展性,想要優化 程序代碼,須要深刻理解軟件架構設計,熟知並會應用合適的設計模式。

java代碼優化: http://developer.51cto.com/art/201305/396042.htm

http://www.ibm.com/developerworks/cn/java/j-lo-codeoptimize/

 

針對日誌記錄的優化

關閉日誌記錄,或者更改日誌輸出級別

對於 CPU 密集型的程序(即程序中包含大量計算),Java 程序能夠達到 C/C++ 程序同等級別的速度,可是對於 I/O 密集型的程序(即程序中包含大量 I/O 操做),Java 程序的速度就遠遠慢於 C/C++ 程序了,很大程度上是由於 C/C++ 程序能直接訪問底層的存儲設備

針對數據庫鏈接的優化

單例模式得到一個相同的數據庫鏈接,每次數據庫鏈接操做都共享這個數據庫鏈接。這裏沒有使用數據庫鏈接池是由於在程序只有少許的數據庫鏈接操做,只有在大量併發數據庫鏈接的時候才須要鏈接池。

針對插入數據庫記錄的優化

 使用預編譯 SQL

 使用 SQL 批處理

針對多線程的優化

經過 java.lang.Thread 類的 join 方法控制線程執行的前後次序

筆者試着給每一個任務分配兩個線程執行,但願能使程序運行得更快,可是事與願違,此時程序運行的時間反而比每一個任務分配一個線程執行的慢,大約 20 秒。筆者推測,這是由於線程較多(相對於 CPU 的內核數),使得 CPU 忙於線程的上下文切換,過多的線程上下文切換使得程序的性能反而不如以前。所以,要根據實際的硬件環境,給任務分配適量的線程執行

 

針對設計模式的優化

抽象出數據訪問層、代碼的可讀性、可擴展性大大地提升了

相關文章
相關標籤/搜索