重要性java
程序=數據結構+算法
這個等式存在。各個中間件開發者
,架構師
。他們都在努力的優化中間件、項目結構以及算法提升運行效率
下降內存佔用
。而且數據結構中也是蘊含模型以及面向對象的思想,掌握數據結構對邏輯思惟處理抽象能力有很大提高。。
執行規則
、配合必定執行算法
所造成的高效的存儲結構。在咱們所熟知的關係數據庫、非關係數據庫、搜索引擎存儲、消息隊列等都是比較牛的大型數據結構良好的運用。這些數據結構應用不只僅考慮到內存範圍結構設計。還考慮實際os、網絡等其餘因素
。內存
中運行的抽象的數據結構
。是一個相對比較單一的數據結構類型,好比線性結構
、樹
、圖
等等.用戶信息表users
程序員
id | name | sex | |
---|---|---|---|
001 | bigsai | man | |
002 | smallsai | man | |
003 | 菜虛鯤 | woman |
users的pojo對象算法
class users { //略 int id; String name; String sex; } //list和woman是數據 List<users>list;//數據對象list List<users>woman;//數據對象woman list.add(new users(001,"bigsai","man"));//添加數據元素 一個users由(001,bigsai,man)三個數據項組成 list.add(new users(002,"smallsai","man"));//數據元素 list.add(new users(003,"菜虛鯤","woman"));//數據元素 woman.add(list.get(2));//003,"菜虛鯤","woman"三個數據項構成的一個數據元素
上述表中的三條用戶信息的記錄就是數據(也可能多表多集合)。這些數據通常都是用戶輸入
或者是自定義構造完成。固然,還有一些圖像、聲音也是數據。數據庫
基本單位
。一個數據元素由若干數據項
構成!可認爲是一個pojo對象、或者是數據庫的一條記錄。好比菜虛鯤
那條記錄就是一個數據元素。id
、name
、sex
等,這些就是<font color="blue">數據項</font>.數據項是構成數據元素的最小不可分割字段
。能夠看做一個pojo對象或者一張表(people)的一個屬性/字段
的值。users
表、list
集合、woman
集合都是數據對象。單獨一張表,一個集合均可以是一個數據對象。數據類型api
原子類型
:其值不可再分的類型。好比int,char,double,float等。結構類型
:其值能夠再分爲若干成分的數據類型。好比結構體構造的各類結構等。使用它的結構
而不用考慮它的實現細節
成爲可能。好比咱們使用Arraylist。二叉樹等等只須要new 一個而不須要去具體考慮他的內部實現方式。只須要了解他的api和性質便可。其實各個框架的思想也是這樣,對數據、接口進行封裝、繼承使得咱們只須要會用而不須要弄清楚它的具體實現細節。邏輯關係
。邏輯結構分爲線性結構
和非線性結構
。線性結構就是順序表、鏈表之類。而非線性就是集合、樹、圖這些結構。順序存儲
、鏈式存儲
、索引存儲
和散列(哈希)存儲
。定義
和實現
,運算的定義基於邏輯結構,運算的實現基於存儲結構。容易混淆
的是邏輯結構與存儲結構的概念。對於邏輯結構,不難看得出邏輯
二字。邏輯關係也就是二者存在數據上的關係而不考慮物理地址的關係。好比線性結構和非線性結構,它描述的是一組數據中的聯繫方式
和形式
,他針對的是數據。而存儲結構就是跟物理地址掛鉤的。好比一樣是線性表
,可能有多種存儲結構的實現方式。好比順序表
和鏈表
(Arraylist,Linkedlist)它們的存儲結構就不一樣而且採用不一樣存儲結構在不一樣場景計算機運算次數和效率不一樣。它關注的是計算機物理地址與運行具體實現方式。
有窮性、肯定性、可行性、輸入、輸出
。這些從字面意思便可理解。效率和空間資源佔用
。一般複雜度更多描述的是一個量級
程度而不多用具體數字描述。數組
概念:是對一個算法在運行過程當中臨時佔用存儲空間大小的量度,記作S(n)=O(f(n))網絡
比較低
的,可是不能忽視
空間複雜度中重要性。不管在刷題仍是實際項目生產內存都是一個極大額指標。對於java而言更是如此。自己內存就大,若是採用的存儲邏輯不太好會佔用更多的系統資源,對服務形成壓力。String.contains()
方法,咱們都知道他是暴力破解,時間複雜度爲O(n^2^),不須要藉助額外內存。而KMP
算法在效率和速度上都原生暴力方法,可是KMP要藉助其餘數組(next[]
)進行標記儲存運算。就用到了空間開銷。再好比歸併排序
也會藉助新數組在遞歸分冶
的適合進行逐級計算。提升效率,而增長內存開銷。heap OutOfMemoryError
。概念:計算機科學中,算法的時間複雜度是一個函數
,它定性描述了該算法的運行時間。這是一個關於表明算法輸入值的字符串的長度的函數。時間複雜度經常使用大O符號表述,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱爲是漸近的,它考察當輸入值大小趨近無窮時的狀況。數據結構
時間複雜度的排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2^) < O(n^3^) < O(2^n^) <O(n!) < O(n^n^)架構
常見時間複雜度:對於時間複雜度,不少人的概念是比較模糊的。下面舉例子說明一些時間複雜度。框架
O(1): 常數函數
a=15
O(logn): 對數函數
for(int i=1;i<n;i*=2)
分析:假設執行t
次使得i=n
;有2^t^=n; t=log~2~n,爲log
級別時間複雜度爲O(logn)。
O(n): 線性函數
for (int i=0;i<n;i++)
O(nlogn):
for (int i=1;i<n;i++)
for (int j=1;j<i;j*=2)
O(n^2^)
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
固然若是一樣是n=10000.那麼不一樣時間複雜度額算法執行次數、時間也不一樣。
具體 | n | 執行次數 |
---|---|---|
O(1) | 10000 | 1 |
O(log~2~n) | 10000 | 14 |
O( n^1/2^) | 10000 | 100 |
O(n) | 10000 | 10000 |
O(nlog~2~n) | 10000 | 140000 |
O(n^2^) | 10000 | 100000000 |
O(n^3^) | 10000 | 1000000000000 |
結構優點
,好比樹的查找,線段樹
的動態排序等等。還有的是靠算法策略
解決,好比一樣是排序,冒泡排序
的地位就略低,還有dp算法用動態發現規律解決問題。要想變得更快,那就得掌握更高級的數據結構和更精巧的算法。時間複雜度計算
時間複雜度計算通常步驟
:
二、計算語句執行的數量級
三、用O表示結果
兩個規則:
並列
關係的執行語句那麼取最大
的那個。T(n)=O(m)+O(n)=max(O(m),O(n))
;T(n)=O(n)+O(nlogn)=max(O(n),O(nlogn))
=O(nlogn)
;乘法規則:循環結構,時間複雜度按乘法進行計算
eg:T(n)=O(m)*O(n)=O(mn)
·T(n)=O(m)*O(m)=O(m^2)
(兩層for循環)
其餘:
最優時間複雜度
(可能執行次數最少時),最壞時間複雜度
(執行次數最少時),平均時間複雜度
.這在後面的排序算法
會具體分析。固然,後面會一塊兒學習一些常見的數據結構和常見的算法,進行復雜度剖析。至於緒論,就先介紹這些,下面會先介紹線性表和遞歸算法。
bigsai