1. 程式人生 > >Unity3D面試中長問到的資料結構

Unity3D面試中長問到的資料結構

不只是Unity3D中會問到,只要學習程式設計,這也是最基本的,經過網上的整理與實驗,現在我來總結一下總結一下資料結構

1.幾種常見的資料結構

這裡主要總結下Unity3D_King在工作中常碰到的幾種資料結構:Array,ArrayList,List<T>,LinkedList<T>,Queue<T>,Stack<T>,Dictionary<K,T>

陣列Array:

陣列是最簡單的資料結構。其具有如下特點:

  1. 陣列儲存在連續的記憶體上。
  2. 陣列的內容都是相同型別。
  3. 陣列可以直接通過下標訪問。

陣列Array的建立:

1 int size = 5
; 2 int[] test = new int[size];

建立一個新的陣列時將在 CLR託管堆 中分配一塊連續的記憶體空間,來盛放數量為size ,型別為所宣告型別的陣列元素。如果型別為 值型別, 則將會有 size 個 未封箱 的 該型別的值被建立。如果型別 引用型別, 則將會有 size個相應型別的 引用 被建立。

由於是在連續記憶體上儲存的,所以它的索引速度非常快,訪問一個元素的時間是恆定的也就是說與陣列的元素數量無關,而且賦值與修改元素也很簡單。

string[] test2 = new string[3];
//賦值
test2[0] = "Unity";
test2[1] = "
j"; test2[2] = "d"; //修改 test2[0] = "Unity3D_King";

但是有優點,那麼就一定會伴隨著缺點。由於是連續儲存,所以在兩個元素之間插入新的元素就變得不方便。而且就像上面的程式碼所顯示的那樣,宣告一個新的陣列時, 必須 指定其長度,這就會存在一個潛在的問題,那就是當我們宣告的長度過長時,顯然會浪費記憶體,當我們宣告長度過短的時候,則面臨這溢位的風險。這就使得寫程式碼像是投機,小匹夫很厭惡這樣的行為!針對這種缺點,下面隆重推出ArrayList。

ArrayList:

為了解決陣列建立時必須指定長度以及只能存放相同型別的缺點而推出的資料結構。ArrayList是System.Collections名稱空間下的一部分,所以若要使用則必須引入System.Collections。正如上文所說,ArrayList解決了陣列的一些缺點。

  1. 不必在宣告ArrayList時指定它的長度,這是由於ArrayList物件的長度是按照其中儲存的資料來動態增長與縮減的。
  2. ArrayList可以儲存不同型別的元素。這是由於ArrayList會把它的元素都當做Object來處理。因而,加入不同型別的元素是允許的。

ArrayList的操作:

ArrayList test3 = new ArrayList();
//新增資料
test3.Add("Unity");
test3.Add("j");
test3.Add("d");
test3.Add("Unity3D_King");
test3.Add(Unity1);
//修改資料
test3[4] = 26;
//刪除資料
test3.RemoveAt(4);

說了那麼一堆”優點“,也該說說缺點了吧。為什麼要給”優點”打上引號呢?那是因為ArrayList可以儲存不同型別資料的原因是由於把所有的型別都當做Object來做處理,也就是說ArrayList的元素其實都是Object型別的,辣麼問題就來了。

  1. ArrayList 不是型別安全的 。因為把不同的型別都當做Object來做處理,很有可能會在使用ArrayList時發生型別不匹配的情況。
  2. 如上文所訴,陣列儲存值型別時並未發生裝箱,但是ArrayList由於把所有型別都當做了Object,所以不可避免的當插入 值型別會發生裝箱 操作,在索引取值時會發生拆箱操作。這能忍嗎?

注:為何說頻繁的沒有必要的裝箱和拆箱不能忍呢?且聽Unity3D_King慢慢道來:所謂 裝箱 (boxing):就是值型別例項到物件的轉換 ( 百度百科 )。那麼 拆箱:就是將引用型別轉換為值型別 咯( 還是來自百度百科)。下面舉個子~

//裝箱,將String型別的值FanyoyChenjd賦值給物件。
String  info = ”FanyoyZhengjd”;  
object obj=(object)info;  

//拆箱,從Obj中提取值給info
object obj = "FanyoyChenjd";
String info = (String)obj;

