1. 程式人生 > 其它 >一個演算法對於某個輸入的迴圈次數是可以事先估計出來的_資料結構與演算法入門...

一個演算法對於某個輸入的迴圈次數是可以事先估計出來的_資料結構與演算法入門...

技術標籤:一個演算法對於某個輸入的迴圈次數是可以事先估計出來的下拉選單實現樹狀結構資料結構中為什麼輸入資料還沒輸入完全就結束了演算法在某個集合中找個一個或者多個的和等於某個固定值

今天分享一下資料結構與演算法的基本知識,主要包括以下幾點:資料結構基本概念、資料結構型別、演算法基本概念、演算法時間複雜度和空間複雜度。資料結構基本概念1、資料

① 資料(data)是描述客觀事物的數值、字元以及能輸入機器且能被處理的各種符號集合。 ② 資料的含義非常廣泛,除了通常的數值資料、字元、字串是資料以外,聲音、影象等一切可以輸入計算機並能被處理的都是資料。 eg: 除了表示人的姓名、身高、體重等的字元、數字是資料,人的照片、指紋、三維模型、語音指令等也都是資料。 2、資料項 ① 資料項(data item)具有原子性,是不可分割的最小資料單位。 (類似資料庫的欄位) eg: 描述學生相關資訊的姓名、性別、學號等都是資料項,三維座標中的每一維座標值也是資料項。 資料項具有原子性,是不可分割的最小單位。 3、資料元素 ① 資料元素(data element)是資料的基本單位,是資料集合的個體,通常由若干個資料項組成,在計算機程式中通常作為一個整體來進行處理。 (類似資料庫的每條記錄) eg: 一條描述一位學生的完整資訊的資料記錄就是一個數據元素; 空間中一點的三維座標也可以是一個數據元素。 4、資料物件 ① 資料物件(data object)是性質相同的資料元素的集合,是資料的子集。 (類似資料庫的表) eg:一個學校的所有學生的集合就是資料物件,空間中所有點的集合也是資料物件; 5、資料結構 ① 資料結構(data structure)是指相互之間存在一種或多種特定關係的資料元素的集合。 ② 是組織並存儲資料以便能夠有效使用的一種專門格式,它用來反映一個數據的內部構成,即一個數據由那些成分資料構成,以什麼方式構成,呈什麼結構。 ③ 由於資訊可以存在於邏輯思維領域,也可以存在於計算機世界,因此作為資訊載體的資料同樣存在於兩個世界中,表示一組資料元素及其相互關係的資料結構同樣也有兩種不同的表現形式: 一種是資料結構的邏輯層面,即資料的邏輯結構; 一種是存在於計算機世界的物理層面,即資料的儲存結構。 ④ 資料結構=邏輯結構+儲存結構+(在儲存結構上的)運算/操作 資料結構型別
一、資料的邏輯結構 1、 資料的邏輯結構指資料元素之間的邏輯關係,和實現無關; 2、 邏輯結構有兩種分類方式,如下: a、分類一: 線性結構和非線性結構 1) 線性結構: ① 有且只有一個開始結點和一個終端結點,並且所有結點都最多隻有一個 直接前驅和一個直接後繼。 ② 線性表就是一個典型的線性結構,它有四個基本特徵: * 集合中必存在唯一的第一個元素; * 集合中必存在唯一的最後一個元素; * 除最後元素之外,其它資料元素均有唯一的直接後繼; * 除第一元素之外,其它資料元素均有唯一的直接前驅。 2)非線性結構: ① 非線性結構的邏輯特徵是一個結點元素可能對應多個直接前驅和多個直 接後繼。 ② 常見的非線性結構有: 樹(eg: 二叉樹等),圖(eg: 網等)。 b、分類二: 集合結構 線性結構 樹狀結構 網路結構 ① 邏輯結構的四種基本型別: 集合結構、線性結構、樹狀結構和網路結構; ②表和樹是最常用的兩種高效資料結構,許多高效的演算法能夠用這兩種資料結構來設計實現; ③ 集合結構: 就是數學中所學習的集合,集合中的元素有三個特徵: 確定性: 集合中的元素必須是確定的; 唯一性: 集合中的元素互不相同; 無序性: 集合中的元素沒有先後之分; ④ 線性結構: 資料結構中線性結構指的是資料元素之間存在著一對一的線性 關係的資料結構; ⑤ 樹狀結構: 除了一個數據元素(根節點)以外每個資料元素有且僅有一個直接前驅元素,但是可以有多個直接後續元素,資料元素之間是1對多的聯絡 ⑥ 網路結構: 每個資料元素可以有多個直接前驅元素,也可以有多個直接後繼元素,資料元素之間是多對多的聯絡; 二、資料的儲存結構 1、資料的儲存結構主要包括資料元素本身的儲存以及資料元素之間關係表示,是資料的邏輯結構在計算機中的表示。 2、常見的儲存結構有順序儲存,鏈式儲存,索引儲存,以及雜湊儲存: a、順序儲存結構: ① 把邏輯上相鄰的節點儲存在物理位置上相鄰的儲存單元中,結點之間的邏輯關係由儲存單元的鄰接關係來體現; ② 資料元素的儲存對應於一塊連續的儲存空間,資料元素之間的前驅和後續關係通過資料元素,在儲存器中的相對位置來反映; ③ 優點: i.節省儲存空間,因為分配給資料的儲存單元全用存放結點的資料(eg:陣列),結點之間的邏輯關係沒有佔用額外的儲存空間(eg:連結串列,需要儲存下個元素的地址); ii.採用這種方法時,可實現對結點的隨機存取,即每一個結點對應一個序號,由該序號可以直接計算出來結點的儲存地址。 ④ 缺點: i.插入和刪除操作需要移動元素,因為是連續的儲存空間,效率較低; ii.必須提前分配固定數量的空間,如果儲存元素少,可能導致空閒浪費; b、鏈式儲存結構: ① 資料元素的儲存對應的是不連續的儲存空間,每個儲存節點對應一個需要儲存的資料元素。 ② 每個結點是由資料域和指標域組成。 ③ 元素之間的邏輯關係通過儲存節點之間的連結關係反映出來,邏輯上相鄰的節點物理上不必相鄰。 ④ 缺點: i.比順序儲存結構的儲存密度小,每個節點都由資料域和指標域組成,所以相同空間內假設全存滿的話順序比鏈式儲存更多; ii.查詢結點時鏈式儲存要比順序儲存慢,需要從前往後遍歷查詢; ⑤ 優點: i.插入、刪除靈活,不必移動節點,只要改變節點中的指標。 ii.有元素才會分配結點空間,不會有閒置的結點。 c、索引儲存結構: ①除建立儲存結點資訊外,還建立附加的索引表來標識結點的地址,eg: 圖書、字典的目錄。 d、雜湊儲存結構: ① 根據結點的關鍵字直接計算出該結點的儲存地址HashSet HashMap 一種神奇的結構,新增、查詢速度快。 三、總結: 1、線性表邏輯結構對應的順序儲存結構為順序表,對應的鏈式儲存結構為連結串列。 2、同一邏輯結構可以對應多種儲存結構。 3、同樣的運算,在不同的儲存結構中,其實現過程是不同的。 演算法
1、是指令的集合,是為解決特定問題而規定的一系列操作,簡單的說,演算法就是計算機解題的過程,在這個過程中,無論是形成解題思路還是編寫程式,都是在實施某種演算法,前者是演算法的邏輯形式,後者是演算法的程式碼形式。 2、它是明確定義的可計算過程,以一個數據集合作為輸入,併產生一個數據集合作為輸出; 3、一個演算法通常來說具有以下五個特性: ① 輸入: 一個演算法應以待解決的問題的資訊作為輸入。 ② 輸出: 輸入對應指令集處理後得到的資訊。 ③可行性: 演算法是可行的,即演算法中的每一條指令都是可以實現的,均能在有限的時間內完成。 ④有窮性: 演算法執行的指令個數是有限的,每個指令又是在有限時間內完成的,因此整個演算法也是在有限時間內可以結束的。 ⑤確定性: 演算法對於特定的合法輸入,其對應的輸出是唯一的。 即當演算法從一個特定輸入開始,多次執行同一指令集結果總是相同的。 eg:求0+1+2+3+...10000=?有以下幾種演算法可實現: 演算法1: 依次相加 while do-while for 演算法2: 高斯解法: 首尾相加*50 (1+10000)*10000/2 100*101/2 演算法3: 使用遞迴實現: sum(100) = sum(99)+100 sum(99)= sum(98)+99 ..... sum(2) = sum(1)+2 sum(1) = 1 4、評價演算法優劣的依據: 複雜度(時間複雜度和空間複雜度) 演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度 時間複雜度是指執行演算法所需要的計算工作量; 空間複雜度是指執行這個演算法所需要的記憶體空間; 時間複雜度
1、時間頻度: 一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道,但我們不可能也沒有必要對每個演算法都上機測試。 一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。 一個演算法中的語句執行次數稱為語句頻度或時間頻度,表示為T(n),n表示問題的規模; 2、時間複雜度: ①有時我們想知道它變化時呈現什麼規律,想知道問題的規模,而不是具體的次數,此時引入時間複雜度。 ②一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式,記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度: T(n)=O(f(n))。 ③其實時間複雜度就是時間頻度去掉低階項和高階項常數,所以時間頻度與時間複雜度是不同的,時間頻度不同但時間複雜度可能相同。 eg:某兩個演算法的時間頻度是 T(n) = 100000n2+100n+100 T(n) = 10n2+10n+6 T(n) = n2 ,但是時間複雜度都是 T(n) = O(n2) ④ 最壞時間複雜度和平均時間複雜度 a.最壞時間複雜度: 最壞情況下的時間複雜度稱最壞時間複雜度,一般不特別說明,討論的時間複雜度均是最壞情況下的時間複雜度。 這樣做的原因是: 最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上界,這就保證了演算法的執行時間不會比任何更長。 在最壞情況下的時間複雜度為T(n)=O(n),它表示對於任何輸入例項,該演算法的執行時間不可能大於O(n)。 b.平均時間複雜度: 平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,演算法的期望執行時間。 ⑤ 時間複雜度計算 根本沒有必要計算時間頻度,即使計算處理還要忽略常量、低次冪和最高次冪的係數,所以可以採用如下簡單方法: * 找出演算法中的基本語句;   演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體;   * 計算基本語句的執行次數的數量級;    只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可, 可以忽略所有低次冪和最高次冪的係數。 這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上: 增長率。   * 用大Ο記號表示演算法的時間效能:    將基本語句執行次數的數量級放入大Ο記號中。 ⑥ 時間複雜度舉例
一個簡單語句的時間複雜度為O(1)。int count=0;100個簡單語句的時間複雜度也為O(1)。(100是常數,不是趨向無窮大的n)int count=0;一個迴圈的時間複雜度為O(n)。int n=8, count=0;for (int i=1; i<=n; i++)count++;時間複雜度為O(log2n)的迴圈語句。int n=8, count=0;for (int i=1; i<=n; i*=2)   count++;時間複雜度為O(n2)的二重迴圈。int n=8, count=0;for (int i=1; i<=100n; i++)   for (int j=1; j<=10n; j++)       count++;時間複雜度為O(nlog2n)的二重迴圈。int n=8, count=0;for (int i=1; i<=n; i*=2)   for (int j=1; j<=n; j++)       count++;時間複雜度為O(n2)的二重迴圈。int n=8, count=0;for (int i=1; i<=n; i++)   for (int j=1; j<=i; j++)       count++;1+2+3+4....+n=(1+n)*n/2時間複雜度是O(n2)
⑦ 常用的時間複雜度級別: 從上到下執行效率越來越低 常數階O(1) 對數階O(log2n) 線性階O(n) 線性對數階O(n*log2n) 平方階O(n2) 立方階O(n3) k次方階O(nk) 指數階O(2n) 階乘階O(n!) 空間複雜度 1、演算法的儲存量包括: ① 程式本身所佔空間 ② 輸入資料所佔空間 ③ 輔助變數所佔空間 2、輸入資料所佔空間只取決於問題本身,和演算法無關,則只需要分析除輸入和程式之外的輔助變數所佔額外空間。 3、空間複雜度是對一個演算法在執行過程中臨時佔用的儲存空間大小的量度,一般也作為問題規模n的函式,以數量級形式給出,記作: S(n) = O(g(n))
空間複雜度分析:int fun(int n){         int i,j,k,s;           s=0;           for (i=0;i<=n;i++)                               for (j=0;j<=i;j++)                                           for (k=0;k<=j;k++)                                         s++;           return(s);}由於演算法中臨時變數的個數與問題規模n無關,所以空間複雜度均為S(n)=O(1)。空間複雜度分析2:void fun(int a[],int n,int k)  //陣列a共有n個元素{        int i;       if (k==n-1)          for (i=0;i                 printf("%d\n",a[i]);  //執行n次       else       {  for (i=k;ia[i]=a[i]+i*i;//執行n-k次          fun(a,n,k+1);       }}此屬於遞迴演算法,每次呼叫本身都要分配空間,fun(a,n,0)的空間複雜度為O(n)。
4、空間複雜度相比時間複雜度分析要少; 5、對於遞迴演算法來說,程式碼一般都比較簡短,演算法本身所佔用的儲存空間較少,但執行時需要佔用較多的臨時工作單元,若寫成非遞迴演算法,程式碼一般可能比較長,演算法本身佔用的儲存空間較多,但執行時將可能需要較少的儲存單元。

今天總結了一下資料結構和演算法的基本知識,如果大家發現有什麼不妥之處或分析不到位的地方,非常歡迎留言討論交流哦42ff82c1269fd8058bbe2b6c1ad2d967.png42ff82c1269fd8058bbe2b6c1ad2d967.png42ff82c1269fd8058bbe2b6c1ad2d967.png


歡迎關注ITSK,每天進步一點點,我們追求在交流中收穫成長和快樂 bb874cdd608e9b2c450cac35bc8b713b.png bb874cdd608e9b2c450cac35bc8b713b.png bb874cdd608e9b2c450cac35bc8b713b.png

221ee1d5e87de9016118a0b34d71521d.png