為什么要學習數(shù)據(jù)結(jié)構(gòu)和算法?你了解數(shù)據(jù)結(jié)構(gòu)和算法嗎?

為什么要學習數(shù)據(jù)結(jié)構(gòu)和算法?舉一個通俗的例子來說
編程就像一輛汽車,數(shù)據(jù)結(jié)構(gòu)和算法就是汽車內(nèi)部的變速箱。不懂變速箱原理的司機也可以開車。類似地,不了解數(shù)據(jù)結(jié)構(gòu)和算法的驅(qū)動程序也可以編程。但如果駕駛員了解傳動原理,比如降低速度以獲得更多的牽引力,或者降低牽引力以獲得更快的行駛速度。然后,當你在爬坡時使用一檔時,你可以獲得更大的牽引力;下坡時,用低速檔來限制汽車的行駛速度。
回到編程,例如,如果你想將一個班級的學生名字要臨時存儲在內(nèi)存中,你將選擇存儲什么數(shù)據(jù)結(jié)構(gòu)、array、ArrayList、HashSet或其他數(shù)據(jù)結(jié)構(gòu)。如果您不知道數(shù)據(jù)結(jié)構(gòu),你可能會隨便選擇一個容器來存儲和完成所有功能。然而,隨著學生數(shù)據(jù)量的增加,隨機選取的數(shù)據(jù)結(jié)構(gòu)會出現(xiàn)性能問題。一個了解數(shù)據(jù)結(jié)構(gòu)和算法的人在實際編程中會選擇合適的數(shù)據(jù)結(jié)構(gòu)來解決相應的問題,會大大提高程序的性能。

數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式,指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。
通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。
1、數(shù)據(jù)結(jié)構(gòu)的基本功能
如何插入一條新的數(shù)據(jù)項
如何尋找某一特定的數(shù)據(jù)項
如何刪除某一特定的數(shù)據(jù)項
如何迭代的訪問各個數(shù)據(jù)項,以便進行顯示或其他操作
2、常用的數(shù)據(jù)結(jié)構(gòu)

這幾種結(jié)構(gòu)優(yōu)缺點如下:先有個大概印象,后面會詳細講解?。?!
對于數(shù)組,你們所說的查找快,我想只是隨機查找快,因為知道數(shù)組下標,可以按索引獲取任意值。但是你要查找某個特定值,對于無序數(shù)組,還是需要遍歷整個數(shù)組,那么查找效率是O(n),效率是很低的(有序數(shù)組按照二分查找算法還是很快的)。
插入快,是在數(shù)組尾部進行插入,獲取到數(shù)組的最后一個索引下標,加1進行賦值就可以了。
刪除慢,除開尾部刪除,在任意中間或者前面刪除,后面的元素都要整體進行平移的,所以也是比較慢的。
綜上所述:對于數(shù)組,隨機查找快,數(shù)組尾部增刪快,其余的操作效率都是很低的。


