1. 程式人生 > >【數據結構】第二章小結

【數據結構】第二章小結

c++標準庫 文件 nba 隨機 想要 輔助 指向 例如 this

ps:第一次用博客園寫,記錄第一次

一、數據結構第二章主要為:順序表和鏈表的構造及其增刪查改的一些基本操作,以及粗略計算它們的時間or空間的復雜度。

1、順序表:

(1) 特點:邏輯結構上相鄰,物理存儲上也是相鄰的,屬於隨機存儲;

(2) 優點:便於使用下標進行查找,例如:查找某數組的第6項的數據是幾;

存儲密度為1;

(3) 缺點:由於其物理存儲相鄰,故無法將空間中零零散散的碎片空間利用起來;

2、鏈表:

(1) 特點:邏輯結構上相鄰,物理存儲上不一定相鄰的,屬於順序存儲;

單鏈表有頭指針指向;

含頭結點的空表:L->next=NULL//(頭結點的指針域為空)

無頭結點的空表:L==NULL//(L為單鏈表的頭指針)

(2) 優點:可以充分利用碎片空間;

可以便於增刪--改變指針的指向;

(3) 缺點:存儲密度小於1;

需要為指針騰出空間;

3、鏈表vs順序表:

(1)在增刪工作為主的問題中,主要使用鏈表,時間復雜度較低;

(2)在查詢工作中,且使用下標查詢為主的問題中,使用順序表為好;

(3)時間復雜度:

順序表:

取值算法:O(1) 、 查找算法:O(n)、增加or刪除算法:O(n)

空間復雜度S(n)=O(1) 均沒有占用輔助空間;

鏈表:

取值算法:O(n)、查找算法:O(n)、增加or刪除算法:O(n)

空間復雜度S(n)=O(1) 均沒有占用輔助空間;

二、做題過程中遇到的其他問題

1、心理上:上個學期c++打題過少,對於使用一些函數,指針類型的代碼充滿恐懼與抗拒,甚至於數組都有那麽一點

2、現實中:書本給的代碼不夠詳細,得自己上網搜代碼

3、題目上:【1】new運算符的應用:

(1)、開辟單變量地址空間

指針在初始化時需要動態申請空間 int*a=new int [空間大小] 等同於int*a; a = new int [空間大小],

例如:int *a = new int(5) 作用同上,但是同時將整數賦值為5;

(2)、開辟數組空間

要訪問new所開辟的結構體空間,無法直接通過變量名進行,只能通過賦值的指針進行訪問。

(3)、C++中使用new的註意事項:

1、、用戶是無法主動調用構造函數的,所以需要借助placement new,但是用戶可以主動調用析構函數,所以用完這些對象後,調用析構函數,然後用對應分配內存的方法去釋放內存。

2、、事實上malloc並不一定比operatornew節省多少時間,用placement new常常是為了考慮性能,所以會配合內存池一起使用。 (ps: 內存池(Memory Pool)是一種內存分配方式。通常我們習慣直接使用new、malloc等API申請分配內存,這樣做的缺點在於:由於所申請內存塊的大小不定,當頻繁使用時會造成大量的內存碎片並進而降低性能。)

補充:malloc的全稱是memory allocation,中文叫動態內存分配,用於申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。

3、、new與malloc、operator new、placement new 的區別:

從本質上來說,malloc(Linux上具體實現可以參考man malloc,glibc通過brk()&mmap()實現)是libc裏面實現的一個函數,如果在source code中沒有直接或者間接include過stdlib.h,那麽gcc就會報出error:‘malloc’ was not declared in this scope。如果生成了目標文件(假定動態鏈接malloc),如果運行平臺上沒有libc(Linux平臺,手動指定LD_LIBRARY_PATH到一個空目錄即可),或者libc中沒有malloc函數,那麽會在運行時(Run-time)出錯。new則不然,是c++的關鍵字,它本身不是函數。new不依賴於頭文件,c++編譯器就可以把new編譯成目標代碼(g++4.6.3會向目標中插入_Znwm這個函數,另外,編譯器還會根據參數的類型,插入相應的構造函數)。

在使用上,malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。第一、malloc 函數返回的是 void * 類型。第二、函數的實參為 sizeof(int) ,用於指明一個整型數據需要的大小。

.......

(此後省略,直接放網址,因為發現越查越深入,待以後化成自己知識的時候再寫幾篇關於這些函數不同的博客)

參考資料來源:https://zhidao.baidu.com/question/393285989.html(new的運算符的作用)

https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B1%A0/8577153?fr=aladdin(內存池)

https://baike.baidu.com/item/malloc%E5%87%BD%E6%95%B0/8582146?fr=aladdin(malloc函數(含有其與new的區別))

https://blog.csdn.net/caimagic/article/details/51493741(operator new與new的區別)

https://blog.csdn.net/songchuwang1868/article/details/81353577(較為簡單的解釋了一下其區別:new、operator new、::new、placement new)

【2】關於sort函數的應用及其compare函數的機制:

1、、sort的定義:用於C++中,對給定區間所有元素進行排序。頭文件是#include <algorithm>

2、、

Sort函數包含在頭文件為#include<algorithm>的c++標準庫中 Sort函數有三個參數: (1)第一個是要排序的數組的起始地址。 (2)第二個是結束的地址(最後一位要排序的地址的下一地址) (3)第三個參數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個參數,此時默認的排序方法是從小到大排序。 ps:如果要改變排序方法:需要加入一個比較函數compare(),如: bool compare(int a,int b) { return a>b; } 參考資料:https://baike.baidu.com/item/sort%E5%87%BD%E6%95%B0/11042699?fr=aladdin

https://www.cnblogs.com/argenbarbie/p/5266603.html

三、接下來

當然是好好的打代碼,與同學多多交流

【數據結構】第二章小結