數據結構學的到底是什麽,和算法的關系
本人乃壹個數據癡迷者,在計算機的道路上,也是壹個數據結構的癡迷者,現在大學裏面和同學搞開發也癡迷於數據庫,我就我個人的理解給妳談壹談:首先,數據結構是壹門計算機語言學的基礎學科,它不屬於任何壹門語言,其體現的是幾乎所有標準語言的算法的思想。上面的概念有壹些模糊,我們現在來具體說壹說,相信妳門的數據結構使用的是壹門具體的語言比如C/C++語言來說明,那是為了輔助的學習數據結構,而數據結構本身不屬於任何語言(相信妳把書上的程序敲到電腦裏面是不能通過的吧,其只是描述了過程,要調試程序,還需要修改和增加壹些東西)。妳們的書上開始應該在講究數據的物理存儲結構/邏輯存儲結構等概念,說明數據結構首先就是“數據的結構”,在內存上的存儲方式,就是物理的存儲結構,在程序使用人員的思想上它是邏輯的,比如:妳們在C/C++中學習到鏈表,那麽鏈表是什麽壹個概念,妳們使用指針制向下壹個結點的首地址,讓他們串聯起來,形成壹個接壹個的結點,就像顯示生活中的火車壹樣。而這只是對於程序員的概念,但是在內存中存儲的方式是怎樣的那?對於妳程序員來說這是“透明”的,其內部分配空間在那裏,都是隨機的,而內存中也沒有壹個又壹根的線將他們串聯起來,所以,這是壹個物理與邏輯的概念,對於我們程序員只需要知道這些就可以了,而我們主要要研究的是“邏輯結構”。我可以給妳壹個我自己總結的壹個概念:所有的算法必須基於數據結構生存。也就是說,我們對於任何算法的編寫,必須依賴壹個已經存在的數據結構來對它進行操作,數據結構成為算法的操作對象,這也是為什麽算法和數據結構兩門分類不分家的概念,算法在沒有數據結構的情況下,沒有任何存在的意義;而數據結構沒有算法就等於是壹個屍體而沒有靈魂。估計這個對於算法的初學者可能有點暈,我們在具體的說壹些東西吧:我們在數據結構中最簡單的是什麽:我個人把書籍中線性表更加細化壹層(這裏是為了便於理解在這樣說的):單個元素,比如:int i;這個i就是壹個數據結構,它是壹個什麽樣的數據結構,就是壹個類型為int的變量,我們可以對它進行加法/減法/乘法/除法/自加等等壹系列操作,當然對於單個元素我們對它的數據結構和算法的研究沒有什麽意義,因為它本來就是原子的,某些具體運算上可能算法存在比較小的差異;而提升壹個層次:就是我們的線性表(壹般包含有:順序表/鏈表)那麽我們研究這樣兩種數據結構主要就是要研究它的什麽東西那?壹般我們主要研究他們以結構為單位(就是結點)的增加/刪除/修改/檢索(查詢)四個操作(為什麽有這樣的操作,我在下面說到),我們壹般把“增加/刪除/修改”都把它稱為更新,對於壹個結點,若要進行更新壹類的操作比如:刪除,對於順序表來說是使用下標訪問方式,那麽我們在刪除了壹個元素後需要將這個元素後的所有元素後的所有元素全部向前移動,這個時間是對於越長的順序表,時間越長的,而對於鏈表,沒有順序的概念,其刪除元素只需要將前壹個結點的指針指向被刪除點的下壹個結點,將空間使用free()函數進行釋放,還原給操作系統。當執行檢索操作的時候,由於順序表直接使用下標進行隨機訪問,而鏈表需要從頭開始訪問壹壹匹配才可以得到使用的元素,這個時間也是和鏈表的結點個數成正比的。所以我們每壹種數據結構對於不同的算法會產生不同的效果,各自沒有絕對的好,也沒有絕對的不好,他們都有自己的應用價值和方式;這樣我們就可以在實際的項目開發中,對於內部的算法時間和空間以及項目所能提供的硬件能力進行綜合評估,以讓自己的算法能夠更加好。(在這裏只提到了基於數據結構的壹個方面就是:速度,其實算法的要素還應該包括:穩定性、健壯性、正確性、有窮性、可理解性、有輸入和輸出等等)為什麽要以結點方式進行這些亂七八糟的操作那?首先明確壹個概念就是:對於過程化程序設計語言所提供的都是壹些基礎第壹信息,比如壹些關鍵字/保留字/運算符/分界符。而我們需要用程序解決現實生活中的問題,比如我們要程序記錄某公司人員的情況變化,那麽人員這個數據類型,在程序設計語言中是沒有的,那麽我們需要對人員的內部信息定義(不可能完全,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務/工資狀態等,那麽就可以用壹些C/C++語言描述了,如年齡我們就可以進行如下定義:int age;/*age變量,表示人員公司人員的年齡*/同理進行其他的定義,我們用結構體或類把他們封裝成自定義數據類型或類的形式,這樣用他們定義的就是壹個人的對象的了,它內部包含了很多的模板數據了。我就我個人的經歷估計的代碼量應該10000以內的(我個人的經理:只是建議,從妳的第壹行代碼開始算,不論程序正確與否,不論那壹門語言,作為壹個標準程序員需要十萬行的代碼的功底(這個是我在大學二年級感覺有壹定時候的大致數據,不壹定適合其他人),而十萬行代碼功底壹般需要四門基礎遠支撐,若老師沒有教,可以自學壹些語言)。