5分鐘了解資料結構

2022-09-21 03:18:08 字數 2699 閱讀 7151

老外真的很喜歡創造新名詞。春節的時候我給我姐選顯示器,因為我姐是做設計的,我特地研究了一下顯示器的色域。我發現除了我們常用的srgb外,還有個adobe rgb。後來經過了解,原來是photoshop的工程師在參考其他色彩標準的時候搞錯了引數,後來懶得改了,便自己申請了專利,搞成了乙個新的色彩標準,後來隨著adobe軟體的流行現在已經變成了行業標準。因為老外不厭其煩的創造新名詞,給我們造成了不小的困擾。比如面試的時候,面試官問你**l樹,你知道什麼是平衡二叉樹,不知道什麼是**l樹,面試官知道問**l樹,卻不知道問平衡二叉樹,結果大家面面相覷。世界上最遠的距離,莫過於你跟面試官背的不是同一套八股文。以後遇到這樣的面試官,不妨問下他什麼是基數樹。基數樹不知道嗎,那trie樹總該知道吧,trie樹也不知道的話字典樹總該知道吧,字典樹也不知道那字首樹總該知道吧。相信面試官會被問的懷疑人生。

資料結構(data structure)是帶有結構特性的資料元素的集合,它研究的是資料的邏輯結構和資料的物理結構以及它們之間的相互關係,並對這種結構定義相適應的運算,設計出相應的演算法,並確保經過這些運算以後所得到的新結構仍保持原來的結構型別。簡而言之,資料結構是相互之間存在一種或多種特定關係的資料元素的集合,即帶「結構」的資料元素的集合。「結構」就是指資料元素之間存在的關係,分為邏輯結構和儲存結構。

資料的邏輯結構和物理結構是資料結構的兩個密切相關的方面,同一邏輯結構可以對應不同的儲存結構。演算法的設計取決於資料的邏輯結構,而演算法的實現依賴於指定的儲存結構。

不知道大家覺得好不好理解,簡單說來,計算機基本上就做兩件事:儲存資料和處理資料。資料結構,是老外總結出來的一套行之有效的資料儲存方式,並圍繞著這些儲存方式設計出了一些高效的操作演算法。借助資料結構,我們可以高效地管理多個資料,進而完成更複雜的功能。下圖列舉了一些常見的資料結構,後面會逐個進行講解:

列表

通常一系列資料a0,a1,a2,a3,...,an-1 可以採用表來儲存。表一般支援幾種操作,尋找某元素所在位置,在表的某個位置插入和刪除某元素,返回某個位置上的元素等。

棧也叫lifo(後進先出)表,元素的插入和訪問、刪除都只能從乙個方向進行。通常支援入棧操作、出棧操作以及返回當前棧頂元素。

佇列

佇列插入時再一端進行,刪除時只能在另一端進行,也叫fifo(先進先出)表。通常支援入隊操作,出隊操作和返回對頭元素。

樹是資料結構考核的重點,涉及了很多的概念,也發展出來很多的變種,需要花大力氣去學習。樹是一些節點的集合,這個集合可以是空集;如果不是空集,則樹由稱作根(root)的節點r和0個或者多個非空的(子)樹t1,t2,...,tk組成,這些子樹中每一棵的根都被來自根r的一條有向邊(edge)所連線。每一棵子樹的根叫做根r的兒子(child),而r是每棵子樹的根的父親(parent)。沒有兒子的節點稱為樹葉(leaf),具有相同父親的節點為兄弟(siblings)。在上圖,a是b和c的父親,b和c是a的兒子,b和c是兄弟,d和f沒有兒子所以叫葉子。

從節點n1到nk的路徑(path)定義為節點n1,n2,...,nk的乙個序列,使得對於1<=ii是ni+1的父親。這條路徑的長(length)是該路徑上的邊的條數,即k-1。從每乙個節點到他自己有一條長為0的路徑。注意,在一棵樹中從根到每個節點恰好存在一條路徑。對任意節點ni,ni的深度(depth)為從根到ni的唯一路徑的長。因此,根的深度為0。節點ni的高(height)是從ni到一片樹葉的最長路徑的長。一棵樹的高度(height of a tree)等於它的根的高。一棵樹的深度(depth of a tree)等於其最深的樹葉的深度,該深度總是等於這棵樹的高。

樹經常被考核到的點是他的幾種遍歷策略,分別是先序遍歷、後序遍歷和中序遍歷,三種遍歷策略的區別主要是根節點是在什麼時候處理的。先序遍歷是先處理根節點,再處理他的兒子節點;後序遍歷是等他所有的子節點處理完後再處理根節點。中序遍歷只會出現在二叉樹中,二叉樹每個根節點最多有左右兩個兒子節點,處理順序分別是左二子節點、根節點、右兒子節點。

雜湊表

優先佇列

優先佇列設計的目的是找出、返回並刪除最小的元素,支援插入操作,刪除最小者操作。

注:插入未排序陣列有時被引用為o ( n ),因為假設要插入的元素必須插入到陣列的乙個特定位置,這需要將所有後續元素移動乙個位置。然而,在經典陣列中,陣列用於儲存任意未排序的元素,因此任何給定元素的確切位置無關緊要,插入是通過將陣列大小增加 1 並將元素儲存在末尾來執行的陣列,這是乙個o (1) 操作。同樣,刪除操作有時被引用為o ( n) 由於假設必須移動後續元素,但在經典的未排序陣列中,順序並不重要(儘管元素是按插入時間隱式排序的),因此可以通過將要刪除的元素與最後乙個元素交換來執行刪除陣列中的元素,然後將陣列大小減 1,這是乙個o (1) 操作。

那麼多的資料結構我們要如何選擇呢?資料結構終究是服務於你的程式的,學習資料結構關鍵還是理解資料結構的設計思路,不用過於拘泥。以前上大學的時候我自己開發了乙個電子詞典程式,當時並沒有學習過字典樹,但是根據電子詞典的需要設計出來的資料結構就是字典樹。現在的面試官很喜歡問各種術語各種概念,卻不知道最重要的其實還是問題的解決本身。當然也不是說不需要學習資料結構,既然我們要站在巨人的肩膀前進,至少我們得知道巨人的肩膀在哪是不是。下面總結了常用資料結構的一些權衡:

引用:

5分鐘了解docker

一 概念 開源的應用容器引擎,打包開發者的應用及依賴包在乙個可移植的容器中,相當於沙箱。docker允許開發人員在單個作業系統上隔離和執行多個應用程式,而不是為伺服器上的每個應用程式專用乙個虛擬機器。這是通過將應用程式隔離在單獨的容器中來實現的,這些應用程式雖然被容器分隔開,但是卻可以共享作業系統和...

了解資料結構

程式 資料結構 演算法 資料 描述客觀事物的符號,是計算機中可以操作的物件,能被計算機識別,並輸入給計算機處理的符號集合 資料元素 是組成資料的 有一定意義的基本單位,在計算機中通常作為整體處理,也被稱為記錄 資料項 乙個資料元素可以由若干個資料項組成。資料項是資料不可分割的最小單位 關心資料之間的...

5分鐘了解位運算

運算子分為6種,它們是 名稱符號 按位與 按位或 按位異或 按位取反 左移運算 右移運算 按位與運算將參與運算的兩數對應的二進位制位相與,當對應的二進位制位均為 1 時,結果位為 1,否則結果位為 0。按位與運算的運算子為 參與運算的數以補碼方式出現。舉個例子,將數字 5 和數字 8 進行按位與運算...