數(shù)據(jù)結(jié)構(gòu)與算法-數(shù)據(jù)結(jié)構(gòu)

Java工程師知識樹


概念:

數(shù)據(jù)結(jié)構(gòu)是一種存儲和組織數(shù)據(jù)的方法,可以有效地使用它。
數(shù)據(jù)結(jié)構(gòu)是任何程序或軟件的構(gòu)建塊(基礎(chǔ)塊)。

術(shù)語:

就數(shù)據(jù)結(jié)構(gòu)而言,使用以下術(shù)語:

  • 數(shù)據(jù):數(shù)據(jù)可以定義為基本值或值集合,例如,學(xué)生的姓名和ID,成績等就是學(xué)生的數(shù)據(jù)。
  • 組項:具有從屬數(shù)據(jù)項的數(shù)據(jù)項稱為組項,例如,學(xué)生的姓名由名字和姓氏組成。
  • 記錄:記錄可以定義為各種數(shù)據(jù)項的集合,例如,如果以學(xué)生實體為例,那么學(xué)生的名稱,地址,課程和標(biāo)記可以組合在一起形成學(xué)生的記錄。
  • 文件:文件是一種類型實體的各種記錄的集合,例如,如果類中有60名員工,則相關(guān)文件中將有20條記錄,其中每條記錄包含有關(guān)每個員工的數(shù)據(jù)。
  • 屬性和實體:實體表示某些對象的類。它包含各種屬性。每個屬性表示該實體的特定屬性。
  • 字段:字段是表示實體屬性的單個基本信息單元。
用途:

隨著應(yīng)用程序變得越來越復(fù)雜,數(shù)據(jù)量日益增加,可能會出現(xiàn)以下問題:

  • 處理器速度:要處理非常大的數(shù)據(jù),需要高速處理,但隨著數(shù)據(jù)逐日增長到每個實體數(shù)十億個文件,處理器可能無法處理大量數(shù)據(jù)。
  • 數(shù)據(jù)搜索:假設(shè)商店的庫存大小是100860個商品,如果應(yīng)用程序需要搜索某一特定商品,則每次需要遍歷100860個商品,這會導(dǎo)致搜索過程變慢。
  • 大量請求:如果成千上萬的用戶在Web服務(wù)器上同時搜索數(shù)據(jù),在此過程中可能在短時會有一個非常大請求而導(dǎo)致服務(wù)器處理不了。

為了解決上述問題,使用數(shù)據(jù)結(jié)構(gòu)。組織數(shù)據(jù)以形成數(shù)據(jù)結(jié)構(gòu),使得不需要搜索所有項目并且可以立即搜索所需數(shù)據(jù)

分類:
操作:

遍歷每個數(shù)據(jù)結(jié)構(gòu)都包含一組數(shù)據(jù)元素。遍歷數(shù)據(jù)結(jié)構(gòu)表示訪問數(shù)據(jù)結(jié)構(gòu)的每個元素,以便執(zhí)行某些特定操作,如搜索或排序。示例 :如果需要計算學(xué)生在6個不同科目中獲得的分?jǐn)?shù)的平均值,需要遍歷完整的分?jǐn)?shù)數(shù)組并計算總和,然后將總分?jǐn)?shù)除以科目數(shù),即6, 最后得到平均值。
插入插入是在任何位置將元素添加到數(shù)據(jù)結(jié)構(gòu)的過程。如果數(shù)據(jù)結(jié)構(gòu)的大小是n,那么只能在n-1個數(shù)據(jù)元素之間插入元素。
刪除從數(shù)據(jù)結(jié)構(gòu)中刪除元素的過程稱為刪除。 可以在任何隨機(jī)位置刪除數(shù)據(jù)結(jié)構(gòu)中的元素。如果要從空數(shù)據(jù)結(jié)構(gòu)中刪除元素,則會發(fā)生下溢。
搜索在數(shù)據(jù)結(jié)構(gòu)中查找元素位置的過程稱為搜索。 有兩種算法可以執(zhí)行搜索,即線性搜索和二進(jìn)制搜索。
排序按特定順序排列數(shù)據(jù)結(jié)構(gòu)的過程稱為排序。 有許多算法可用于執(zhí)行排序,例如,插入排序,選擇排序,冒泡排序等。
合并當(dāng)兩個列表分別為大小為M和N的列表A和列表B時,相似類型的元素,連接產(chǎn)生第三個列表,列表C的大小(M + N),則此過程稱為合并。


數(shù)據(jù)結(jié)構(gòu)分類

1.線性數(shù)據(jù)結(jié)構(gòu)

