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

數(shù)據(jù)結(jié)構(gòu)和算法是計算機科學中最重要的概念之一。如果您不熟悉計算機科學或編程见转,本文將為您提供有關(guān)數(shù)據(jù)結(jié)構(gòu)和算法的概述蹂析。這也是Landscape系列的第二集。

image

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

數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的組織和操作方式瓢娜。它試圖找到提高數(shù)據(jù)訪問效率的方法。在處理數(shù)據(jù)結(jié)構(gòu)時礼预,我們不僅關(guān)注一個數(shù)據(jù)眠砾,而且關(guān)注不同的數(shù)據(jù)集以及它們?nèi)绾我杂薪M織的方式相互關(guān)聯(lián)。

數(shù)組:數(shù)組是一種基于索引的數(shù)據(jù)結(jié)構(gòu),這意味著每個元素都由索引引用褒颈。數(shù)組包含相同的數(shù)據(jù)類型元素柒巫。

image

鏈表:鏈表是一系列節(jié)點,其中每個節(jié)點都連接到其后的節(jié)點谷丸。這形成了數(shù)據(jù)存儲的鏈接堡掏。它由數(shù)據(jù)元素和對下一條記錄的引用組成。

image

樹:樹是由邊連接的節(jié)點的集合刨疼。每個節(jié)點指向許多節(jié)點泉唁。樹表示分層圖形形式。

image

二叉樹:二叉樹有1或2個子節(jié)點揩慕。它可以具有最少的零個節(jié)點亭畜,這在節(jié)點具有NULL值時發(fā)生。

image

二進制搜索樹:二叉搜索樹(BST)是二叉樹迎卤。左子樹包含其鍵小于節(jié)點鍵值的節(jié)點拴鸵,而右子樹包含其鍵大于或等于節(jié)點鍵值的節(jié)點。此外蜗搔,兩個子樹也是二叉搜索樹劲藐。二叉搜索樹可以有效地檢索數(shù)據(jù)。

image

矩陣:矩陣是一個雙維數(shù)組樟凄。它使用兩個索引行和列來存儲數(shù)據(jù)聘芜。

image

圖:圖包含一組節(jié)點和邊。節(jié)點也稱為頂點不同。邊緣用于連接節(jié)點厉膀。節(jié)點用于存儲和檢索數(shù)據(jù)。

image

棧:棧是LIFO數(shù)據(jù)結(jié)構(gòu)二拐,其中只能訪問頂層元素服鹅。數(shù)據(jù)通過推送添加,并通過pop頂部刪除百新。

image

隊列:隊列是FIFO數(shù)據(jù)結(jié)構(gòu)企软。在該結(jié)構(gòu)中,在一端插入新元件饭望,從另一端移除現(xiàn)有元件仗哨。

image

Max-Heap:堆是基于樹的數(shù)據(jù)結(jié)構(gòu),其中樹的所有節(jié)點都按特定順序排列铅辞。最大堆是二叉樹厌漂。它是完整的。存儲在每個節(jié)點中的數(shù)據(jù)項大于或等于存儲在其子節(jié)點中的數(shù)據(jù)項斟珊。

image

Min-Heap: Min-heap是一個二叉樹苇倡。它是完整的。存儲在每個節(jié)點中的數(shù)據(jù)小于存儲在其子節(jié)點中的數(shù)據(jù)項。

image

Trie(前綴樹或字典樹): Trie是一棵樹旨椒。在trie中晓褪,每個節(jié)點(根節(jié)點除外)存儲一個字符或一個數(shù)字。通過將trie從根節(jié)點向下遍歷到特定節(jié)點n综慎,可以形成字符或數(shù)字的公共前綴涣仿,其也由特里結(jié)構(gòu)的其他分支共享。

image

** 后綴樹(Suffix tree):**后綴trie是包含給定文本的所有后綴的trie示惊。后綴特里允許特別快速地實現(xiàn)許多重要的字符串操作好港。

image

2. Java集合

Java集合框架是作為核心java的一部分包含的集合類型集。它提供了可以直接用于操作數(shù)據(jù)結(jié)構(gòu)的API或方法米罚,例如數(shù)組媚狰,鏈接列表,棧阔拳,隊列,集合和映射类嗤。如果掌握了java集合糊肠,它將為您節(jié)省大量時間并有助于解決復雜問題。

ArrayList: ArrayList類是List接口的可調(diào)整大小的數(shù)組實現(xiàn)遗锣。它實現(xiàn)所有可選的列表操作并允許所有元素货裹。

image

