資料結構與演算法基礎

2021-10-22 09:55:27 字數 2935 閱讀 2553

電腦科學的研究物件是問題、解決問題的過程,以及通過該過程得到解決方案。演算法是具有有限步驟的過程,依照這個過程能解決問題。因此,演算法就是解決方案

電腦科學是研究問題及其解決方案,以及研究目前無解的問題的科學。可以簡答的認為電腦科學就是研究演算法的科學。

抽象資料元素:沒有實際含義的資料元素,例如 a0 a1、a2 … an-1。

抽象資料型別(abstract data type,adt):乙個邏輯概念上的型別和這個型別上的操作集合。對使用者隱藏資料表示的資料型別,從邏輯上描述了如何看待資料及其對應運算而無需考慮具體實現。通過資料抽象,我們對資料進行了一層封裝,其基本意思是封裝具體的實現細節,使它們對使用者不可見,者被稱為資訊隱藏

資料結構:抽象資料型別的實現。

資料的邏輯結構:資料元素直接的相互聯絡,一般分為線性結構、樹型結構和圖型結構三種,其中樹型結構和圖型結構又可合成為非線性結構。

資料的儲存結構:資料元素在計算機中的儲存方式。資料儲存結構的基本形式有兩種:順序儲存結構和鏈式儲存結構。

鏈式儲存結構:用一組任意的儲存單元儲存線性表的資料元素(這組儲存單元可以是連續的,也可以是不連續的),其特定是,邏輯上相鄰的資料元素在物理上(即記憶體儲存位置上)不一定相鄰,資料間的邏輯關係表現在節點的鏈結關係上。

資料的操作和資料的操作集合:一種資料型別資料允許進行的某種操作稱作資料的操作,如插入資料元素、刪除資料元素等;一種資料型別資料所有的操作稱作資料的操作集合。

演算法:描述求解問題方法的操作步驟集合。演算法的描述語言有三種形式:文字形式、偽**形式和程式語言形式。

任何演算法設計都滿足以下性質:

演算法的設計應滿足以下目標:

演算法分析關係的是基於所使用的計算資源比較演算法。計算資源究竟是什麼,一是演算法在解決問題時要占用的空間或記憶體,另一種是演算法的執行時間執行時間

時間複雜度不是用來計算程式具體耗時的,空間複雜度也不是用來計算程式實際占用的空間的。它們只是量化了演算法的操作或步驟。

時間複雜度使用數量級(order of magnitude),常被稱為大 o 記法來表示(o 指 order),即t(n) = o(f(n))

n,通常稱為問題的規模

***f(n)***,表示每行**執行次數之和

***t(n)***,表示解決問題所需時間

o,表示正比例關係

這個公式的全稱是:演算法的漸進時間複雜度

舉個例子:

t(n) = 1 + n,隨著 n 越來越大,常數 1 對最終結果的影響越來越小,可以直接捨去,直接說執行時間是 o(n)。

再舉個例子:

t(n) = 5n2 + 27n + 1005,當 n 很小時,常數 1005 時在這個函式中起決定性作用的部分,但隨著 n 增長,n2

變的更為重要,n 很大時,包括 27n、1005 和 係數 5 的作用都不顯著了,因此可以說,函式 t(n) 的數量級是 f(n)=n2

,或直接說是 o(n2)。

常見的時間複雜度量級(上至下依次的時間複雜度越來越大,執行的效率越來越低):

f(n)名稱1

常數logn對數n

線性nlogn

線性對數

n2平方

n3立方

nkk 次方

2n指數

乙個時間複雜度為 o(n) 例子:

for

(i=0

; i++i)

乙個時間複雜度為 o(n2) 的例子:

for

(i=0

; i++i)

}

乙個時間複雜度為 o(nlogn) 的例子:

for

(i=1

; i)}

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度,同樣反映的是乙個趨勢,記做 ***s(n) = o(f(n))***,空間複雜度比較常用的有:o(1)、o(n)、o(n²)。

乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。

乙個演算法的空間複雜度只考慮在執行過程中為區域性變數分配的儲存空間的大小,它包括為參數列中形參變數分配的儲存空間和為在函式體中定義的區域性變數分配的儲存空間兩個部分。若乙個演算法為遞迴演算法,其空間複雜度為遞迴所使用的堆疊空間的大小,它等於一次呼叫所分配的臨時儲存空間的大小乘以被呼叫的次數(即為遞迴呼叫的次數加1,這個1表示開始進行的一次非遞迴呼叫)。

舉個例子:

int i =1;

int j =2;

++i;

j++;

int m = i + j;

縱然**中為變數 i、j、m 都分配了記憶體,但是程式的臨時空間不隨著某個變數 n 的大小而變化,所以它的空間複雜度為 s(n) = o(1)。

再舉乙個例子:

int tmp = new int[n]

for(i=1; i<=n; ++i)

縱然**中有乙個迴圈,但這個迴圈並沒有分配新的記憶體,只是再**第一行 new 了乙個陣列出來,且這個陣列占用的大小為 n,所以它的空間複雜度為 s(n) = o(n)。

資料結構與演算法基礎

一 資料結構概述 資料結構的主要任務是通過分析資料物件的結構特徵,包括邏輯結構及資料物件之間的關係,然後把邏輯結構表示成計算機課實現的物理結構,從而便於計算機處理。概念術語 二 資料的邏輯結構與物理結構 邏輯結構 logical structure 是指在資料物件中資料元素之間的相互關係。資料元素之...

資料結構與演算法 演算法基礎一

1 2 插入排序,在前k個元素有序的前提下插入arr k 將前面有序元素依次與arr k 比較 移動,3 最終將arr k 插入有序元素中的合適位置,形成k 1個有序元素4 5 org.junit.test 6public void testinsert 13 arr j temp 14 15 1 ...

資料結構與演算法 基礎資料結構 佇列實現

在學習佇列的實現過程中,跟著教程自己手寫了佇列的實現,理解佇列的先進先出原理。以及略微複雜的迴圈佇列形成的乙個閉環,略微吃力,還需努力,詳細說明在注釋 package com.zhouyou.queue 普通佇列的實現 public class arrayqueue public void push...