算法是解決問題的手段和步驟倚搬。
針對一個算法捅僵,需要知道兩件事情:
1.它能否解決特定的問題趴樱?
2.它能否有效地使用資源?
如果你寫代碼不能解決某個問題,或者它能解決問題,但是對資源的利用并不是高效的(比如執(zhí)行所花的時間太長或者消耗了太多的內(nèi)存)。那么寫的代碼并沒有真正起到幫助的作用。
這就是為什么我們需要去學(xué)習(xí)算法哼御。我們想要知道我們的代碼是基于可以解決問題并且對資源的使用是高效的點子上恋昼。并且我們想要知道我們的解決方案針對所有可能的場景是正確和高效的∴露撸或者至少我們知道我們的算法在哪種比較少見的情況下會失敗橘券。
即使你可能更傾向于調(diào)用API中的函數(shù)而不是自己設(shè)計算法供置,你應(yīng)該知道在實現(xiàn)這些API中所使用的算法和數(shù)據(jù)結(jié)構(gòu)。針對每一個場景,沒有哪一個數(shù)據(jù)結(jié)構(gòu)是最好的選擇物遇。因此我們需要知道每種數(shù)據(jù)結(jié)構(gòu)的優(yōu)勢和弱點起趾。
編程本來就是跟數(shù)據(jù)結(jié)構(gòu)和算法有關(guān)的事情属百。數(shù)據(jù)結(jié)構(gòu)是用來保存數(shù)據(jù)诸老,算法是用來使用這些數(shù)據(jù)解決問題的睦番。如果你寫程序了,你本身就在使用這兩個東西兢哭。
你為什么要學(xué)習(xí)它們呢舍咖?因為你要使用它們更好并且有效率夹姥。沒有學(xué)習(xí)過算法旦部,當(dāng)試圖解決手頭上的問題時,你將面臨麻煩官卡。你必須用你自己的方式去解決毛秘,這樣可能會不是非常高效饭寺。沒有學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)阻课,你面臨的問題是不知道如何去選擇哪一種數(shù)據(jù)結(jié)構(gòu)。是應(yīng)該去選擇鏈表還是不可變的數(shù)組呢艰匙?
如果你已經(jīng)知道數(shù)據(jù)結(jié)構(gòu)和算法限煞,在你寫一行代碼之前你就會明白這個問題。難道你不想讓自己的代碼高效嗎员凝?
最后晰骑,針對這個問題曾聽說過這樣的比喻,就好像“有一個這樣的應(yīng)用程序绊序,依靠今天的天氣狀況將正確地預(yù)測明天的天氣狀況硕舆,唯一的問題是,應(yīng)用程序需要兩天的時間進行計算骤公「Ч伲”