向量:向量與ArrayList非常相似,但Vector是同步且緩慢的精偿。它是一個遺留類弧圆,現(xiàn)在它可以與集合兼容。

String: String類用于創(chuàng)建和操作字符串笔咽。

image

LinkedList: LinkedList類是List和Deque接口的雙向鏈表實現(xiàn)搔预。LinkedList將其數(shù)據(jù)存儲為元素列表,并且每個元素都鏈接到其上一個和下一個元素叶组。

image

HashMap: HashMap是一個實現(xiàn)Map接口的集合類拯田。它需要一個哈希函數(shù)并使用hashCode()和equals()方法,以便分別在集合中放入和檢索元素甩十。

image

Hashtable: Hashtable類與HashMap類似船庇。它實現(xiàn)了Dictionary。Hashtable提供其鍵的枚舉侣监。它不允許null作為鍵或值鸭轮。請注意,由于HashMap是在稍后創(chuàng)建的橄霉,因此它是Hashtable的高級版本和改進版窃爷。Hashtable是同步的,速度較慢。HashMap比Hashtable更受歡迎吞鸭。

TreeMap: TreeMap實現(xiàn)了SortedMap接口寺董。它按其鍵的升序排序。操作的復雜性是O(logn)刻剥。

image

LinkedHashMap: LinkedHashMap保持插入順序遮咖。復雜性與HashMap O(1)相同。

image.png

HashSet: HashSet類實現(xiàn)Set接口造虏。不允許重復值御吞。它的元素沒有訂購。HashSet中允許使用NULL元素漓藕。

image

TreeSet: TreeSet使用樹結(jié)構(gòu)實現(xiàn)陶珠。TreeSet中的元素已排序。操作的復雜性是O(logn)享钞。

image

LinkedHashSet: LinkedHashSet維護插入順序揍诽。元素按照它們添加到Set中的相同順序進行排序。復雜性與HashSet O(1)相同栗竖。

image

Stack: Stack類擴展了Vector類暑脆,有五個操作來支持LIFO(后進先出)。Stack內(nèi)部有一個指針:TOP狐肢,它指的是Stack元素的頂部添吗。

image

PriorityQueue: PriorityQueue類是Queue的實現(xiàn),每個元素都具有與之關(guān)聯(lián)的優(yōu)先級份名。優(yōu)先級隊列的元素根據(jù)其自然順序排序碟联,或者由隊列構(gòu)建時提供的比較器排序。

image

3.算法

算法是一種定義明確的過程僵腺,允許計算機解決問題鲤孵。有很多算法。在這里辰如,我列出了計算機科學中一些廣泛使用的算法:排序裤纹,搜索,重復編程和動態(tài)編程丧没。

排序:排序是一種算法鹰椒,由一系列指令組成,這些指令將數(shù)組作為輸入呕童,對數(shù)組執(zhí)行指定的操作漆际,有時稱為列表,并輸出排序的數(shù)組夺饲。簡單的排序算法是冒泡排序奸汇,選擇排序插入排序施符。

冒泡排序:這是最簡單的排序算法。我們從數(shù)組的開頭開始擂找,如果第一個元素大于第二個元素戳吝,則交換前兩個元素。然后我們轉(zhuǎn)到下一對贯涎,依此類推听哭,不斷掃描數(shù)組,直到它被排序塘雳。O(n 2)平均值和最差值陆盘。

image

選擇排序:這是最直觀的,不一定有效败明。使用線性掃描找到最小元素并將其移動到前面(使用前面元素交換它)隘马。然后找到第二個最小的并移動它,再次進行線性掃描妻顶。繼續(xù)這樣做酸员,直到所有元素都到位。適合小文件讳嘱。O(n 2)平均值和最差值沸呐。

image

插入排序:它通過逐個移動元素對數(shù)組進行排序。每次迭代都會從輸入數(shù)據(jù)中刪除一個元素呢燥,并將其插入正在排序的列表中的正確位置。它對于較小的數(shù)據(jù)集是有效的寓娩,但對于較大的列表而言效率非常低叛氨。它比Selection Sort和Bubble Sort算法更好。O(n 2)平均值和最差值棘伴。

image

搜索:搜索是基于密鑰查找內(nèi)容寞埠。有線性搜索二進制搜索

線性搜索:線性搜索是一種在列表中查找目標值的方法焊夸。它按順序檢查列表中每個元素的目標值橙数,直到找到匹配項或者直到搜索完所有元素為止赘风。

image

二進制搜索:二進制搜索是一種有效的算法,用于從有序的項目列表中查找項目。它的工作原理是反復將列表中可能包含該項目的部分分成兩半; 直到你將可能的位置縮小到一個吁恍。復雜性從O(n)減少到O(logn)。

