⑴ 什麼是數據結構
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率的演算法。數據結構往往同高效的檢索演算法和索引技術有關。
數據結構在計算機科學界至今沒有標準的定義。個人根據各自的理解而有不同的表述方法:
Sartaj Sahni 在他的《數據結構、演算法與應用》一書中稱:「數據結構是數據對象,以及存在於該對象的實例和組成實例的數據元素之間的各種聯系。這些聯系可以通過定義相關的函數來給出。」他將數據對象(data object)定義為「一個數據對象是實例或值的集合」。
Clifford A.Shaffer 在《數據結構與演算法分析》一書中的定義是:「數據結構是 ADT(抽象數據類型 Abstract Data Type) 的物理實現。」
Lobert L.Kruse 在《數據結構與程序設計》一書中,將一個數據結構的設計過程分成抽象層、數據結構層和實現層。其中,抽象層是指抽象數據類型層,它討論數據的邏輯結構及其運算,數據結構層和實現層討論一個數據結構的表示和在計算機內的存儲細節以及運算的實現。
一般認為,一個數據結構是由數據元素依據某種邏輯聯系組織起來的。對數據元素間邏輯關系的描述稱為數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;此外討論一個數據結構必須同時討論在該類數據上執行的運算才有意義。
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。許多時候,確定了數據結構後,演算法就容易得到了。有些時候事情也會反過來,我們根據特定演算法來選擇數據結構與之適應。不論哪種情況,選擇合適的數據結構都是非常重要的。
選擇了數據結構,演算法也隨之確定,是數據而不是演算法是系統構造的關鍵因素。這種洞見導致了許多種軟體設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。
在計算機科學中,數據結構是一門研究非數值計算的程序設計問題中計算機的操作對象(數據元素)以及它們之間的關系和運算等的學科,而且確保經過這些運算後所得到的新結構仍然是原來的結構類型。
⑵ 求數據結構的分析方法
理解數據結構先把一個結構獨立出來
數據結構裡面的指針通常都是指向一個struct,而這個結構內部包含有子struct的指針欄位(一對多關系),下一個struct的指針欄位(一對一關系)。具體數量上看是不是數組吧。
按照這個方法,就能把結構理清。
循環都是要通過遍歷才得出結論,有向圖要用一個visted[]數組標識已經訪問過的結點,如果下一個訪問的節點已經是被訪問過了,證明有循環。
⑶ 請問怎麼學好數據結構與演算法分析
數據結構,內容包括數數組、鏈表、堆棧、隊列等。計算機就是對大量數據的處理。可見數據結構的重要性。
演算法也是有很多種的,比如遞歸、窮舉等。是把一個問題抽象,最終形成演算法。
遞歸高中書本上就有的,不說了。
舉個窮舉例子吧,現在要破譯計算機的密碼,這就是一種對鍵盤上數字及字母的窮舉(破譯密碼的一種方法),窮舉出所有的可能與之匹配,直之成功。
很有意思的窮舉可以找找「韓信點兵」看看。
⑷ 大家數據結構都是怎樣復習的
一、數據結構的章節結構及重點構成
數據結構學科的章節劃分基本上為:概論,線性表,棧和隊列,串,多維數組和廣義表,樹和二叉樹,圖,查找,內排,外排,文件,動態存儲分配。
對於絕大多數的學校而言,「外排,文件,動態存儲分配」三章基本上是不考的,在大多數高校的計算機本科教學過程中,這三章也是基本上不作講授的。所以,大家在這三章上可以不必花費過多的精力,只要知道基本的概念即可。
按照以上我們給出的章節以及對後三章的介紹,數據結構的章節比重大致為:(考研內容分析)
概論:內容很少,概念簡單,分數大多隻有幾分,有的學校甚至不考。
線性表:基礎章節,必考內容之一。考題多數為基本概念題,名校考題中,鮮有大型演算法設計題。如果有,也是與其它章節內容相結合。
棧和隊列:基礎章節,容易出基本概念題,必考內容之一。而棧常與其它章節配合考查,也常與遞歸等概念相聯系進行考查。
串:基礎章節,概念較為簡單。專門針對於此章的大型演算法設計題很少,較常見的是根據KMP進行演算法分析。
多維數組及廣義表:基礎章節,基於數組的演算法題也是常見的,分數比例波動較大,是出題的「可選單元」或「侯補單元」。一般如果要出題,多數不會作為大題出。數組常與「查找,排序」等章節結合來作為大題考查。
樹和二叉樹:重點難點章節,各校必考章節。各校在此章出題的不同之處在於,是否在本章中出一到兩道大的演算法設計題。通過對多所學校的試卷分析,絕大多數學校在本章都曾有過出大型演算法設計題的歷史。
圖:重點難點章節,名校尤愛考。如果作為重點來考,則多出現於分析與設計題型當中,可與樹一章共同構成演算法設計大題的題型設計。
查找:重點難點章節,概念較多,聯系較為緊密,容易混淆。出題時可以作為分析型題目給出,在基本概念型題目中也較為常見。演算法設計型題中可以數組結合來考查,也可以與樹一章結合來考查。
排序:與查找一章類似,本章同屬於重點難點章節,且概念更多,聯系更為緊密,概念之間更容易混淆。在基本概念的考查中,尤愛考各種排序演算法的優劣比較此類的題。演算法設計大題中,如果作為出題,那麼常與數組結合來考查。
⑸ 數據結構與演算法分析是一門怎樣的課程
內容包括表、棧、隊列、樹、散列表、優先隊列、排序、不相交集演算法、圖論演算法、演算法分析、演算法設計、攤還分析、查找樹演算法、k-d樹和配對堆等。
⑹ 如何學好數據結構
(轉)
前面的話:輕舟曾經熱衷於把自己復習時候遇到的問題和總結的經驗分享給大家,不過
來了交大以後,發現這里卧虎藏龍,自己只不過是溪底小蝦一個。於是放棄了以前出數
據結構筆記的打算,不過,最近又有許多同學問起我數據結構的事情,這里就把以前總
結的筆記的前言帖出來,但絕對不會有後續部分,希望大家見諒。
學習數據結構這門課程至少要經歷三個過程,方可真正
的掌握這門課程,得到一個滿意的成績。這個過程簡單來說就是三個字:活→死→活。
首先,是一個學「活」的過程,就要要求我們對書中的每一個演算法,能夠在腦海中
建立起相應的模型,而不是死板的演算法。比如樹的遍歷非遞歸演算法,在入棧與出棧的過程
中,我們就要在腦海中形成訪問樹每個結點的過程,真正掌握住這個演算法。這樣,全書復
習下來,你的腦海中就有了整個數據結構的模型概念,對任何一個陌生的演算法,將不感到
生疏和害怕。
有些同學到了此處就覺得數據結構已經學好,可以萬事大吉了,其實這還遠遠不夠
,如果參加考試,往往會拿不到高分,甚至還會納悶,為何自己數據結構學的這樣好,成
績卻不盡如人意,因此產生了批卷老師判錯的想法。所以第二個過程,就是一個學「死」
的過程,這個過程要求,要記住書中的演算法(功利一點就是要背誦會所報考學校的考試要
求的演算法)。有的學校有別的特殊要求,也一並背會。如上海交通大學喜歡考平均復雜度
的分析這樣的題目,我們在書上可以找到這樣的分析一共十一個,全部背會,就免去了在
考場上分析的麻煩,如果連答案都能記住,那麼,也不會因為粗心失分了。這一過程也許
有些枯燥,但卻是最重要的過程,比如說背會了樹的後序遍歷非遞歸,遇到了像求某個結
點的所有祖先,兩個結點的共同祖先這樣的題,不用想,直接套用。這樣才是考試的高分
的關鍵:在考場上,遇到考題,不用思考,直接從腦海中找匹配的演算法,直接引用。
有了第二個過程的辛苦,我們就可以得到一個比較高的分數了,如果還想提高,就
要進行第三個過程,再學「活」的過程。這一個過程中就要要求我們,在第二步的基礎上
,多進行思考,看看有哪些演算法有共性,比如說:樹的前序非遞歸遍歷演算法和圖的深度優
先遍歷演算法是不是類似啊,有些什麼不同,有些什麼相同,為什麼會相同;森林轉化為二
叉樹和圖的生成樹的演算法也是這樣,等等。總結出這種共性,這樣就能正確有效的記憶算
法,同時,遇到難題不至於慌亂,能夠從容下手解題。
對於總結共性問題上,這里舉一小個例子,(呵呵,我當初總結出這個,並且和ka
oyan.com斑竹一具討論確定後三天,就在2002年交大第一題考出類似東東)比如樹的遍
歷,不管是遞歸還是非遞歸
,也不管是線索樹,還是頭結點有父母信息的樹,它的遍歷其實就是一個尋找到遍歷的第
一個結點,然後再尋找它的後繼結點的過程,我們歸納到此處,就可以試著總結一下三種
遍歷的後繼結點是哪個,有幾種情況:
對於前序遍歷,它的後繼如下:
(1)若有左孩子,則後繼是左孩子;
(2)若無左孩子,有右孩子,則後繼是右孩子;
(3)若既無左孩子,又無右孩子,則是一片葉子;再討論:
(a)若是其父母的左孩子,且父母有右孩子,則後繼是父母的右孩子。
(b)若是其父母的左孩子,且父母無右孩子;
(c)若是其父母的右孩子。
b,c都表示這是某個節點的左子樹前序遍歷的最後一個節點,則需要找第一個有右子
樹的「左祖先」(定義「左祖先」,即找第一個使得當前節點在這個祖先的左子樹上),
然後後繼就是這個祖先的右孩子。
對於中序遍歷,它的後繼如下:
(1)如有右孩子,後繼是右孩子的最左下節點;
(2)若無右孩子,且是父母的左孩子,則後繼就是父母;
(3)若無右孩子,且是父母的右孩子,則一直上溯到第一個「左祖先」(定義如前)
則後繼就是這個祖先。若無這樣的祖先,說明已經遍歷完畢。
對於後序遍歷,它的後繼如下:
(1)若是父母的右孩子,則後繼是父母;
(2)若是父母的左孩子,且父母無右子樹,則後繼是父母;
(3)若是父母的左孩子,父母有右子樹,則後繼是父母右子樹的最先訪問到的節點(
指向父母的右子樹後,一直往左,若不行的話,往右一步,一直到葉子)
總結完了,想一想,我們還能得到哪些提示?經常有一類型題目,要求求某個結點
的直接前驅。其實求前序遍歷的前驅和求後序遍歷的後繼是一樣的,只不過把左換成右而
已,前序遍歷的求後繼和後序遍歷的求前驅、中序遍歷的求前驅和中序遍歷求後繼都有這
樣的對稱關系。因此,總結出共性的東西,許多題目就可以迎刃而解了。問一問讀到這里
的讀者,你現在能夠自己在腦子裡面,非常輕松地像上面那樣,把這個例子裡面的情況都
條理清楚地分析總結出來嗎?如果現在還不行,到考試之前,你必須掌握到這種程度,才
能得到一個自己很滿意的分數。
經過以上的三個過程復習,相信讀者對數據結構的掌握就可以到達比較高的水平了
,如果參加考試,獲得一個比較滿意的成績也很有希望了。當然,達到這一
步並不容易,大量的練習是真正掌握的必由之路。因此,我們建議大家能夠下功夫把本書
中的題目完整地做一遍。能夠真正把本書中的所有題都掌握,絕不僅僅意味著僅會了書中
這幾百道題目,而是意味著對數據結構這門課程的理解,以及對問題的分析能力都有很大
的提高,這樣在考場上即使遇到未曾見過的題目,也就可以從容應對了!
⑺ 如何學習數據結構
學好數據結構首先學好C語言指針,數據機構內在串聯全靠指針作用,指針主要難在本身是帶地址的變數,再加上指針的指針串聯導致很多人誤解,先要學會理解,要對計算機的內存結構有個大概了解,對一些常見的進制之間的轉化以及位元組對齊等有行程基本的認知。
理解概念,建立抽象模型,比如簡單的隊列,先進先出模式,在設計數據模型的時候,就需要有一個對頭和隊尾的概念,數據需要從隊尾插入隊頭出來,基本上三個屬性就出來了,一個對頭指針,一個隊尾指針,一個結構體數值,常見的方法有刪除清空隊列,有插入隊列操作,出隊操作,創建初始隊列操作等等,這樣子抽象數據模型,形成自己的思維理解,然後再進行代碼設計。
需要變通實踐,代碼調試變通,數據結構的組合無窮變著寫代碼。演算法的奧妙就是在於變換,放在數據結構也是這個樣子,掌握基本的數據機構演算法,在學好數據結構的前提下可以學習下一本經典的演算法書《演算法導論》這個是演算法的經典書籍。
學習數據機構不要想著有什麼技巧或者方法,把自己調整到最佳的學習狀態,方法自然就有了,不要給自己設置什麼限制,設置底線只會讓自己處在一個圍牆之內,學習新東西就是突破自我的一個過程,不要在開始學習的時候給自己過大的壓力。
⑻ 數據結構該怎麼學啊
如果你決定考研的話,建議把C學好。如果你打算工作,可以學學C#。
不知道你為什麼一開始就選擇了C#。還是慢慢來吧。好運!
⑼ 一道數據結構題,請問怎樣分析各種排序的空間復雜度求較為詳細的解釋,謝謝
題目呢?
排序演算法的時間空間復雜度都是有定論的,基本上不用特別分析了,只要知道是哪個演算法就有結論了,
基於比較的排序演算法時間復雜度最快都是O(nlogn)
⑽ 數據結構與演算法分析
數據結構與演算法分析(C++版第2版)/國外計算機科學教材系列
作者:著者:美Shaffer,C.A;譯者:張銘等譯 出版社:電子工業出版社