C++基礎知識

1.vector、list和map三者的區別?

2. 淺拷貝和深拷貝的區別?

3. 什麼是哈希表?產生衝突瞭如何解決?

4. 什麼是深度優先,什麼是廣度優先?

一.vector、list和map三者有何區別?

(1) vector擁有一段連續的內存空間,並且起始地址不變,對隨機存取有非常好的支持,但是在中間進行插入和刪除的時候需要拷貝內存空間,會影響效率.

vector適用:對象數量變化少,對象簡單,隨機訪問元素頻繁

(2) list 是數據結構中的雙向鏈表,其空間是可以不連續的,通常通過指針來訪問數據,不能對內部原始進行隨機訪問,佔的內存會比較多.....但是由於鏈表的特點,則對於插入和刪除操作會比較方便和高效. 對元素的拷貝時開銷較大,因爲拷貝時會調用拷貝構造函數.

list適用:對象數量變化大,對象複雜,插入和刪除頻繁

(3) map 和set 屬於標準的關聯容器,使用了紅黑樹,其插入排序比其他序列容器的效率高, 因爲其不需要對內存做拷貝和移動,而是只需要替換指針就可以.

set 和map的區別是: set只含有關鍵字key, 而map中有一個關鍵字key和其對應的value,總共2個元素.

其中map 和hash_map的區別是: hash_map中使用了Hash算法來加速查找的過程,但是需要更多的內存來存放這些hash桶元素,就是利用空間來換取時間的策略.

二. 淺拷貝和深拷貝的區別?

如果B複製了A,然後修改A的時候,看B是否變化:

如果B改變了, 說明就是淺拷貝.(修改內存中的同一個值)..淺拷貝只是在內存中增加一個指針指向已經存在的內存地址,一般來說,拷貝構造函數可以完成對對象數據成員的簡單複製.

如果B沒有改變,說明是深拷貝.(修改堆內存中的不同值)..深拷貝增加了一個指針並且申請了新的內存,並且使這個增加的指針指向這個新的內存,然後對拷貝對象進行逐位複製,數據相對安全... 使用深拷貝時, 釋放內存的時候不會因爲出現淺拷貝時釋放同一個內存的問題.

淺拷貝只是對指針的拷貝,拷貝後兩個指針指向同一個內存空間,深拷貝不但對指針進行拷貝,而且對指針指向的內容進行拷貝,經深拷貝後的指針是指向兩個不同地址的指針

三. 什麼是哈希表?產生衝突瞭如何解決?

哈希表包含一個數組,通過特殊的關鍵字(key)來訪問數組中的元素,

哈希表解決哈希衝突的方法: 開放定址法,再哈希法,鏈地址法

開放定址法: 當關鍵字key的哈希地址出現衝突時,以P爲基礎,產生另一個哈希地址P1,如果p1仍然衝突,則再以P爲基礎,再產生一個新的地址p2,....直到找到不衝突的哈希地址,然後將元素存在其中.有一個通用的再散列形式:

 Hi=(H(key)+di)% m   i=1,2,…,n. 其中H(key)爲哈希函數,m 爲表長,di稱爲增量序列。增量序列的取值方式不同,相應的再散列方式也不同。

再哈希法:這種方法是同時構造多個不同的哈希函數: Hi=RH1(key)  i=1,2,…,k
         當哈希地址Hi=RH1(key)發生衝突時,再計算Hi=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

鏈地址法:將產生衝突的記錄存在一個鏈表中,哈希表中存放的是該鏈表的表頭.(比較適合進行插入和刪除)

四. 什麼是深度優先,什麼是廣度優先?

深度優先依靠的是遞歸地解決問題,採用的結構來解決,主要的搜索路徑是從一個頂點開始,沿着一條路一直走到底,如果發現不能到達目標,就返回到上一個節點,然後從另一條路開始走到底,儘可能地往深處走.

廣度優先 依賴於隊列 來解決問題, 其搜索路徑是從一個頂點v出發,在訪問了v之後依次訪問v的各個未曾訪問過的鄰接點,然後分別從這些鄰接點出發依次訪問它們的鄰接點,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。如果此時圖中尚有頂點未被訪問,則需要另選一個未曾被訪問過的頂點作爲新的起始點,重複上述過程,直至圖中所有頂點都被訪問到爲止.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章