image

遞歸:遞歸是一種函數(shù)或算法自稱的計算機編程技術(shù)缠捌。它應包括具有終止條件的步驟睬罗。當條件滿足時,每個重復的其余部分從最后一個被調(diào)用到第一個重復處理鲁僚。通過遞歸解決的最著名的問題是因子數(shù)炊苫。

階乘數(shù):數(shù)n的階乘是所有小于或等于n的正非零數(shù)的乘積裁厅。n的階乘由n!表示侨艾。

image

動態(tài)編程:動態(tài)編程是一種解決復雜問題的方法执虹,可以將其分解為更簡單的子問題集合,只需解決一次子問題唠梨,并存儲其解決方案袋励。下次出現(xiàn)相同的子問題時,可以查找先前計算的解姻成,從而節(jié)省計算時間插龄,但代價是存儲空間的適度支出。著名的動態(tài)編程問題是Fibonacci數(shù)科展。

斐波納契數(shù):它們是一系列數(shù)字均牢,其中每個數(shù)字(斐波納契數(shù))是前兩個數(shù)字的總和。最簡單的是系列1,1,2,3,5,8等才睹。

image

劃分和征服:分而治之算法通過遞歸地將問題分解為相同或相關(guān)類型的兩個或更多個子問題來工作徘跪,直到這些子問題變得足夠簡單直接解決。使用分而治之的著名問題是合并排序快速排序琅攘。

合并排序:將數(shù)組分成兩半垮庐,對每一半進行排序,然后將它們合并在一起坞琴。這些半部分中的每一部分都應用了相同的排序算法哨查。最終,它合并了兩個單元素數(shù)組剧辐。O(nlogn)平均值和最差值寒亥。

image

快速排序:選取一個隨機元素并對數(shù)組進行分區(qū),所有小于分區(qū)元素的數(shù)字都會出現(xiàn)在大于它的所有元素之前荧关。如果我們在元素周圍重復分區(qū)數(shù)組溉奕,那么數(shù)組最終將被排序。但由于分區(qū)元素不能保證為中位數(shù)忍啤,因此我們的排序可能非常慢加勤。O(nlogn)平均值,O(n 2)最差同波。

image

貪婪:貪婪算法做出的選擇似乎是當時最好的選擇鳄梅,即做出本地最優(yōu)選擇,希望這種選擇能夠帶來全局最優(yōu)解決方案未檩。貪婪算法解決的著名問題是霍夫曼編碼卫枝。

霍夫曼編碼:霍夫曼編碼是一種無損數(shù)據(jù)壓縮算法。其思想是為輸入字符分配可變長度代碼讹挎,分配代碼的長度基于相應字符的頻率校赤。

image

更多
觀看“數(shù)據(jù)結(jié)構(gòu)和算法的風景”(YouTube)視頻吆玖!

原文:https://www.lavivienpost.com/data-structures-and-algorithms/
作者: La Vivien

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市马篮,隨后出現(xiàn)的幾起案子沾乘,更是在濱河造成了極大的恐慌,老刑警劉巖浑测,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅阵,死亡現(xiàn)場離奇詭異,居然都是意外死亡迁央,警方通過查閱死者的電腦和手機掷匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖圈,“玉大人讹语,你說我怎么就攤上這事》淇疲” “怎么了顽决?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長导匣。 經(jīng)常有香客問我才菠,道長,這世上最難降的妖魔是什么贡定? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任赋访,我火速辦了婚禮,結(jié)果婚禮上缓待,老公的妹妹穿的比我還像新娘蚓耽。我一直安慰自己,他們只是感情好命斧,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嘱兼,像睡著了一般国葬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芹壕,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天汇四,我揣著相機與錄音,去河邊找鬼踢涌。 笑死通孽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的睁壁。 我是一名探鬼主播背苦,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼互捌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了行剂?” 一聲冷哼從身側(cè)響起秕噪,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厚宰,沒想到半個月后腌巾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡铲觉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年澈蝙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵幽。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡灯荧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出并齐,到底是詐尸還是另有隱情漏麦,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布况褪,位于F島的核電站撕贞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏测垛。R本人自食惡果不足惜捏膨,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望食侮。 院中可真熱鬧号涯,春花似錦、人聲如沸锯七。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眉尸。三九已至域蜗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間噪猾,已是汗流浹背霉祸。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袱蜡,地道東北人丝蹭。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像坪蚁,于是被迫代替她去往敵國和親奔穿。 傳聞我的和親對象是個殘疾皇子镜沽,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345