資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。
這就跟我們學習使用一門語言是相似的,我們需要記住各種不同型別的資料結構的定義再用**去實現。不同的資料結構之間的結構差別是很大的,我們需要加深印象以快速的分辨出他們之間的異同。
當你能熟練記住各種資料結構的定義的時候,此時只是說明你記住了。程式設計是一門實操性很強的技能,我們需要通過不斷的練習才能說我們是真正的學會了!自己編碼實現的過程能讓我們對底層的實現原理更加深刻。
這個環節屬於資料結構的實際應用。每個資料結構被創造出來都是為了解決相應的問題。每個問題的性質都不一樣,也沒有通用的資料結構。我們要分析問題的性質,根據問題的特點擊擇最合適的資料結構。
時間複雜度表示程式的執行時間與資料規模增長的變化趨勢,也叫漸進時間複雜度。時間複雜度一般有最差時間複雜度、最好時間複雜度和平均時間複雜度。舉個例子
#include int findnumindex(int n,int nums)
}return -1;
}int main();
int index = findnumindex(3,nums);
printf("numindex = %d\n",index);
return 0;
}
我們分析findnumindex這個函式的**。我們假定一行**的執行時間為time,findnumindex函式的**一共需要執行 nums.length * 2 + 1個time。不難看出,我們**的執行時間跟陣列的長度和n的值是正相關的,陣列越長,我們的**執行時間也越長,n的位置越往後或者不存在,**的執行時間越長。接下來我們計算下時間複雜度。
最好情況下,n永遠都是nums的第乙個元素。時間複雜度為3 * time
最差情況下,n不存在nums之中,時間複雜度為 nums.length * 2 + 1
平均時間複雜度,有n+1種情況,每種情況需要遍歷的次數不一致。得出(1+2+3+4……+n+n)/(n+1) = n(n+3)/2(n+1)
你以為這就結束了?
在計算時間複雜度的時候,我們需要記住常數是可以忽略不記的。同時使用符號o來表示時間複雜度。
以上時間複雜度簡化下為:
最好:o(1)
最壞:o(n)
平均:o(n)
常見的演算法時間複雜度:o(1),o(n),o(n2),o(log n),o(n * log n)
空間複雜度用來描述我們**在執行過程中額外開闢的空間。空間複雜度的計算原則跟時間複雜度是一致的。
舉個例子:
#include //空間複雜度是o(1)的,沒有額外開闢其他的位址空間。常數忽略
int findnumindex(int n,int nums)
}return -1;
}// 空間複雜度為o(n),額外開闢的空間跟nums的長度正相關
int * copynums(int nums,int * p)
return p;
}
在記憶體當中,資料的分布方式有兩種,一種是順序結構,一種是鏈式結構。
資料的記憶體位置在記憶體中是連續的。即是一塊規整的記憶體空間,每個邏輯上相鄰的元素在物理上也是相鄰的。優點是支援資料的資料的隨機訪問,資料訪問速度快。缺點是在記憶體分配是要求是分配的記憶體空間連續的,元素更新代價大。常見的資料結構有陣列。
資料在記憶體當中的位置是不確定的。邏輯上相鄰的元素在物理上可能不相鄰,元素之間的連續訪問需要通過指標去記錄下乙個元素的物理位置。優點是可以充分利用記憶體空間,允許記憶體是散亂的。缺點是需要花費額外的空間去儲存元素的位置,不支援隨機訪問,元素增加刪除代價小。常見的額資料結構有鍊錶等。
資料結構入門
資料 data 是客觀事物的符號表示。在電腦科學中指的是所有能輸入到計算機中並被電腦程式處理的符號的總稱。資料元素 data element 是資料的基本單位,在程式中通常作為乙個整體來進行考慮和處理。乙個資料元素可由若干個資料項 data item 組成。資料項是資料的不可分割的最小單位。資料項是...
資料結構入門
需要明確的幾個問題 1.什麼是資料結構?資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。簡單的來說數 據結構就是關係,就是資料元素相互之間存在的一種或多種特定關係的集合。2.資料結構研究什麼?1 資料的儲存 2 資料的操作 3.學習資料結構有什麼作用...
資料結構入門
資料 是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。前提 助於理解 1.可以輸入到計算機中 2.能被電腦程式處理 舉例 整型資料,聲音,影象等 資料物件 性質相同的資料元素的集合,是資料的子集 這裡解釋一下性質相同 具有相同數量和型別的資料項 比如 ...