那麼結論呢?好吧,請允許Unity3D很low再次引用百度百科。 顯然,從原理上可以看出,裝箱時,生成的是全新的引用物件,這會有時間損耗,也就是造成效率降低。

List<T>泛型List

為了解決ArrayList不安全型別與裝箱拆箱的缺點,所以出現了泛型的概念,作為一種新的陣列型別引入。也是工作中經常用到的陣列型別。和ArrayList很相似,長度都可以靈活的改變,最大的不同在於在宣告List集合時,我們同時需要為其宣告List集合內資料的物件型別,這點又和Array很相似,其實List<T>內部使用了Array來實現。

List<string> test4 = new List<string>();  
  
//新增資料  
test4.Add(“Fanyoy”);  
test4.Add(“Chenjd”);  

//修改資料  
test4[1] = “murongxiaopifu”;  
  
//移除資料  
test4.RemoveAt(0);

這麼做最大的好處就是

  1. 即確保了 型別安全
  2. 取消了裝箱和拆箱 的操作。
  3. 它融合了Array可以快速訪問的優點以及ArrayList長度可以靈活變化的優點。

LinkedList<T>

也就是連結串列了。和上述的陣列最大的不同之處就是在於連結串列在記憶體儲存的排序上可能是不連續的。這是由於連結串列是通過上一個元素指向下一個元素來排列的,所以可能不能通過下標來訪問。如圖

既然連結串列最大的特點就是儲存在記憶體的空間不一定連續,那麼連結串列相對於陣列最大優勢和劣勢就顯而易見了。

  1. 向連結串列中插入或刪除節點無需調整結構的容量。因為本身不是連續儲存而是靠各物件的指標所決定,所以新增元素和刪除元素都要比陣列要有優勢。
  2. 連結串列適合在需要有序的排序的情境下增加新的元素,這裡還拿陣列做對比,例如要在陣列中間某個位置增加新的元素,則可能需要移動移動很多元素,而對於連結串列而言可能只是若干元素的指向發生變化而已。
  3. 有優點就有缺點,由於其在記憶體空間中不一定是連續排列,所以訪問時候無法利用下標,而是必須從頭結點開始,逐次遍歷下一個節點直到尋找到目標。所以當需要快速訪問物件時,陣列無疑更有優勢。

綜上,連結串列適合 元素數量不固定 ,需要 經常增減節點 的情況。

關於連結串列的使用,MSDN上有詳細的 例子。

Queue<T>

在Queue<T>這種資料結構中,最先插入在元素將是最先被刪除;反之最後插入的元素將最後被刪除,因此佇列又稱為“先進先出”(FIFO—first in first out)的線性表。通過使用Enqueue和Dequeue這兩個方法來實現對 Queue<T> 的存取。

一些需要注意的地方:

  1. 先進先出的情景。
  2. 預設情況下,Queue<T>的初始容量為32, 增長因子為2.0。
  3. 當使用Enqueue時,會判斷佇列的長度是否足夠,若不足,則依據增長因子來增加容量,例如當為初始的2.0時,則佇列容量增長2倍。
  4. 乏善可陳。

關於Queue<T>的使用方法,MSDN上也有相應的 例子 。

Stack<T>

與Queue<T>相對,當需要使用後進先出順序(LIFO)的資料結構時,我們就需要用到Stack<T>了。

一些需要注意的地方:

  1. 後進先出的情景。
  2. 預設容量為10。
  3. 使用pop和push來操作。
  4. 乏善可陳。

同樣,在 這裡你也可以看到大量Stack<T>的例子。

Dictionary<K,T>

字典這東西,Unity3D遊戲中經常用到,建立一個字典之後就可以往裡面扔東西,增加、刪除、訪問那叫一個快字了得。但是,有好就有壞,那麼字典背後到底隱藏著什麼迷霧,撥開重重迷霧之後,是否才是真相?且聽下回分。。。等等,應該是下面就讓我們來分析一下字典吧。

提到字典就不得不說Hashtable雜湊表以及Hashing(雜湊,也有叫雜湊的),因為字典的實現方式就是雜湊表的實現方式,只不過 字典是型別安全的 ,也就是說當建立字典時,必須宣告key和item的型別,這是 第一條 字典與雜湊表的 區別 。關於雜湊表的內容推薦看下這篇部落格 雜湊表 。關於 雜湊 ,簡單的說就是一種將任意長度的訊息壓縮到某一固定長度,比如某學校的學生學號範圍從00000~99999,總共5位數字,若每個數字都對應一個索引的話,那麼就是100000個索引,但是如果我們使用後3位作為索引,那麼索引的範圍就變成了000~999了,當然會衝突的情況,這種情況就是 雜湊衝突(Hash Collisions) 了。扯遠了,關於具體的實現原理還是去看小匹夫推薦的那篇部落格吧,當然那篇部落格上面那個大大的轉字也是蠻刺眼的。。。

回到Dictionary<K,T>,我們在對字典的操作中各種時間上的優勢都享受到了,那麼它的劣勢到底在哪呢?對嘞,就是空間。以空間換時間,通過更多的記憶體開銷來滿足我們對速度的追求。在建立字典時,我們可以傳入一個容量值,但實際使用的容量並非該值。而是使用 “不小於該值的最小質數來作為它使用的實際容量,最小是3。”(老趙), 當有了實際容量之後,並非直接實現索引,而是通過建立額外的2個數組來實現間接的索引,即int[] buckets和Entry[] entries兩個陣列(即buckets中儲存的其實是entries陣列的下標),這裡就是 第二條 字典與雜湊表的 區別, 還記得 雜湊衝突 嗎?對,第二個區別就是 處理雜湊衝突的策略是不同的 !字典會採用額外的資料結構來處理雜湊衝突,這就是剛才提到的陣列之一buckets桶了,buckets的長度就是字典的真實長度,因為buckets就是字典每個位置的對映,然後buckets中的每個元素都是一個連結串列,用來儲存相同雜湊的元素,然後再分配儲存空間。

因此,我們面臨的情況就是,即便我們新建了一個空的字典,那麼伴隨而來的是2個長度為3的陣列。所以當處理的資料不多時,還是慎重使用字典為好,很多情況下使用陣列也是可以接受的。

2.幾種常見資料結構的使用情景

Array

需要處理的元素數量確定並且需要使用下標時可以考慮,不過建議使用List<T>

ArrayList

不推薦使用,建議用List<T>

List<T>泛型List

需要處理的元素數量不確定時 通常建議使用

LinkedList<T>

連結串列適合元素數量不固定,需要經常增減節點的情況,2端都可以增減

Queue<T>

先進先出的情況

Stack<T>

後進先出的情況

Dictionary<K,T>

需要鍵值對,快速操作

相關推薦

Unity3D面試中長到的資料結構

不只是Unity3D中會問到,只要學習程式設計,這也是最基本的,經過網上的整理與實驗,現在我來總結一下總結一下資料結構 1.幾種常見的資料結構 這裡主要總結下Unity3D_King在工作中常碰到的幾種資料結構:Array,ArrayList,List<T>,

面試複習重點——資料結構、作業系統、計算機網路、資料庫

