可以自己去實現(xiàn)這幾個數(shù)據(jù)結(jié)構(gòu)類型,來提高自己的編程能力。
接觸堆數(shù)據(jù)結(jié)構(gòu)是在排序里面講的,空間復雜度O(1),時間復雜度O(NlogN),但是在實踐中還是不如快速排序(好像快速排序可以更好的利用硬件特性)。堆的意義就在于:最快的找到最大/最小值,在堆結(jié)構(gòu)中插入一個值重新構(gòu)造堆結(jié)構(gòu),取走最大/最下值后重新構(gòu)造堆結(jié)構(gòu) 其時間復雜度為O(logN),而其他方法最少為O(N).堆實踐中用途不在于排序,其主要用在調(diào)度算法中,比如優(yōu)先級調(diào)度,每次取優(yōu)先級最高的,時間驅(qū)動,取時間最小/等待最長的 等等 ,分為最大堆/最小堆。
哈希表主要可以在O(1)時間內(nèi)對查找對象定位,但是事實上,如果輸入集合不確定的情況下,可能出現(xiàn)大量的沖突,雖然有很多好的哈希函數(shù),但是隨著隨機輸入,大量沖突還是不可避免,可能出現(xiàn)最差情況。所以,哈希表如果用在輸入集合確定(即以后只會做查詢操作)的情況下,選擇合適的函數(shù)函數(shù)和解決沖突的方法(perfect hash)可以在O(1)時間內(nèi)完成查找(有證明,看不懂)。
二叉樹支持動態(tài)的插入和查找,保證操作在O(height)時間,這就是完成了哈希表不便完成的工作,動態(tài)性。但是二叉樹有可能出現(xiàn)worst-case,如果輸入序列已經(jīng)排序,則時間復雜度為O(N)
平衡二叉樹/紅黑樹就是為了將查找的時間復雜度保證在O(logN)范圍內(nèi)。
所以如果輸入結(jié)合確定,所需要的就是查詢,則可以考慮使用哈希表,如果輸入集合不確定,則考慮使用平衡二叉樹/紅黑樹,保證達到最大效率。