回覆列表
  • 1 # jkhkjhkj

    總起先放結論,根據實際問題去設計資料結構,在資料結構基礎上進行演算法設計。即,資料結構特點決定了演算法的設計。舉一些簡單的例子,如果資料結構是鏈式儲存的二叉樹,那麼就可以在其上面使用深度優先搜尋以及廣度優先搜尋。如果是圖資料結構,需要根據圖的特點來設計算法,在深度優先遍歷或廣度優先遍歷的時候就需要考慮記錄訪問過的結點。資料結構資料結構很重要。一些大師在進行程式設計之前在資料結構上花費的時間是最多的。只有將資料結構設計好了,才能在此基礎上使用演算法。接下來,介紹一下陣列,連結串列,樹,圖,佇列,棧相關的內容以及它們之間存在的一些關係。陣列這種資料結構有其隨機訪問的特點,靠下標就能訪問。這種訪問方式十分高效。連結串列雖然不能利用下標訪問,但對於記憶體的使用很具有靈活性,所以這個優點讓它應用也十分廣泛。因為在實際程式我們不能總是確定記憶體中有合適的空間。連結串列最大的作用感覺也在於此,其更適用於非隨機訪問的情況。但是顯然連結串列這種結構存在查詢效率低的特點,這種問題應該如何解決呢?有沒有一種辦法既可以靈活分配記憶體,同時又能提高查詢效率呢?(查詢這個動作,往往是程式必不可少的一部分,幾乎所有的程式都會涉及到查詢這個動作,所以其效率便十分重要了)先說一下總的方法,有序是查詢得以最佳化的重要原因。先來說說樹,樹的組織一般也是鏈式儲存的,好處就在於原來n個條目的資料儲存在連結串列中,當我們進行查詢時,查詢第3個就必須經過第2個。查詢第n個,就必須得經過前n-1個結點。那麼問題來了,難道結點n前面的那些結點都需要經過嗎?顯然不是,這也說明了連結串列的侷限性。相對而言,樹的組織方式使我們在遍歷時可以進行選擇,比如說,二叉樹中我們需要選定一個分支,相對而言,連結串列中我們沒得選擇。選擇的出現帶來了一定的最佳化。比如二叉排序樹,堆等。這些樹的構建,都是根據我們的目的來進行構建的。棧,佇列,則是由現實世界借鑑而來的。首先,現實世界中,佇列棧這些形式普遍存在於現實生活中,而程式從某種角度是服務於現實生活中,所以就抽象出了計算機中的所謂棧,佇列的概念。思想體現在程式的執行過程中,體現在程式開發設計中。事實上,棧,佇列的思想不僅體現在了軟體層面,計算機硬體層面也是很多地方應用了這中思想,比如指令佇列(指令執行的先後順序決定了佇列適用於它),比如說暫存器棧(計算的次序決定了可以用棧來實現)。另外,函式呼叫機制也是棧的應用,a呼叫b,b呼叫c,這個過程在我們看來比較簡單,但是在計算機中,在呼叫時則需要儲存一系列資訊,呼叫的過程以及返回的過程(c只能返回到b,不能直接返回到c)這個過程適合透過棧這種結構來進行模擬。演算法設計了好的資料結構,只是成功了一半,因為資料結構是靜態的,只是組織資料的一種方式,你不去操作它(如訪問),它是無法發揮它的作用的。所以,我們需要在此基礎上去根據我們的目的進行相應的操作,而操作的方式不同,耗費的時間也是不一樣的,我們需要找到好的操作方案。這裡所說的方案,就是演算法。舉一個簡單的例子,你打算從家到學校,有多個公交可以坐,可以產生很多方案,每一種方案都是你對於達成目標的一種設計,我們稱之為演算法。人們往往會在眾多方案中尋找最優的演算法。我們這裡的方案的數量是有限的,但是事實上,很多問題的方案是無限的,甚至巨大的,我們無法一一去嘗試這些方案。所以我們總結了一些優秀演算法的準則,思想,比如說貪心演算法,動態規劃等思想。演算法為何依賴於資料結構呢?為回答這個問題,舉一個通俗的例子。你在學校撿到了一張飯卡,上面有姓名,學院,班級。然後你要去將飯卡還給失主。接下來,你會找到其學院,然後找到班級,然後在班級中透過詢問同學找到失主。(姓名,學院,班級)在這裡我們認為是資料結構,因其把這些資料組織到一張卡上了。接下來,想象另一種情形,假如說飯卡上只有姓名,而學院,班級在另一張資訊卡上。那麼你可能找遍全校也找不到失主。將一些資料組織在一起,能夠為演算法提供必要的基礎資訊,關聯資訊,使得演算法在執行過程中能夠快速找到相關資訊(比如,上面例子中的學院,班級)。

  • 中秋節和大豐收的關聯?
  • 二年級上冊先的組詞?