在 Swift 中,字典(Dictionary
)是一種高效的鍵值對集合猴蹂,基于哈希表實(shí)現(xiàn)院溺。以下是字典的原理和存儲方式的詳細(xì)說明:
1. 字典的原理
字典的核心是哈希表,通過哈希函數(shù)將鍵映射到存儲位置磅轻。具體原理如下:
1.1 哈希函數(shù)
- 每個(gè)鍵通過哈希函數(shù)計(jì)算出一個(gè)哈希值(
hashValue
)珍逸,用于確定存儲位置。 - Swift 的標(biāo)準(zhǔn)庫為大多數(shù)類型(如
String
聋溜、Int
等)提供了默認(rèn)的哈希函數(shù)谆膳。
1.2 哈希表
- 哈希表是一個(gè)數(shù)組钳枕,數(shù)組的每個(gè)元素稱為“桶”(bucket)拴疤,用于存儲鍵值對此叠。
- 哈希值通過取模運(yùn)算映射到數(shù)組的索引,確定鍵值對的存儲位置凝化。
1.3 沖突解決
- 當(dāng)兩個(gè)鍵的哈希值映射到同一個(gè)桶時(shí),會(huì)發(fā)生哈希沖突法希。
- Swift 使用開放尋址法(Open Addressing)解決沖突:
- 如果目標(biāo)桶已被占用悠反,會(huì)線性探測下一個(gè)空閑桶。
- 如果哈希表接近滿載睦尽,會(huì)觸發(fā)擴(kuò)容(rehashing)器净,重新分配更大的存儲空間并重新計(jì)算哈希值。
2. 存儲地址是否連續(xù)当凡?
字典的存儲地址不一定是連續(xù)的山害,原因如下:
2.1 哈希表的存儲結(jié)構(gòu)
- 哈希表是一個(gè)數(shù)組,數(shù)組的存儲是連續(xù)的沿量。
- 但由于哈希沖突和開放尋址法浪慌,鍵值對的實(shí)際存儲位置可能分散在數(shù)組的不同位置。
2.2 動(dòng)態(tài)擴(kuò)容
- 當(dāng)哈希表的負(fù)載因子(已用桶的比例)超過閾值時(shí)朴则,會(huì)觸發(fā)擴(kuò)容权纤。
- 擴(kuò)容會(huì)分配一個(gè)更大的數(shù)組,并將原有鍵值對重新哈希到新數(shù)組中乌妒,導(dǎo)致存儲地址不連續(xù)汹想。
2.3 內(nèi)存管理
- Swift 的字典使用堆內(nèi)存(Heap Memory)存儲鍵值對,堆內(nèi)存的分配不保證連續(xù)性撤蚊。
3. 字典的性能
- 查找古掏、插入、刪除操作的平均時(shí)間復(fù)雜度為 O(1)侦啸,因?yàn)楣1硗ㄟ^哈希值直接定位存儲位置槽唾。
- 最壞情況下(如大量哈希沖突),時(shí)間復(fù)雜度可能退化為 O(n)光涂。
4. Swift 字典的特點(diǎn)
- 類型安全:鍵和值的類型在聲明時(shí)確定庞萍,不能插入類型不匹配的數(shù)據(jù)。
- 值類型:字典是值類型忘闻,賦值或傳遞時(shí)會(huì)拷貝數(shù)據(jù)(寫時(shí)復(fù)制優(yōu)化)钝计。
- 動(dòng)態(tài)擴(kuò)容:字典會(huì)根據(jù)元素?cái)?shù)量自動(dòng)調(diào)整存儲空間。
5. 示例代碼
var dict = [String: Int]()
dict["apple"] = 10
dict["banana"] = 20
print(dict["apple"]) // 輸出: Optional(10)
print(dict["grape"]) // 輸出: nil
總結(jié)
- Swift 字典基于哈希表實(shí)現(xiàn)齐佳,存儲地址不一定是連續(xù)的葵蒂。
- 哈希表通過哈希函數(shù)和開放尋址法解決沖突,支持高效的查找重虑、插入和刪除操作践付。
- 字典是值類型,具有類型安全和動(dòng)態(tài)擴(kuò)容的特性缺厉。