算法簡單來說就是解決問題的步驟。
在Java中,算法通常都是由類的方法來實現(xiàn)的。前面的數(shù)據(jù)結(jié)構(gòu),比如鏈表為啥插入、刪除快,而查找慢,平衡的二叉樹插入、刪除、查找都快,這都是實現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)的算法所造成的。后面我們講的各種排序?qū)崿F(xiàn)也是算法范疇的重要領(lǐng)域。
1、算法的五個特征
有窮性:對于任意一組合法輸入值,在執(zhí)行又窮步驟之后一定能結(jié)束,即:算法中的每個步驟都能在有限時間內(nèi)完成。
確定性:在每種情況下所應執(zhí)行的操作,在算法中都有確切的規(guī)定,使算法的執(zhí)行者或閱讀者都能明確其含義及如何執(zhí)行。并且在任何條件下,算法都只有一條執(zhí)行路徑。
可行性:算法中的所有操作都必須足夠基本,都可以通過已經(jīng)實現(xiàn)的基本操作運算有限次實現(xiàn)之。
有輸入:作為算法加工對象的量值,通常體現(xiàn)在算法當中的一組變量。有些輸入量需要在算法執(zhí)行的過程中輸入,而有的算法表面上可以沒有輸入,實際上已被嵌入算法之中。
有輸出:它是一組與“輸入”有確定關(guān)系的量值,是算法進行信息加工后得到的結(jié)果,這種確定關(guān)系即為算法功能。
2、算法的設(shè)計原則
正確性:首先,算法應當滿足以特定的“規(guī)則說明”方式給出的需求。其次,對算法是否“正確”的理解可以有以下四個層次:
程序語法錯誤。
程序?qū)τ趲捉M輸入數(shù)據(jù)能夠得出滿足需要的結(jié)果。
程序?qū)τ诰倪x擇的、典型、苛刻切帶有刁難性的幾組輸入數(shù)據(jù)能夠得出滿足要求的結(jié)果。
程序?qū)τ谝磺泻戏ǖ妮斎霐?shù)據(jù)都能得到滿足要求的結(jié)果。
PS:通常以第 三 層意義的正確性作為衡量一個算法是否合格的標準。
可讀性:算法為了人的閱讀與交流,其次才是計算機執(zhí)行。因此算法應該易于人的理解;另一方面,晦澀難懂的程序易于隱藏較多的錯誤而難以調(diào)試。
健壯性:當輸入的數(shù)據(jù)非法時,算法應當恰當?shù)淖龀龇磻蜻M行相應處理,而不是產(chǎn)生莫名其妙的輸出結(jié)果。并且,處理出錯的方法不應是中斷程序執(zhí)行,而是應當返回一個表示錯誤或錯誤性質(zhì)的值,以便在更高的抽象層次上進行處理。
高效率與低存儲量需求:通常算法效率值得是算法執(zhí)行時間;存儲量是指算法執(zhí)行過程中所需要的最大存儲空間,兩者都與問題的規(guī)模有關(guān)。
前面三點 正確性,可讀性和健壯性相信都好理解。對于第四點算法的執(zhí)行效率和存儲量,我們知道比較算法的時候,可能會說“A算法比B算法快兩倍”之類的話,但實際上這種說法沒有任何意義。因為當數(shù)據(jù)項個數(shù)發(fā)生變化時,A算法和B算法的效率比例也會發(fā)生變化,比如數(shù)據(jù)項增加了50%,可能A算法比B算法快三倍,但是如果數(shù)據(jù)項減少了50%,可能A算法和B算法速度一樣。
所以描述算法的速度必須要和數(shù)據(jù)項的個數(shù)聯(lián)系起來。也就是“大O”表示法,它是一種算法復雜度的相對表示方式,這里我簡單介紹一下,后面會根據(jù)具體的算法來描述。
相對(relative):你只能比較相同的事物。你不能把一個做算數(shù)乘法的算法和排序整數(shù)列表的算法進行比較。但是,比較2個算法所做的算術(shù)操作(一個做乘法,一個做加法)將會告訴你一些有意義的東西;
表示(representation):大O(用它最簡單的形式)把算法間的比較簡化為了一個單一變量。這個變量的選擇基于觀察或假設(shè)。
例如,排序算法之間的對比通常是基于比較操作(比較2個結(jié)點來決定這2個結(jié)點的相對順序)。這里面就假設(shè)了比較操作的計算開銷很大。但是,如果比較操作的計算開銷不大,而交換操作的計算開銷很大,又會怎么樣呢?這就改變了先前的比較方式;
復雜度(complexity):如果排序10,000個元素花費了我1秒,那么排序1百萬個元素會花多少時間?在這個例子里,復雜度就是相對其他東西的度量結(jié)果。
然后我們在說說算法的存儲量,包括:
程序本身所占空間;
輸入數(shù)據(jù)所占空間;
輔助變量所占空間;
一個算法的效率越高越好,而存儲量是越低越好。

?嘿嘿今天的文章是和今天新更新的java300集是一套哦!數(shù)據(jù)結(jié)構(gòu)和算法的深入學習
有還在跟著視頻學習的小伙伴嗎?那你真的很棒啦,繼續(xù)加油哦!沒有跟著視頻學習的同學,可以看看自己java基礎(chǔ)知識哪里薄弱可以選擇性觀看(づ ̄3 ̄)づ╭?~
