數據結構和算法本質的思考


  最近在學習數據結構和算法,作為一個非科班生,真的挺難的。但是為什么要學習?這里就是所謂“道”和“術”的問題了。做了快3年Android開發,實現一個業務,完全不需要你了解數據結構和算法,但是Android更新換代如此之快,其本質只是“術”的不斷豐富,幫助開發人員能夠快速高效寫APP。我覺得一味追求這種新的“術”,不如反過來逐“道”,而數據結構和算法即是“道”。

  數據結構為了解決什么問題?

    一個共識:所有計算機程序的最終目的是對數據進行“CRUD”,而CRUD需要通過“查找”“刪除”和“插入”3個操作來完成。

    一個本質:世界紛繁復雜,如何將世界中的各種數據存儲在內存中,並且方便“查找”“刪除”和“插入”,就是數據結構的本質。

  計算機內存是什么?

    計算機存儲的最小單位是一個字節(8個bit),而計算機內存就是一個連續的字節數組。

  怎么在連續的字節數組里存儲數據---兩個存儲方案?

    一個最直觀的方案,就是連續存儲,這就引出了一個數據結構---數組

    數組特點:數組的存儲對內存要求嚴格,需要連續的內存空間來存儲,這樣就很容易造成內存的碎片化。雖然數組對於“查找”而言,時間復雜度為O(1),但對於“刪除”和“插入”並不友好,時間復雜度為O(n)。

    數組有其劣勢,比如不能利用碎片內存,不能夠快速的實現“插入”“刪除”,從而引出不連續存儲方案----鏈表

    鏈表特點:鏈表中每個元素,包含本身的值和下一個元素的地址。這樣可以通過不連續存儲放置數據。對於“刪除”和“插入”都是O(1)的操作,但是犧牲了“查找”的性能。同時指針還會占用一部分空間,內存消耗相對大了一點

    到這里,可以毫不誇張的說,計算機數據存儲就這兩種方案。

  兩種存儲方案,怎么存儲現實世界中的所有數據?

    現實世界中的數據關系大致可簡化為三大類:線性結構,樹結構和圖結構

    第一步,做數據抽象,留下數據的兩個屬性:數據的值和數據之間的關系,形成一個數據結構圖

    第二步,將這個結構圖,映射到物理內存中。類似二叉樹,可以選用鏈表或者數組存儲。

    所以我們可以說,任何一種數據結構一定是從數組或者鏈表擴展而來的。

  單鏈表的進化?(舉例說明不同數據結構是如何發展而來的)

    任何一種數據結構的產生,一定是其對“插入”“查找”“刪除”的特殊要求做的改進。

    鏈表從結構上看,每個元素都保存了一個值和下一個元素的地址;支持操作,初始化,獲取長度,插入,刪除和查找,逆序等

    如果為了方便的查找一個元素的上一個元素,引入了雙向鏈表。

    如果為了能夠首尾相接的遍歷鏈表,引入了循環鏈表。
    如果為了滿足先進后出,可以將鏈表改造為堆棧
    如果為了滿足先進先出,可以將鏈表改造為隊列

    隨着需求的增加,我們可以從一個鏈表演化出不同的數據結構,但是其本質都是一個鏈表。

    這就是真正的道。

  算法本質是什么?
    算法是基於某種數據結構,快速高效的實現數據操作的方法。也就說,數據結構是算法的前提,解決一個問題必須先使用恰當的數據結構來對問題進行轉化,再在此基礎上,使用算法進行求解,才能夠事半功倍。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM