數據結構與算法—緒論

前言

重要性

  • 數據結構與算法是程序員內功體現的重要標準之一,而數據結構的也應用在各個方面,更有程序=數據結構+算法這個等式存在。各個中間件開發者架構師。他們都在努力的優化中間件、項目結構以及算法提高運行效率降低內存佔用。並且數據結構中也是蘊含模型以及面向對象的思想,掌握數據結構對邏輯思維處理抽象能力有很大提升。。

數據結構


在這裏插入圖片描述

概念

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

個人理解

  • 簡言之,數據結構是一系列的存儲結構按照一定執行規則、配合一定執行算法所形成的高效的存儲結構。在我們所熟知的關係數據庫、非關係數據庫、搜索引擎存儲、消息隊列等都是比較牛的大型數據結構良好的運用。這些數據結構應用不僅僅考慮到內存範圍結構設計。還考慮實際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對象、或者是數據庫的一條記錄。比如菜虛鯤那條記錄就是一個數據元素。
  • 數據項: 而構成用戶字段/屬性的有idnamesex等,這些就是<font color="blue">數據項</font>.數據項是構成數據元素的最小不可分割字段。可以看作一個pojo對象或者一張表(people)的一個屬性/字段的值。
  • 數據對象:是相同性質數據元素的集合。是數據的一個子集。比如上面的users表、list集合、woman集合都是數據對象。單獨一張表,一個集合都可以是一個數據對象。
  • 數據類型

    • 原子類型:其值不可再分的類型。比如int,char,double,float等。
    • 結構類型:其值可以再分爲若干成分的數據類型。比如結構體構造的各種結構等。
  • 抽象數據類型(ADT):抽象數據類型(ADT)是一個實現包括儲存數據元素的存儲結構以及實現基本操作的算法。使得只研究和使用它的結構而不用考慮它的實現細節成爲可能。比如我們使用Arraylist。二叉樹等等只需要new 一個而不需要去具體考慮他的內部實現方式。只需要瞭解他的api和性質即可。其實各個框架的思想也是這樣,對數據、接口進行封裝、繼承使得我們只需要會用而不需要弄清楚它的具體實現細節。

三要素

  1. 邏輯結構:數據元素之間的邏輯關係。邏輯結構分爲線性結構非線性結構。線性結構就是順序表、鏈表之類。而非線性就是集合、樹、圖這些結構。
  2. 存儲結構:數據結構在計算機中的表示(又稱映像,也稱物理結構),存儲結構主要分爲順序存儲鏈式存儲索引存儲散列(哈希)存儲
  3. 數據的運算:施加在數據上的運算包括運算的定義實現,運算的定義基於邏輯結構,運算的實現基於存儲結構。
  • 在這裏容易混淆的是邏輯結構與存儲結構的概念。對於邏輯結構,不難看得出邏輯二字。邏輯關係也就是兩者存在數據上的關係而不考慮物理地址的關係。比如線性結構和非線性結構,它描述的是一組數據中的聯繫方式形式,他針對的是數據。而存儲結構就是跟物理地址掛鉤的。比如同樣是線性表,可能有多種存儲結構的實現方式。比如順序表鏈表(Arraylist,Linkedlist)它們的存儲結構就不同並且採用不同存儲結構在不同場景計算機運算次數和效率不同。它關注的是計算機物理地址與運行具體實現方式

算法分析


在這裏插入圖片描述

五個重要特性

  • 至於算法的概念,傳統的數據結構介紹都會有:有窮性、確定性、可行性、輸入、輸出。這些從字面意思即可理解。
  • 而一個好的算法,通常更要着重考慮的是效率和空間資源佔用

算法效率的度量

通常複雜度更多描述的是一個量級程度而很少用具體數字描述。

空間複雜度

概念:是對一個算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))

  • 空間複雜度其實在算法的衡量佔比是比較低的,但是不能忽視空間複雜度中重要性。無論在刷題還是實際項目生產內存都是一個極大額指標。對於java而言更是如此。本身內存就大,如果採用的存儲邏輯不太好會佔用更多的系統資源,對服務造成壓力。
  • 而算法很多情況都是犧牲空間換取時間(效率)。就比如我們熟知的字符串匹配String.contains()方法,我們都知道他是暴力破解,時間複雜度爲O(n^2^),不需要藉助額外內存。而KMP算法在效率和速度上都原生暴力方法,但是KMP要藉助其他數組(next[])進行標記儲存運算。就用到了空間開銷。再比如歸併排序也會藉助新數組在遞歸分冶的適合進行逐級計算。提高效率,而增加內存開銷。
  • 當然,你的時間算法的空間花銷最大不能超過jvm設置的最大值,一般爲2G.(2147483645)如果開二維數組多種多維數據不要開的太大,可能會導致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(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)

  • 常見的排序算法很多正常情況都是nlogn。

O(n^2^)

  • for(int i=0;i<n;i++)
    for(int j=0;j<i;j++)

    • 其實O(n^2^)的效率就不敢恭維了。對於大的數據O(n^2^)甚至更高次方的執行效果會很差。

當然如果同樣是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算法用動態發現規律解決問題。要想變得更快,那就得掌握更高級的數據結構和更精巧的算法。

時間複雜度計算
時間複雜度計算一般步驟

  • 1、找到執行次數最多的語句

2、計算語句執行的數量級
3、用O表示結果

兩個規則:

  • 加法規則: 同一程序下如果多個並列關係的執行語句那麼取最大的那個。
    eg: 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

圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章