如果數(shù)據(jù)結(jié)構(gòu)的所有元素按線性順序排列,則稱為線性數(shù)據(jù)結(jié)構(gòu)。
在線性數(shù)據(jù)結(jié)構(gòu)中,元素以非分層方式存儲,除了第一個最后一個元素,它的每個元素具有后繼元素前導(dǎo)元素
線性數(shù)據(jù)結(jié)構(gòu)的類型有:數(shù)組;鏈表;堆棧;隊列

  • 數(shù)組數(shù)組是類似數(shù)據(jù)項的集合,每個數(shù)據(jù)項稱為數(shù)組的元素。元素的數(shù)據(jù)類型可以是任何有效的數(shù)據(jù)類型,如char,int,float或者double。數(shù)組的元素共享相同的變量名,但是每個元素都有一個不同的索引號,這些索引號也稱為下標(biāo)。數(shù)組可以是一維的,二維的或者多維的。
  • 鏈表鏈表是一種線性數(shù)據(jù)結(jié)構(gòu),用于維護(hù)內(nèi)存中的列表。它可以看作存儲在非連續(xù)內(nèi)存位置的節(jié)點(diǎn)集合。鏈表中每個節(jié)點(diǎn)都包含指向其相鄰節(jié)點(diǎn)的指針。
  • 隊列隊列是一個線性列表,它的元素只能在一端插入(添加),也被稱為后端,而只在另一端出隊(刪除),也被稱為前端。
  • 堆棧堆棧是一個線性列表,其中只允許在一端插入和刪除,稱為頂部。堆棧是一種抽象的數(shù)據(jù)類型(ADT),可以在大多數(shù)編程語言中實現(xiàn)。它被命名為堆棧,因為它的行為類似于真實世界的的堆棧,例如,成堆的板塊或卡片組等,只能在最頂面操作。
2.非線性數(shù)據(jù)結(jié)構(gòu)

非線性數(shù)據(jù)結(jié)構(gòu)不形成序列,即每個項目或元素以非線性排列與兩個或更多個其他項目連接。 數(shù)據(jù)元素不按順序結(jié)構(gòu)排列。
非線性數(shù)據(jù)結(jié)構(gòu)的類型有樹;圖

  • :樹是多級數(shù)據(jù)結(jié)構(gòu),其元素之間具有層次關(guān)系,樹的元素也稱為節(jié)點(diǎn)。層次中最底層的節(jié)點(diǎn)稱為葉節(jié)點(diǎn),而最頂層節(jié)點(diǎn)稱為根節(jié)點(diǎn)每個節(jié)點(diǎn)都包含指向相鄰節(jié)點(diǎn)的指針。

樹數(shù)據(jù)結(jié)構(gòu)基于節(jié)點(diǎn)之間的父子關(guān)系。 除了葉節(jié)點(diǎn)之外,樹中的每個節(jié)點(diǎn)可以具有多個子節(jié)點(diǎn),而除了根節(jié)點(diǎn)之外,每個節(jié)點(diǎn)可以具有最多一個父節(jié)點(diǎn)。
樹可以分為許多類別

  1. 無序樹:樹中任意節(jié)點(diǎn)的子結(jié)點(diǎn)之間沒有順序關(guān)系,這種樹稱為無序樹,也稱為自由樹;

  2. 有序樹:樹中任意節(jié)點(diǎn)的子結(jié)點(diǎn)之間有順序關(guān)系,這種樹稱為有序樹;

  3. 二叉樹:每個節(jié)點(diǎn)最多含有兩個子樹的樹稱為二叉樹;二叉樹又分為

    • 完全二叉樹:對于深度為K的,有n個結(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)其每一個結(jié)點(diǎn)都與深度為K的滿二叉樹中編號從1至n的結(jié)點(diǎn)一一對應(yīng)時稱之為完全二叉樹。
    • 滿二叉樹:一個二叉樹,如果每一個層的結(jié)點(diǎn)數(shù)都達(dá)到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數(shù)為K,且結(jié)點(diǎn)總數(shù)是(2^k) -1 ,則它就是滿二叉樹。
    • 霍夫曼樹:帶權(quán)路徑最短的二叉樹稱為哈夫曼樹或最優(yōu)二叉樹;
  • :圖可以定義為由稱為邊緣的鏈接連接的元素集(由頂點(diǎn)表示)的圖表示。 圖不同于樹,圖可以有循環(huán)而樹不能具有循環(huán)。

數(shù)據(jù)結(jié)構(gòu)優(yōu)缺點(diǎn)匯總

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容