影響系統性能的因素有不少,把這些因素分爲三大類java
一、算法理論上的計算複雜度
二、開發實現的方案和硬件設備的規格
三、算法理論上的計算複雜度、開發實現的方案和硬件設備的規格算法
算法複雜度是一個比較抽象的概念,一般只是一個估計值,它用於衡量程序在運行時所須要的資源用於比較不一樣算法的性能好壞數組
咱們一般所說的時間複雜度是指漸進時間複雜度,標識程序運行時間隨着問題複雜度增長而變化的規律緩存
空間複雜度是指漸進空間複雜度,標識程所須要的存儲的存儲空間複雜度增長而變化的規律服務器
代碼的添加,覺得着計算機操做的增長,也就是時間複雜度的增長
若是代碼是平行增長的,就是加法
若是是循環、嵌套或者函數的嵌套,那麼就是乘法函數
好比二分查找中
一、第一步是對長度爲n的數組排序,時間複雜度是O(nlogn)
二、第二步是在這個已排序的數組中進行查找 時間複雜度是 O(logn)
這兩部分是平行的,因此計算時間複雜度時可使用加法,因此時間複雜度是:O(nlogn)+O(logn)。性能
String[] dictionary = {"i", "am", "one", "of", "the", "authors", "in", "geekbang"}; Arrays.sort(dictionary); // 時間複雜度爲 O(nlogn) String wordToFind = "i"; boolean found = Lesson3_3.search(dictionary, wordToFind); // 時間複雜度 O(logn) if (found) { System.out.println(String.format(" 找到了單詞 %s", wordToFind)); } else { System.out.println(String.format(" 未能找到單詞 %s", wordToFind)); }
一、Arrays.sort(dictionary),我用了Java 自帶的排序函數,時間複雜度爲 O(nlogn),優化
二、而Lesson3_3.search 是我本身實現的二分查找,時間複雜度爲 O(logn)
spa
三、二者是並行的,並以此執行,所以總的時間複雜度是二者相加
對於空間複雜度,一樣如此,設計
須要注意的是,空間複雜度看的是對內存空間的使用,而不是計算的次數,若是語句中沒有新開闢空間,那麼不管是平行增長仍是嵌套增長代碼,都不會增長空間複雜度
這個法則主要是運用了數量級和運算法則優先級的概念,在剛剛介紹的第一個法則中,咱們會對代碼不一樣部分所產生的複雜度進行相加或相乘
使用加法或減法時,你可能會遇到不一樣數量級的複雜度,這個時候,咱們只須要看最高數量級的,而忽略常量、係數和較低數量級的複雜度
這個法則對於空間複雜度,一樣使用
注意,這個法則對於乘法或除法並不使用,由於乘法和除法會改變參與運算的複雜度的數量級
這個法則主要運用了多元變量的概念,其核心思想是複雜度可能受到多個因素的影響,在這種狀況下,咱們要同時考慮全部因素,並在複雜度公式中體現出來
使用動態規劃解決編輯距離問題,從解決方案的推導和代碼能夠看出,這個問題設計兩個因素
一、參與比較的第一個字符串的長度n和第二個字符串的長度m
二、代碼使用了兩次嵌套循環,第一層循環的長度是n,第二層循環的長度爲m
三、根據乘法法則,時間複雜度爲O(n*m)。而空間複雜度,很容易從推導結果的狀態轉移表得出,也是O(n*m)
排列組合的思想不只出如今數學模型的設計中,一樣也會出如今複雜度分析中,它常常會用在最好、最壞和平均複雜度分析中
一、數據切分階段
二、數據合併階段
兩個極端加起來的時間複雜度爲O(n-1)+nlog2n,最終簡化爲 nlogn。是否是很直觀?
咱們在放出咱們以前講的二分查找所用的圖,你能夠結合這個例子進一步理解
動態規劃的時候咱們常常要畫出狀態轉移的表格,看到這類表格,
咱們能夠很容易地得出該算法的時間複雜度和空間複雜度,m 爲第一個字符串的長度,n 爲第二個字符串的長度。
因此,咱們很快就能得出這種算法的時間複雜度爲O(3m*n),簡寫爲 O(m*n),空間複雜度爲 O(m*n)
在給定的計算量下,一般時間複雜度和空間複雜度呈現數學中的反比關係。這就說明,若是咱們無法下降總體的計算量,
那麼也許能夠經過增長空間複雜度來達到下降時間複雜度的目的或者反之,經過藏家時間複雜度來下降空間複雜度
緩存系統
在沒有緩存系統的時候,每次請求都要服務器來處理,所以時間複雜度比較高,若是使用了緩存系統
那麼咱們會消耗更多的內存空間,可是下降了請求相應的時間
說道這、你也許會問,在使用廣度優先策略優化聚合操做的時候,不管是時間仍是空間複雜度,都大幅下降了啊?請注意,
這裏的互換法則有個前提條件,就是計算兩固定,而聚合操做的優化,是利用了廣度優先的特色,大幅減小了總體的計算量,
所以能夠保證時間和空間複雜度都的到下降
請嘗試使用本次介紹的規則,分析一下雙向廣度優先搜索的時間和空間複雜度
思考題感受要根據具體圖的狀況來看具體時間複雜是多少,就以前的六度關係的例子,假設把關係看做是一個樹,每一個結點都有 n 個子結點,要確認兩我的是幾度好友,
也就是確認兩個結點相距多少層,若是是單向廣度優先搜索,時間複雜度 O(n^degree),雙向能夠運用加法法則,兩邊同時出發,時間複雜度 2 * O(n^(degree/2)),
空間複雜度是隊列中暫存的結點的最大值,和時間複雜度同樣