01. 數(shù)據(jù)結(jié)構(gòu)與算法緒論

一、數(shù)據(jù)結(jié)構(gòu)

1. 什么是數(shù)據(jù)結(jié)構(gòu)

 數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成

2. 數(shù)據(jù)結(jié)構(gòu)的分類

  傳統(tǒng)上,我們把數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
      
  (1). 邏輯結(jié)構(gòu):是指數(shù)據(jù)對象中數(shù)據(jù)元素之間的相互關(guān)系,也是我們今后最需要關(guān)注和討論的問題。
       1.集合結(jié)構(gòu)
       數(shù)據(jù)結(jié)構(gòu)中的元素之間除了“同屬一個(gè)集合” 的相互關(guān)系外,別無其他關(guān)系;
集合結(jié)構(gòu).jpg
       2.線性結(jié)構(gòu)
       數(shù)據(jù)結(jié)構(gòu)中的元素存在一對一的相互關(guān)系;
線性結(jié)構(gòu).jpg
       3.樹形結(jié)構(gòu)
       數(shù)據(jù)結(jié)構(gòu)中的元素存在一對多的相互關(guān)系;
樹形結(jié)構(gòu).jpg
       4.圖形結(jié)構(gòu)
       數(shù)據(jù)結(jié)構(gòu)中的元素存在多對多的相互關(guān)系。
圖形結(jié)構(gòu).jpg
 (2). 物理結(jié)構(gòu):指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)空間的存放形式。
      1.順序存儲(chǔ)結(jié)構(gòu):是把數(shù)據(jù)元素存放在地址連續(xù)的存儲(chǔ)單元里,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。
順序存儲(chǔ)結(jié)構(gòu).jpg
      2.鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):是把數(shù)據(jù)元素存放在任意的存儲(chǔ)單元里,這組存儲(chǔ)單元可以是連續(xù)的,也可以是不連續(xù)的。
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu).jpg

3. 常用的數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu) 優(yōu)點(diǎn) 缺點(diǎn)
數(shù)組 插入塊,如果知道下標(biāo),可以非常快的存取 刪除和查找慢,大小固定
有序數(shù)組 比無序的數(shù)組查找快 刪除和插入慢,大小固定
提供后進(jìn)先出的取存方法 取存其他項(xiàng)很慢
隊(duì)列 提供先進(jìn)先出的取存方法 取存其他項(xiàng)很慢
鏈表 插入快,刪除快 查找慢
二叉樹 查找,插入,刪除都快(如果樹保持平衡) 刪除算法復(fù)雜
紅-黑樹 查找,是插入,刪除都快。樹總是平衡的 算法復(fù)雜
2-3-4樹 查找,是插入,刪除都快。樹總是平衡的。類似的樹對磁盤存儲(chǔ)有用 算法復(fù)雜
哈希表 如果關(guān)鍵字已知存取幾塊。插入快 刪除慢,如果不知道關(guān)鍵字則存取很慢,對存儲(chǔ)空間使用不充分
插入,刪除快,對最大數(shù)據(jù)項(xiàng)的存取很快 對其他數(shù)據(jù)項(xiàng)存取慢
對現(xiàn)實(shí)世界建模 有些算法慢切復(fù)雜
數(shù)據(jù)結(jié)構(gòu).jpg

4. 數(shù)據(jù)結(jié)構(gòu)的應(yīng)用表現(xiàn)

   1. 對現(xiàn)實(shí)世界數(shù)據(jù)的存儲(chǔ)
   2. 程序員的工具
   3. 對現(xiàn)實(shí)世界進(jìn)行建模

二、算法

1. 什么是算法

      算法(Algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,
  算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。

2. 算法的特征

  一個(gè)算法應(yīng)該具有以下五個(gè)重要的特征:
  
  有窮性(Finiteness)
  算法的有窮性是指算法必須能在執(zhí)行有限個(gè)步驟之后終止;
  
  確切性 (Definiteness)
  算法的每一步驟必須有確切的定義;
  
  輸入項(xiàng) (Input)
  一個(gè)算法有0個(gè)或多個(gè)輸入,以刻畫運(yùn)算對象的初始情況,所謂0個(gè)輸入是指算法本身定出了初始條件;
  
  輸出 (Output)
  一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對輸入數(shù)據(jù)加工后的結(jié)果。沒有輸出的算法是毫無意義的;
  
  可行 (Effectiveness)
  算法中執(zhí)行的任何計(jì)算步驟都是可以被分解為基本的可執(zhí)行的操作步,即每個(gè)計(jì)算步都可以在有限時(shí)間內(nèi)完成(也稱之為有效性)。

3. 算法設(shè)計(jì)的要求

  正確性
  算法的正確性是指算法至少應(yīng)該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
  大體分為以下四個(gè)層次:
  算法程序沒有語法錯(cuò)誤。
  算法程序?qū)τ诤戏ㄝ斎肽軌虍a(chǎn)生滿足要求的輸出。
  算法程序?qū)τ诜欠ㄝ斎肽軌虍a(chǎn)生滿足規(guī)格的說明。
  算法程序?qū)τ诠室獾箅y的測試輸入都有滿足要求的輸出結(jié)果。

  可讀性
  算法設(shè)計(jì)另一目的是為了便于閱讀、理解和交流。
  我么寫代碼的目的,一方面是為了讓計(jì)算機(jī)執(zhí)行,但還有一個(gè)重要的目的是為了便于他人閱讀和自己日后閱讀修改。
     
  健壯性
  當(dāng)輸入數(shù)據(jù)不合法時(shí),算法也能做出相關(guān)處理,而不是產(chǎn)生異常、崩潰或莫名其妙的結(jié)果。
     
  時(shí)間效率高和存儲(chǔ)量低
  生活中,每個(gè)男人都希望找一個(gè)賢惠的老婆,她們溫柔又體貼,美麗又大方,還會(huì)做著一手的好菜。
  好算法就猶如好老婆,應(yīng)該具備時(shí)間效率高和存儲(chǔ)量低的特點(diǎn)。
  所以在設(shè)計(jì)算法的時(shí)候我們應(yīng)該盡量思考這兩方面的問題!

4. 算法的評價(jià)標(biāo)準(zhǔn)

     1. 時(shí)間復(fù)雜度
         就是常用的大O表示法,一般大O表示法是評判算法優(yōu)劣的主要依據(jù)具體的描述可以查閱百度百科
     2. 空間復(fù)雜度
         在當(dāng)前硬件設(shè)備便宜的當(dāng)下,一般都會(huì)犧牲空間復(fù)雜度來換取時(shí)間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容