1. 程式人生 > >筆試題目總結之二——常用資料結構與演算法

筆試題目總結之二——常用資料結構與演算法

資料結構與演算法,這個部分的內容其實是十分的龐大,要想都覆蓋到不太容易。在校學習階段我們可能需要對每種結構,每種演算法都學習,但是找工作筆試或者面試的時候,要在很短的時間內考察一個人這方面的能力,把每種結構和演算法都問一遍不太現實。所以,實際的情況是,企業一般考察一些看起來很基本的概念和演算法,或者是一些變形,然後讓你去實現。也許看起來簡單,但是如果真讓你在紙上或者是計算機上快速地完成一個演算法,並且設計測試案例,最後跑起來,你就會發現會很難了。這就要求我們要熟悉,並牢固掌握常用的演算法,特別是那些看起來貌似簡單的演算法,正是這些用起來很普遍的演算法,才要求我們能很紮實的掌握,在實際工作中提高工作效率。遇到複雜的演算法,通過分析和紮實的基本功,應該可以很快地進行開發。

閒話少說,下面進入正題。

一.資料結構部分

1.陣列和連結串列的區別。(很簡單,但是很常考,記得要回答全面)

C++語言中可以用陣列處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列的大小,只能將陣列定義成足夠大小,這樣陣列中有些空間可能不被使用,從而造成記憶體空間的浪費。連結串列是一種常見的資料組織形式,它採用動態分配記憶體的形式實現。需要時可以用new分配記憶體空間,不需要時用delete將已分配的空間釋放,不會造成記憶體空間的浪費。
  
從邏輯結構來看:陣列必須事先定義固定的長度(元素個數),不能適應資料動態地增減的情況,即陣列的大小一旦定義就不能改變。當資料增加時,可能超出原先定義的元素個數;當資料減少時,造成記憶體浪費;連結串列動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入、刪除資料項。(陣列中插入、刪除資料項時,需要移動其它資料項)。  
  
從記憶體儲存來看:(靜態)陣列從棧中分配空間(用NEW建立的在堆中), 對於程式設計師方便快速,但是自由度小;連結串列從堆中分配空間, 自由度大但是申請管理比較麻煩.

從訪問方式來看:陣列在記憶體中是連續儲存的,因此,可以利用下標索引進行隨機訪問;連結串列是鏈式儲存結構,在訪問元素的時候只能通過線性的方式由前到後順序訪問,所以訪問效率比陣列要低。

2.連結串列的一些操作,如連結串列的反轉,連結串列存在環路的判斷(快慢指標),雙向連結串列,迴圈連結串列相關操作。

3.佇列(特殊的如優先順序佇列),棧的應用。(比如佇列用在訊息佇列,棧用在遞迴呼叫中)

4.二叉樹的基本操作

二叉樹的三種遍歷方式(前序,中序,後序)及其遞迴和非遞迴實現,三種遍歷方式的主要應用(如字尾表示式等)。相關操作的時間複雜度。

5.字串相關

整數,浮點數和字串之間的轉換(atoi,atof,itoa)

字串拷貝注意異常檢查,比如空指標,字串重疊,自賦值,字串結束符'\0'等。

二.演算法部分

1.排序演算法:

排序可以算是最基本的,最常用的演算法,也是筆試面試中最常被考察到的演算法。最基本的氣泡排序,選擇排序,插入排序要可以很快的用程式碼實現,這些主要考察你的實際編碼能力。堆排序,歸併排序,快排序,這些演算法需要熟悉主要的思想,和需要注意的細節地方。需要熟悉常用排序演算法的時間和空間複雜度。

各種排序演算法的使用範圍總結:(1)當資料規模較小的時候,可以用簡單的排序演算法如直接插入排序或直接選擇排序。(2)當檔案的初態已經基本有序時,可以用直接插入排序或氣泡排序。(3)當資料規模比較大時,應用速度快的排序演算法。可以考慮用快速排序。當記錄隨機分佈的時候,快排的平均時間最短,但可能出現最壞的情況,這時候的時間複雜度是O(n^2),且遞迴深度為n,所需的棧空間問O(n)。(4)堆排序不會出現快排那樣的最壞情況,且堆排序所需的輔助空間比快排要少。但這兩種演算法都不是穩定的,若要求排序時穩定的,可以考慮用歸併排序。(5)歸併排序可以用於內排序,也可以用於外排序。在外排序時,通常採用多路歸併,並且通過解決長順串的合併,產生長的初始串,提高主機與外設並行能力等措施,以減少訪問外存額次數,提高外排序的效率。

