問題:
信息世界中,計算機是加工處理的信息的載體,在這個過程中面臨著三個問題:
1.如何方便高效的組織數據
2.如何在計算機中存儲數據(內存和外存)
3.如何對存儲的數據進行高效的操作
目的:
我們都知道,我們都會表述一件事,老板交代你一件事情,你要陳述給你的員工,讓他們明白你的意思,有些人可能簡要的幾句話
就把事情表達清楚,可是有的人說了一大堆才明白他說什麼,這個比喻不太恰當,同樣在面對同一個程序的時候我們就可以出現兩
種程序:有的人寫出來的程序效率很高,有的人卻用復雜的方法來解決一個簡單的問題。
簡而言之目的有三個:
1.形成自己數據結構知識庫
2.提高程序設計水平
3.提供程序設計者的基本技能
基本概念和術語
1.數據(Data):能被計算機識別的信息的載體,數值數據,聲音,文字等等
2.數據元素(Data Element)和數據項(Data Item)DE:數據的實體 DI:數據的屬性 最常見的是數據表的一條記錄(用戶) 和
字段(用戶名,密碼,性別等等)
3.數據對象(Data Object)性質相同的數據元素的集合 例如:{0,1,2,3,4} , {a,b,c,d} , {用戶A,用戶B,用戶C….}
4.數據類型(Data Type)int,string等等
5.數據結構(Data Structure) 在數據集合的基礎上組織起來的有關系數據結構,通常有四類節本數據結構:A集合 B線性結構 C樹形結
構 D 網狀結構或者圖形結構
A Set B Linear Structure C Tree Structure D Graphic Structure
數據結構記做 DS(Data Structure) 是一個二元組 DS=(D,R) D是有限的數據元素集合 R 是元素之間關系
通過例子理解後三種數據結構:
B 線性數據結構 學生信息表
一行:數據元素 列:數據項 元素與元素的關系:1對1
C 樹形結構 家譜
這個不多解釋。節點:數據元素 關系:一對多 或者 多對一
D 圖形結構
圖形結構:交通圖 元素:城市 關系多對多
數據結構
包括數據的邏輯結構和數據的物理結構,物理結構也叫存儲結構,我們討論數據結構的目的是為了在計算機中實
現對它的操作,還要在計算機表示和存儲,數據存儲結構分為:順序存儲結構和鏈式存儲結構,順序存儲結構:是把相鄰
數據存儲在物理上相同存儲單元中,在C#中用數組來實現順序存儲,最常見的是 數組;鏈式存儲,Node+Reference
Domain 在.net 中內存棧區和堆區,棧順序存儲,對應的對象在堆中,則指向了堆中的地址。
算法
算法與數據結構關系非常密切。
算法的特性:1有窮性 2確定性 3輸出和輸出 4能行性
評定標准:1正確性 2可讀性 3健壯性 4運行時間(時間復雜度Time Complexity) 5占用空間(空間復雜度Space Complexity)
影響性能因素:1.硬件條件 2.實現計算機的語言(語言越高級 效率越低) 3編程語言的編譯器和解釋器 4 操作系統
算法的時間復雜度
算法是由控制結構和原操作構成的,其執行的時間取決於二者的綜合效果。為了便於比較同一問題的不同算法,通常把算法中基本操作
重復執行的次數(頻度)作為算法的時間復雜度。T(n)=0(f(n)),如果一個算法沒有循環語句,那麼算法中的節本操作的執行頻率與問題
無關,記做0(1),也成為常數階,如果算法只有一重循環納悶算法執行頻率與問題規模N呈線性增大關系,記做 0(n),也叫線性階
常用的還有平方階乘0(n*n) 立方階0(n*n*n)等等
例 1:x=n;
y=0;
while(y<x)
{
y=y+1; // T(n) 時間復雜度
}
這是一個一重循環,循環次數為N 時間復雜度為線性:記做T(n)=0(0)
例 2:for(i=1;i<n;i++)
{
for(j=0;j<n;j++)
{
A[i][j]=i*j; //T(n) 時間復雜度
}
}
雙重循環 外層循環的循環次數是 N 內層for循環次數為 N 時間復雜度 T(n)=0(n*n);
例3 : x=n;
y=0;
while(x>=(y+1)*(y+1))
{
y=y+1; //T(n) 時間復雜度
}
一重循環 while 的循環次數為 根號 N 所以時間復雜度 T(n)=0(根號N)
例4 :for(i=0;i<m;i++)
{
for(j=0;j<t;j++)
{
for(k=0;k<n;k++)
{
c[i][j]=c[i][j]+a[i][k]*b[k][j];//T(n) 時間復雜度 被執行次數
}
}
}
三重循環:時間復雜度 T(n)=0(m*t*j);
數學基本概念
想到算法就不得不想到數學,集合表示法:窮舉法S={0,5,8,9} 描述法:S={x|x是偶數,且0<X<10};
集合的特點:確定性,互異性,無序性
1000個不同編碼需要多少位?⌈log21000⌉=10 位
10 位可以表示多少個不同的編碼? 10 位可以產生 1024 個不同的可用編碼
經典的例子:折半算法 打個不靠譜的比喻啊 網線壞了 不知道那個地方壞了 網線為100米(最大了)要查多
少次,才能找到故障點,使用折半算法(也叫二分查找法)log2 100 次
指數和對數是基本概念也是相互轉化的過程。
C# 知識點:接口 Icomparable,IEnumerable,IEnumberator,ICollection,IDictionary,IList
,裝箱拆箱,泛型
未完待續……