前言
今天上午和往常一樣在網上沖浪,看到碼甲哥微信群里面在聊一個面試題,比較有意思,這里簡單分享下結論中的Dictionary字典。
有50w個int類型的數字,現在需要判斷一下里面是否存在重復的數字,請簡要說明下。
假如這個題目讓我做,第一感覺可能直接向兩個for循環,簡單做個判斷就解決了。可是看到幾個大佬的討論,才發現是我知識淺薄了。
這道題難道考的就是對業務代碼循環的應用嗎?肯定不是的。
我們知道,在驗證一段代碼或者一個程序算法的完美指標是空間復雜度和時間復雜度。通過這兩個指標來進行評判。
空間復雜度:
是指在一個算法程序在執行過程中,單位時間內臨時所占用的存儲容量是多少。用S(n)=O(f(n))來表示。
時間復雜度:
是指在一個算法程序執行過程中,所需要花費的時間多少。
一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數,記作T(n)=O(f(n)),稱為O(f(n))為算法的時間復雜度。
比如插入排序的時間復雜度是O(n^2),空間復雜度是O(1)。
一個算法的優劣主要從算法的執行時間和所需要占用的存儲空間兩個方面衡量。
群里面討論的過程中,出現有數組array,鍵值對,還有數據字典Dictionary(鍵值對的一種)。最后都覺得使用Dictionary存儲這50w個int類型的數據,利用其key或者value來判斷是否有重復的值。
既然看到這里了,今天咱也就簡單復習下Dictionary,看看它到底有什么魅力。
Dictionary<TKey,TValue>字典
根據MSDN上的記載,說它是表示鍵和值的集合。提供一組鍵到一組值的映射。每次對字典的添加都包含一個值和與其關聯的鍵。使用其鍵檢索值的速度非常快,接近O(1)。
Dictionary<TKey,TValue>該類是作為哈希表實現的,檢索的速度取決於為指定的類型的哈希算法的質量TKey。
其余特性簡單總結如下
- 必須包含命名空間System.Collection.Generic
- Dictionary里面的每一個元素都是一個鍵值對
- 鍵必須是唯一的,而值不需要唯一
- 鍵和值都可以是任何類型
- 通過一個鍵讀取一個值的時間復雜度接近O(1),查找速度非常快,要比list等快很多
- 鍵值對之間的偏序可以不定義
- 可以實現通過鍵值查找、插入、刪除一個鍵值對的操作,這些如果用數組實現非常麻煩
下面是關於Dictionary的一些CRUD操作。
定義字典、添加鍵值、取值、改值、遍歷key、遍歷value、刪除元素、清空所有元素
//定義
static Dictionary<int, string> ahuiInfo = new Dictionary<int, string>();
static void Main(string[] args)
{
//添加鍵值
ahuiInfo.Add(1,"阿輝");
ahuiInfo.Add(2, "阿酶");
ahuiInfo[2] = "阿一"
//取值
var name=ahuiInfo[0].ToString();
Console.WriteLine(""+name
//修改值
ahuiInfo[0] = "阿姨";
Console.WriteLine("" + ahuiInfo[0].ToString()
//遍歷key和value
foreach (var key in ahuiInfo.Keys)
{
Console.WriteLine(""+key.ToString());
foreach (var value in ahuiInfo.Values)
{
Console.WriteLine(" "+value.ToString());
//遍歷字典
foreach(KeyValuePair<int ,string> kvp in ahuiInfo)
{
Console.WriteLine("key="+kvp.Key+",value="+kvp.Value);
//刪除元素
ahuiInfo.Remove(0
//判斷鍵是否存在
if (ahuiInfo.ContainsKey(0))
{
Console.WriteLine("true");
}
else
{
Console.WriteLine("false");
}
}
}
寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看得見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。