在學習演算法之前先了解下什麼是資料結構

2021-10-09 00:06:33 字數 1749 閱讀 3020

現在很多大廠面試都會問一些演算法題,以至於很多同學急急忙忙搜尋各種演算法題,各種刷。刷題,沒錯,必須要多動手刷,熟能生巧。但是,如果你連常見的資料結構,如鍊表、樹以及常見的演算法思想,如遞迴、列舉、動態規劃這些都沒學過,那麼,我不建議你盲目瘋狂著去刷題的。而是先去找本資料結構的書學習下必要的基礎知識,然後再去刷題,可能不會那麼痛苦,並且事半功倍。有這麼一句話說「程式=資料結構+演算法」,也有人說「如果把程式設計比作做菜,那麼資料結構就好比食材(菜),演算法就好比廚藝(做菜的技巧)」。

資料結構在計算機中的表示稱為資料的物理結構或儲存結構,它是資料元素相互之間存在一種或多種特定關係的集合。

資料結構的儲存型別

1、線性表,資料元素之間是「一對一」關係,如:順序表、非順序表、佇列、棧

線性表的儲存結構又有兩種不同的型別:順序儲存結構和鏈式儲存結構。

順序儲存結構是通過在計算機儲存器中的相對位置來表示資料元素之間的邏輯關係,就是在計算機儲存的物理位置是依次排列連續的,如我們所常見的陣列就是順序儲存的。

鏈式儲存結構是通過儲存位址的指標表示資料元素之間的邏輯關係,就是資料元素之間儲存的物理儲存單元不一定是連續相連的,可能是非順序、非連續的,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的「一條線排列」的關係,如鍊表。當然,棧和佇列既可以是順序也可以是鏈式儲存結構。

2、樹,資料元素之間是「一對多」關係

3、圖,資料元素之間是「多對多」關係

演算法

**演算法(algorithm)**是指運算元據物件來解決程式中問題的方法,它不屬於資料結構,而是運用資料結構描述解決問題的策略機制,對於我們程式開發者來說,就是能夠對一定規範的輸入,在有限時間內計算出所要求的輸出。(以上是我自己的乙個理解,翻了好多資料也沒有找到乙個權威統一的定義)

評價乙個演算法優劣是使用時間複雜度和空間複雜度來衡量。

時間複雜度

時間複雜度:是指執行當前演算法所消耗的時間,但並不是用於來真實代表演算法的執行時間的,它是用來表示**執行時間的增長變化趨勢,我們用t(n)來表示。

演算法的漸進時間複雜度:t(n) = o( f(n) ),其中f(n) 表示每行**執行次數之和,而 o 表示正比例關係

o(f(n))表示法常見的時間複雜度量級有:

上面從上至下依次的時間複雜度越來越大,執行的效率越來越低。在時間複雜度又分為:

最好時間複雜度: 在資料最理想情況下,演算法的時間複雜度,上面**為o(1)

最壞時間複雜度: 在資料最壞情況下,演算法時間複雜度,上面**為o(n)

平均時間複雜度: 資料在上述狀況下的概率並不高,為表示平均情況下的時間複雜度,引入了平均時間複雜度的概念

空間複雜度

空間複雜度是指執行當前演算法需要占用多少記憶體空間,是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度,同樣反映的是乙個趨勢,我們用 s(n) 來定義。

演算法的漸進空間複雜度:s(n) = o( f(n) )

空間複雜度比較常用的有:o(1)、o(n)、o(n²)。

最後,提高資料結構與演算法沒啥捷徑,最好的捷徑就是多刷題。但是,刷題的前提是你要先學會一些基本的資料結構與演算法思想。下面給個資料結構和演算法思維導圖:

在學RTX之前的作業系統知識

rtx學習之路 在學rtx之前的作業系統知識 每當一提起作業系統這個詞,腦子裡立即浮現的是windows,linux,還有就是dos,dos系統在上學的時候偶爾用過,但那時候流行的是window98。linux 從來都沒有親自用過,只是聽到過,見別人用過。上學的時候學的是電腦科學,學了一些作業系統方...

《演算法導論》學習之前言

在程式設計過程中,發現自己用 編寫演算法的能力,需要進一步提高。故開始學習 演算法導論 目的是讓理論素養與程式設計實現演算法能力齊頭並進。學會自己設計演算法,也是這本書編著者的乙個重要目標。因此這本書不像國內的那些將演算法的教材一樣,只是單純的講解各種經典演算法,而是啟迪讀者在能夠熟練掌握經典演算法...

在學生課堂作業作品發布之前的話

1 重啟這個部落格,為了與大家分享現在初中生的一些情況,不是全部 2 以flash為重點,教學了幾年,每年都有讓你驚嘆的學生作品,或輾轉丟失 或沒有分享,留在我記憶中,都是無法言語的美好,所以希望花些時間放在這裡與大家分享 3 不論哪個學科,總有學得好,學得不夠好的學生,有些同學比較喜歡,當做作品來...