2,查詢演算法

能夠熟練寫出或者是上機編碼出二分查詢的程式。

3.hash演算法

4.一些演算法設計思想。

貪心演算法,分治演算法,動態規劃演算法,隨機化演算法,回溯演算法等。這些可以根據具體的例子程式來複習。

5.STL

STL(Standard Template Library)是一個C++領域中,用模版技術實現的資料結構和演算法庫,已經包含在了C++標準庫中。其中的vecor,list,stack,queue等結構不僅擁有更強大的功能,還有了更高的安全性。除了資料結構外,STL還包含泛化了的迭代器,和執行在迭代器上的各種實用演算法。這些對於對效能要求不是太高,但又不希望自己從底層實現演算法的應用還是很具有誘惑力的。

相關推薦

筆試題目總結——常用資料結構演算法

資料結構與演算法,這個部分的內容其實是十分的龐大,要想都覆蓋到不太容易。在校學習階段我們可能需要對每種結構,每種演算法都學習,但是找工作筆試或者面試的時候,要在很短的時間內考察一個人這方面的能力,把每種結構和演算法都問一遍不太現實。所以,實際的情況是,企業一般考察一些看起來

常用資料結構演算法叉堆(binary heap)

一:什麼是二叉堆 二:二叉堆的實現  三:使用二叉堆的幾個例子 一:什麼是二叉堆 1.1:二叉堆簡介       二叉堆故名思議是一種特殊的堆,二叉堆具有堆的性質(父節點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值),二叉堆又具有二叉樹的性質(二叉堆是完全二叉樹

常用資料結構演算法時間複雜度求解

1.0 資料結構的相關概念 2.0 一些基本演算法的時間複雜度 O(1): int x=1; O(n): for(int i = 0; i < n; i++){ printf("%d",i); } O(lo

面試常考的常用資料結構演算法

資料結構與演算法,這個部分的內容其實是十分的龐大,要想都覆蓋到不太容易。在校學習階段我們可能需要對每種結構,每種演算法都學習,但是找工作筆試或者面試的時候,要在很短的時間內考察一個人這方面的能力,把每種結構和演算法都問一遍不太現實。所以,實際的情況是,企業一般考察一些看起來很基本的概念和演算法,或者是一些

JS常用資料結構演算法--佇列

佇列    遵循先進先出,後進後出原則的一組有序的項。 例如:銀行排隊取錢,食堂排隊吃飯,先到佇列的人總是先取完錢和吃完飯。 function Queue(){ var items = []; //進隊,向隊尾新增新的項 this.enqueue =

資料結構演算法樹的基本概念及常用操作的Java實現(叉樹為例) --- 第十

樹是一種非線性資料結構,這種資料結構要比線性資料結構複雜的多,因此分為三篇部落格進行講解: 第一篇:樹的基本概念及常用操作的Java實現(二叉樹為例) 第二篇:二叉查詢樹 第三篇:紅黑樹 本文目錄: 1、基本概念 1.1  什麼是樹 1.2  樹的

資料結構演算法隨筆------叉樹的遍歷(一文搞懂叉樹的四種遍歷)

二叉樹的遍歷 二叉樹的遍歷(traversing binary tree)是指從根結點出發,按照某種次序依次訪問二叉樹中所有的結點,使得每個結點被訪問依次且僅被訪問一次。 遍歷分為四種,前序遍歷,中序遍歷,後序遍歷及層序遍歷 前序 中

資料結構演算法美專欄學習筆記-叉樹基礎(上)

樹 節點的定義 樹中的元素稱之為節點 高度的定義 節點的高度:節點到葉子節點的最長路徑 樹的高度:跟節點的高度 深度的定義 根節點到這個節點所經歷的邊的個數 層的定義 節點的深度+1   二叉樹 滿二叉樹 除了葉子結點外每個節點都有左右兩個子節點 完全二叉樹 葉子結

[PTA] 資料結構演算法題目集 6-8 求叉樹高度

6.8 二叉樹高度 int GetHeight(BinTree BT) { if (BT == NULL) return 0; int leftH = GetHeight(BT->Left); int rightH = GetHeight(BT->Rig

[PTA] 資料結構演算法題目集 6-12 叉搜尋樹的操作集

唯一比較需要思考的刪除操作: 被刪除節點有三種情況: 1、葉節點,直接刪除 2、只有一個子節點,將子節點替換為該節點,刪除該節點。 3、有兩個子節點,從右分支中找到最小節點,將其值賦給被刪除節點的位置,接著刪除這個最小節點    // 函式Insert將X插入二叉搜尋樹BST並返

資料結構演算法常用排序演算法總結

排序演算法穩定性的簡單形式化定義為:如果Ai = Aj,排序前Ai在Aj之前,排序後Ai還在Aj之前,則稱這種排序演算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。   對於不穩定的排序演算法,只要舉出一個例項,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算

資料結構演算法美專欄學習筆記-叉樹基礎(下)

二叉查詢樹 Binary Search Tree  二叉查詢樹的定義 二叉查詢樹又稱二叉搜尋樹。其要求在二叉樹中的任意一個節點,其左子樹中的每個節點的值,都要小於這個節點的值,而右子樹的節點的值都大於這個節點的值。 二叉查詢樹的查詢操作 二叉樹類、節點類以及查詢方法的程式碼實現

資料結構演算法總結——叉查詢樹及其相關操作

我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分

資料結構演算法美 課程筆記 複雜度分析(上)

資料結構和演算法本身解決的是“快”和“省”的問題,即如何讓程式碼執行得更快,如何讓程式碼更省空間。所以,執行效率是演算法一個非常重要的考量指標。衡量演算法的執行效率最常用的就是時間和空間複雜度分析。 一、為什麼需要複雜度分析? 把程式碼跑一遍,通過統計、監控來得到演算法執行的時間和佔用的記憶

資料結構演算法叉查詢樹 --- 第十三篇

樹是一種非線性資料結構,這種資料結構要比線性資料結構複雜的多,因此分為三篇部落格進行講解: 第一篇:樹的基本概念及常用操作的Java實現(二叉樹為例) 第二篇:二叉查詢樹 第三篇:紅黑樹 本文目錄 1、二叉查詢樹的基本概念 2、二叉查詢樹的查詢操作 3、二叉查詢樹的插

資料結構演算法題目集7-23——還原叉樹

我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原題連結:https://pintia.cn/problem-sets/15/problems/838 題目描述:

資料結構演算法)-線性表單鏈表順序儲存和鏈式儲存

前言:前面已經介紹過資料結構和演算法的基本概念,下面就開始總結一下資料結構中邏輯結構下的分支——線性結構線性表 一、簡介 1、線性表定義   線性表(List):由零個或多個數據元素組成的有限序列;   這裡有需要注意的幾個關鍵地方:     1.首先他是一個序列,也就是說元素之間是有個先來後到的。

資料結構演算法設計》實驗報告書叉樹的基本操作實現及其應用

《資料結構與演算法設計》實驗報告書之二叉樹的基本操作實現及其應用 實驗專案 二叉樹的基本操作實現及其應用 實驗目的 1.熟悉二叉樹結點的結構和對二叉樹的基本操作。 2.掌握對二叉樹每一種操作的具體實現。 3.學會利用遞迴方法編寫對二叉樹這種遞迴資料結構進行處理的演算法。 4.會用二叉

noip資料結構演算法 基礎小演算法 4 維差值維護

noip資料結構與演算法 之 基礎小演算法 4 二維差值維護 二維差值維護問題實際上是對一維差值維護問題的擴充套件,相信來看二維差值維護的各位都已經對一維差值維護問題有足夠的認識了。下面先看一下二維差值維護的問題。  問題描述: 已知一個n*n的矩陣a,有m次操作,每次

python程式設計篇資料結構演算法(十)

搜尋 搜尋是在一個專案集合中找到一個特定專案的演算法過程。搜尋通常的答案是真的或假的,因為該專案是否存在。 搜尋的幾種常見方法:順序查詢、二分法查詢、二叉樹查詢、雜湊查詢 二分法查詢 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待