必看書籍:劍指offer、程式設計師面試寶典 來自:騰訊、搜狐、網易、烽火、百度、大眾點評、美團、風行 1. 死鎖是什麼?什麼情況下產生?怎麼解決? 2. 設計模式(尤其是單例模式,要會寫該模式的程式框架,要注意同步問題

LeetCode難度、面試頻率、資料結構、演算法一覽表

Fightingヾ(๑╹◡╹)ノ"   ID Question Diff(1~5) Freq(1~5) Data Structure Algorithms  

Java面試--面試中的資料結構問題

面試中的資料結構問題 資料結構分類: 列表 型---1.陣列  2.連結串列  3.佇列  4.棧 陣列【詳解】 開闢一片連續的空間,將元素依次放入其中; 陣列的好處:可以進行隨機訪問,只需要一個下標就可以訪問到該元素;但插入和刪除會比較耗費時間,插入和刪除操作都需

面試複習之資料結構

第一章 緒論 1.1 框架 資料結構: 基本概念(資料、元素、物件和ADT) 邏輯結構(集合、線性、樹形和圖形) 儲存結構(順序、鏈式、索引和雜湊) 演算法: 基本概念:演算法、特性和評價 演算法分析:時間和空間複雜度 1.2 大綱知識

面試常考資料結構演算法總結

e最近開始投各種技術類的崗位,於是乎覺得必須補一下之前的資料結構演算法知識了,因為真的很重要!幾乎每家面試都會問到其中的幾個演算法。本文部分演算法是從其他大神博主那邊搬運的,大家可以搜尋相關演算法檢視其他大神的解說和思路~~~~ 穩定性:排序演算法是否穩定,根

Unity3D中常用的資料結構總結與分析

來到週末,小匹夫終於有精力和時間來更新下部落格了。前段時間小匹夫讀過一份程式碼,對其中各種資料結構靈活的使用讚不絕口,同時也大大激發了小匹夫對各種資料結構進行梳理和總結的慾望。正好最近也拜讀了若干大神的文章,覺得總結下常用的資料結構以供自己也能靈活的使用變得刻不容緩。那麼還是從小匹夫的工作內容入手,就談談在平

為什麼很多大公司都面試演算法和資料結構

參加過大公司的招聘,尤其是校園招聘的同學,很容易發現:很多大公司,都喜歡面試演算法和資料結構。   以前,我對這個問題有點思考。最近,有個小雷粉,特意問到了這個問題。so,簡單說幾句,吐槽樂一樂。   1.我首先想吐槽的,這絕對是大公司裝逼的一個直接體現。    通過出很

筆試面試常考資料結構紅黑樹性質總結

紅黑樹 一、定義 紅黑樹是一種特定型別的二叉樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。它是在1972年由RudolfBayer發明的,他稱之為"對稱二叉B樹",它現代的名字是在LeoJ.Guibas和RobertSedgewick於1978年寫的一篇論

阿里面試90%以上會到的資料結構;HashMap

BAT面試必問; 關於hashmap,你知道多少?你知道hashmap的工作原理嗎? 1.該問題很有深度 2.能答出多少決定崗位和薪資. 3.問題的方式多種多樣 一.首先我們瞭解下HashMap是什麼 HashMap是Java常用的用來儲存鍵值對的資料結構,它是執行緒不安全的

面試Java被到Redis資料結構的幾個面試題

Redis資料結構的面試題答案下面幾乎可以涵蓋。時間複雜度的話去官網看下,每個命令的時間複雜度官網都給出了。1、Redis的五種資料型別字串string:字串型別是Redis中最為基礎的資料儲存型別,是一個由位元組組成的序列,他在Redis中是二進位制安全的,這便意味著該型別可以接受任何格式的資料,如JPEG

資料結構與集合篇一些常用的資料結構和集合 面試部分(一)

java有8種之多,但是不用害怕事實上常用的資料結構也就那麼幾種, 常用的也就是雜湊表,向量,Properties,集合框架,棧(關於資料結構,我寫的不是很細,因為最近小編在準備求職,等小編有空會準備詳細程式碼來進行講解) 棧 在面試中棧經常與佇列一起出題。 棧/佇列 線

HashMap面試資料結構相關知識總結

  如果在看這篇文章時,對HashMap的結構還不是很瞭解,建議你參考前段時間寫的《刨死你係列——HashMap剖析(基於jdk1.8)》,可能會對下面的提及到知識點有些幫助。 1:HashMap 的資料結構? A:雜湊表結構(連結串列雜湊:陣列+連結串列)實現,結合陣列和連結串列的優點。當連結串列長度超過&

資料結構演算法常見面試考題

(1) 紅黑樹的瞭解(平衡樹,二叉搜尋樹),使用場景 把資料結構上幾種樹集中的討論一下: 1.AVLtree 定義:最先發明的自平衡二叉查詢樹。在AVL樹中任何節點的兩個子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加

面試題目彙總(JAVA演算法/資料結構)

1.題目:輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。   程式碼:     import java.util.Arr

java面試-資料結構和演算法

1.排序 1.1 氣泡排序 package sort; /** * Created by david on 2018/8/16 * 氣泡排序 */ public class BubbleSort { private static int[] bubbleSort(int

2018年面試資料面試資料結構總結

目錄 資料結構的定義 資料結構的分類 邏輯結構分類 物理結構分類 相關概念 時間複雜度 hash hash衝突 Java中的陣列結構 線性表 ArrayList LinkedList 連結串列 Java中的實現 Vector 棧和佇列

整理I 精選微軟等公司資料結構+演算法面試100題 第1-40題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

整理III 微軟等資料結構+演算法面試100題 最新第61-80題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

關於本微軟等公司資料結構+演算法面試100題系列的鄭重宣告

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!