陣列是phper最常用的資料型別,同時php容易上手也得益於其強大的陣列,但是陣列在php中是如何實現的呢?
首先,我們還是先了解下相關的資料結構,為下面的內容打好基礎
雜湊表
雜湊表,顧名思義,即將不同的關鍵字對映到不同單元的一種資料結構。而將不同關鍵字對映到不同單元的方法就叫做雜湊函式
理想情況下,經過雜湊函式處理,關鍵字和單元是會進行一一對應的;但是如果關鍵字值足夠多的情況下,就容易出現多個關鍵字對映到同一單元的情況,即出現雜湊衝突
雜湊衝突的解決方案,要麼使用鏈結法,要麼使用開放定址法
鏈結法
即當不同的關鍵字對映到同一單元時,在同一單元內使用鍊錶來儲存這些關鍵字
開放定址法
即當插入資料時,如果發現關鍵字被對映到的單元存在資料了,說明發生了衝突,就繼續尋找下乙個單元,直到找到可用單元為止
而因為開放定址法方案屬於占用其他關鍵字對映單元的位置,所以後續的關鍵字更容易出現雜湊衝突,因此容易出現效能下降
鍊錶
既然上面提到了鍊錶,這裡我們簡單聊一下鍊錶的基礎知識。鍊錶分為很多種型別,常用的資料結構包括:佇列,棧,雙向鍊錶等
對於資料結構的內容,我們不過多展開,我們之後會有專門的內容去詳細介紹資料結構
php陣列
php解決雜湊衝突的方式是使用了鏈結法,所以php陣列是由雜湊表+鍊錶實現,準確來說,是由雜湊表+雙向鍊錶實現。
內部結構-雜湊表
hashtable結構體主要用來存放雜湊表的基本資訊
typedef struct _hashtable hashtable;
bucket結構體則用於儲存資料的具體內容
typedef struct bucket bucket;
其中bucket結構體內有指向使用者資料的pdata元素,其實是指向了之前我們介紹的變數zval結構體,這也是為什麼當建立陣列時,會出現陣列元素+1的變數容器。
雜湊表內部結構關係圖
從上圖我們可以看出,bucket在存放資料的時候,如果存在雜湊衝突,則將多個關鍵字對映到鍊錶中,由此組成了雙向鍊錶
LRU 雙向鍊錶 雜湊表 python
通過雙向鍊錶和雜湊表的結合實現lru class node def init self,key 0,value 0 self.key key self.value value self.next none self.pre none class solution def init self,max ...
mysql儲存結構雙向鍊錶 PHP實現雙向鍊錶 棧
這次再來分享一下實現雙向鍊錶和棧的實現。雖然是以前寫的了,但是發現php寫的這些 很容易看懂!雙向鍊錶 classhero elseelse if cur next no hero no cur cur next if i ist hero pre cur if cur next null cur ...
雙向鍊錶實現
template class link link link pre null,link ne null void operator new size t void operator delete void ptr template link link freelist null template v...