⑴ 數據結構是什麼,有什麼用處
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率的演算法。數據結構往往同高效的檢索演算法和索引技術有關。
數據結構在計算機科學界至今沒有標準的定義。個人根據各自的理解而有不同的表述方法:
Sartaj Sahni 在他的《數據結構、演算法與應用》一書中稱:「數據結構是數據對象,以及存在於該對象的實例和組成實例的數據元素之間的各種聯系。這些聯系可以通過定義相關的函數來給出。」他將數據對象(data object)定義為「一個數據對象是實例或值的集合」。
Clifford A.Shaffer 在《
數據結構與演算法
分析》一書中的定義是:「數據結構是 ADT(抽象數據類型 Abstract Data Type) 的物理實現。」
Lobert L.Kruse 在《
數據結構與程序設計
》一書中,將一個數據結構的設計過程分成抽象層、數據結構層和實現層。其中,抽象層是指抽象數據類型層,它討論數據的邏輯結構及其運算,數據結構層和實現層討論一個數據結構的表示和在計算機內的存儲細節以及運算的實現。
一般認為,一個數據結構是由數據元素依據某種邏輯聯系組織起來的。
對數據元素間邏輯關系的描述稱為數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;此外討論一個數據結構必須同時討論在該類數據上執行的運算才有意義。
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。許多時候,確定了數據結構後,演算法就容易得到了。有些時候事情也會反過來,我們根據特定演算法來選擇數據結構與之適應。不論哪種情況,選擇合適的數據結構都是非常重要的。
選擇了數據結構,演算法也隨之確定,是數據而不是演算法是系統構造的關鍵因素。這種洞見導致了許多種軟體設計方法和程序設計語言
的出現,面向對象的程序設計語言就是其中之一。
在計算機科學中,數據結構是一門研究非數值計算的程序設計問題中計算機的操作對象(數據元素)以及它們之間的關系和運算等的學科,而且確保經過這些運算後所得到的新結構仍然是原來的結構類型。
⑵ 數據結構和演算法有什麼關系數據結構就是演算法嗎
首先你要弄清楚數據結構是什麼?數據結構呢其實就是一種存儲數據之間的邏輯結構:比如我們學過的線性結構:順序表啦,鏈表啦;層次結構:樹啦。合適的數據結構可以帶來更高的運行效率和存儲效率,與相應解決實際問題演算法的適應性也就越高,這也就是為什麼一些演算法指定了數據存儲必須以某種特定的數據結才行。一般都是根據合適的數據結構來設計演算法,而不是根據演算法來設計數據結構。
演算法和數據結構往往是互不分開的。離開了演算法,數據結構就顯得毫無意義,而沒有了數據結構演算法就沒有實現的條件。良好的數據結構思想就是一種高效的演算法,但是數據結構不等於演算法。只有當數據結構用於處理某個特定問題類型的時候,數據結構才會體現為演算法。要想細致的了解,就要多看書,因為這東西畢竟發展了那麼多年,一兩句話是說不清楚的。想知道更多的數據結構與演算法知識嗎?可以去了解一下小碼哥李明傑。
⑶ 數據結構和演算法為什麼這么重要
指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。
也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。
如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。
⑷ 數據結構與演算法在計算機領域或行業之中到底占據著什麼樣的重要地位
演算法是程序的靈魂,架構是靈魂的軀體,最近對這兩句話感觸很深,但很多程序員甚至忽略演算法存在,更不要說是架構層面的東西,有些程序員甚至有些疑問,做編程也有幾年了碰到關於演算法的東西實在是很少。
在學習演算法之前首先要掌握數據結構,因為數據結構裡面很多基礎,像隊列,棧,鏈表,二叉樹這些都是演算法基礎,因為再復雜的演算法也是基礎的東西組合起來的,復雜的演算法涉及到數學知識了,所以專業的演算法工程師需要具備良好的數學底子。但數據結構更多是用在功能模塊裡面編程模型的設計上,有些程序員在設計模塊功能的時候。
⑸ 數據結構的起源作用和意義
「數據結構」作為一門獨立的課程在國外是從1968年才開始設立的。 1968年美國唐納德·克努特(Donald Ervin Knuth)教授開創了數據結構的最初體系,所著的《計算機程序設計藝術》第一卷《基本演算法》是第一本較系統地闡述數據的邏輯結構和存儲結構及其操作的著作。
「數據結構」在計算機科學中是一門綜合性的專業基礎課,數據結構是介於數學、計算機硬體和計算機軟體三者之間的一門核心課程。數據結構這一門課的內容不僅是一般程序設計(特別是非數值性程序設計)的基礎,而且是設計和實現編譯程序、操作系統、資料庫系統及其他系統程序的重要基礎。
一般認為,一個數據結構是由數據元素依據某種邏輯聯系組織起來的。對數據元素間邏輯關系的描述稱為數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;
此外討論一個數據結構必須同時討論在該類數據上執行的運算才有意義。一個邏輯數據結構可以有多種存儲結構,且各種存儲結構影響數據處理的效率。
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。許多時候,確定了數據結構後,演算法就容易得到了。
有些時候事情也會反過來,我們根據特定演算法來選擇數據結構與之適應。不論哪種情況,選擇合適的數據結構都是非常重要的。
選擇了數據結構,演算法也隨之確定,是數據而不是演算法是系統構造的關鍵因素。這種洞見導致了許多種軟體設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。
(5)數據結構演算法的意義擴展閱讀
數據指對客觀事件進行記錄並可以鑒別的符號,是對客觀事物的性質、狀態以及相互關系等進行記載的物理符號或這些物理符號的組合。它是可識別的、抽象的符號。
它不僅指狹義上的數字,還可以是具有一定意義的文字、字母、數字元號的組合、圖形、圖像、視頻、音頻等,也是客觀事物的屬性、數量、位置及其相互關系的抽象表示。例如,「0、1、2...`」、「陰、雨、下降、氣溫」「學生的檔案記錄、貨物的運輸情況」等都是數據。數據經過加工後就成為信息。
在計算機科學中,數據是指所有能輸入到計算機並被計算機程序處理的符號的介質的總稱,是用於輸入電子計算機進行處理,具有一定意義的數字、字母、符號和模擬量等的通稱。現在計算機存儲和處理的對象十分廣泛,表示這些對象的數據也隨之變得越來越復雜。
⑹ 學習演算法和數據結構有什麼用
本人乃一個數據痴迷者,在計算機的道路上,也是一個數據結構的痴迷者,現在大學裡面和同學搞開發也痴迷於資料庫,我就我個人的理解給你談一談: 首先,數據結構是一門計算機語言學的基礎學科,它不屬於任何一門語言,其體現的是幾乎所有標准語言的演算法的思想。 上面的概念有一些模糊,我們現在來具體說一說,相信你門的數據結構使用的是一門具體的語言比如C/C++語言來說明,那是為了輔助的學習數據結構,而數據結構本身不屬於任何語言(相信你把書上的程序敲到電腦裡面是不能通過的吧,其只是描述了過程,要調試程序,還需要修改和增加一些東西)。你們的書上開始應該在講究數據的物理存儲結構/邏輯存儲結構等概念,說明數據結構首先就是「數據的結構」,在內存上的存儲方式,就是物理的存儲結構,在程序使用人員的思想上它是邏輯的,比如: 你們在C/C++中學習到鏈表,那麼鏈表是什麼一個概念,你們使用指針制向下一個結點的首地址,讓他們串聯起來,形成一個接一個的結點,就像顯示生活中的火車一樣。而這只是對於程序員的概念,但是在內存中存儲的方式是怎樣的那?對於你程序員來說這是「透明」的,其內部分配空間在那裡,都是隨機的,而內存中也沒有一個又一根的線將他們串聯起來,所以,這是一個物理與邏輯的概念,對於我們程序員只需要知道這些就可以了,而我們主要要研究的是「邏輯結構」。 我可以給你一個我自己總結的一個概念:所有的演算法必須基於數據結構生存。也就是說,我們對於任何演算法的編寫,必須依賴一個已經存在的數據結構來對它進行操作,數據結構成為演算法的操作對象,這也是為什麼演算法和數據結構兩門分類不分家的概念,演算法在沒有數據結構的情況下,沒有任何存在的意義;而數據結構沒有演算法就等於是一個屍體而沒有靈魂。估計這個對於演算法的初學者可能有點暈,我們在具體的說一些東西吧: 我們在數據結構中最簡單的是什麼:我個人把書籍中線性表更加細化一層(這里是為了便於理解在這樣說的):單個元素,比如:int i;這個i就是一個數據結構,它是一個什麼樣的數據結構,就是一個類型為int的變數,我們可以對它進行加法/減法/乘法/除法/自加等等一系列操作,當然對於單個元素我們對它的數據結構和演算法的研究沒有什麼意義,因為它本來就是原子的,某些具體運算上可能演算法存在比較小的差異;而提升一個層次:就是我們的線性表(一般包含有:順序表/鏈表)那麼我們研究這樣兩種數據結構主要就是要研究它的什麼東西那?一般我們主要研究他們以結構為單位(就是結點)的增加/刪除/修改/檢索(查詢)四個操作(為什麼有這樣的操作,我在下面說到),我們一般把「增加/刪除/修改」都把它稱為更新,對於一個結點,若要進行更新一類的操作比如:刪除,對於順序表來說是使用下標訪問方式,那麼我們在刪除了一個元素後需要將這個元素後的所有元素後的所有元素全部向前移動,這個時間是對於越長的順序表,時間越長的,而對於鏈表,沒有順序的概念,其刪除元素只需要將前一個結點的指針指向被刪除點的下一個結點,將空間使用free()函數進行釋放,還原給操作系統。當執行檢索操作的時候,由於順序表直接使用下標進行隨機訪問,而鏈表需要從頭開始訪問一一匹配才可以得到使用的元素,這個時間也是和鏈表的結點個數成正比的。所以我們每一種數據結構對於不同的演算法會產生不同的效果,各自沒有絕對的好,也沒有絕對的不好,他們都有自己的應用價值和方式;這樣我們就可以在實際的項目開發中,對於內部的演算法時間和空間以及項目所能提供的硬體能力進行綜合評估,以讓自己的演算法能夠更加好。 (在這里只提到了基於數據結構的一個方面就是:速度,其實演算法的要素還應該包括:穩定性、健壯性、正確性、有窮性、可理解性、有輸入和輸出等等) 為什麼要以結點方式進行這些亂七八糟的操作那?首先明確一個概念就是:對於過程化程序設計語言所提供的都是一些基礎第一信息,比如一些關鍵字/保留字/運算符/分界符。而我們需要用程序解決現實生活中的問題,比如我們要程序記錄某公司人員的情況變化,那麼人員這個數據類型,在程序設計語言中是沒有的,那麼我們需要對人員的內部信息定義(不可能完全,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務/工資狀態等,那麼就可以用一些C/C++語言描述了,如年齡我們就可以進行如下定義: int age;/*age變數,表示人員公司人員的年齡*/ 同理進行其他的定義,我們用結構體或類把他們封裝成自定義數據類型或類的形式,這樣用他們定義的就是一個人的對象的了,它內部包含了很多的模板數據了。 我就我個人的經歷估計的代碼量應該10000以內的(我個人的經理:只是建議,從你的第一行代碼開始算,不論程序正確與否,不論那一門語言,作為一個標准程序員需要十萬行的代碼的功底(這個是我在大學二年級感覺有一定時候的大致數據,不一定適合其他人),而十萬行代碼功底一般需要四門基礎遠支撐,若老師沒有教,可以自學一些語言)。
⑺ 學數據結構的意義
數據結構是計算機科學與技術專業、計算機信息管理與應用專業,電子商務等專業的基礎課,是十分重要的核心課程。所有的計算機系統軟體和應用軟體都要用到各種類型的數據結構。因此,要想更好地運用計算機來解決實際問題,僅掌握幾種計算機程序設計語言是難以應付當前眾多復雜的課題。要想有效地使用計算機、充分發揮計算機的性能,還必須學習和掌握好數據結構的有關知識。打好「數據結構」這門課程的扎實基礎,對於學習計算機專業的其他課程,如操作系統、資料庫管理系統、軟體工程、編譯原理、人工智慧、圖視學等都是十分有益的。
⑻ 數據結構和演算法為什麼這么重要
演算法都是從生活里得到的,生活里用的很自如,應用到程序里一樣會很方便。
比如最簡單的,中國有那麼多省,每個省有那麼多市,每個市有那麼多區縣之類的,看到一個小地方,怎麼才能知道它在哪,很明顯,去看它在哪個區,哪個市,哪個省。
這就是樹的作用,從子節點通過父節點去確定它的位置。這個同樣應用在文件管理,還有特殊的比如要求設計個資料庫,能夠體現部門,小組的包含關系,很簡單,在小組裡面加個父節點的欄位就可以了。
再比如查字典,給了一個字,怎麼才能查到它?通過讀音,知道它的首字母,就很容易的去從首字母找到它。如果字典是亂的,就完全無從下手,這就是hash演算法的東西,通過能夠區分出來的特徵,縮小查找范圍,加快查找效率。
同樣的很多,都是可以用到程序里的,很容易理解