在【6.1】節與【6.2】節中分別以二分搜索樹和鏈表做爲底層實現了集合Set
,在本節就兩種集合類的複雜度分析進行分析:
測試內容:6.1
節與6.2
節中使用的書籍。
測試方法:測試兩種集合類查找單詞所用的時間git
//建立一個測試方法 Set<String> set:他們能夠是實現了該接口的LinkedListSet和BSTSet對象 private static double testSet(Set<String> set, String filename) { //計算開始時間 long startTime = System.nanoTime(); System.out.println("Pride and Prejudice"); //新建一個ArrayList存放單詞 ArrayList<String> words1 = new ArrayList<>(); //經過這個方法將書中因此單詞存入word1中 FileOperation.readFile(filename, words1); System.out.println("Total words : " + words1.size()); //加強for循環,定一個字符串word去遍歷words //底層的話會把ArrayList words1中的值一個一個的賦值給word for (String word : words1) set.add(word);//不添加劇復元素 System.out.println("Total different words : " + set.getSize()); //計算結束時間 long endTime = System.nanoTime(); return (endTime - startTime) / 1000000000.0;//納秒爲單位 } public static void main(String[] args) { //基於二分搜索的集合 BSTSet<String> bstSet = new BSTSet<>(); double time1 = testSet(bstSet, "pride-and-prejudice.txt"); System.out.println("BSTSet:" + time1 + "s"); System.out.println("————————————————————"); //基於鏈表實現的集合 LinkedListSet<String> linkedListSet = new LinkedListSet<>(); double time2 = testSet(linkedListSet, "pride-and-prejudice.txt"); System.out.println("linkedListSet:" + time2 + "s"); }
結果:BSTSet的速度比LinkedListed的速度快github
在基於二叉搜索樹的狀況下,增長、查詢、刪除的與二叉搜索樹的深度有關,每次操做均爲從根節點到某一一支子樹的葉子節點之間進行操做,時間複雜度爲0(h)
,h
表示二叉搜索樹的高度(層數)。ide
二叉搜索樹複雜度以下:測試
下面對n與h關係進行推導:spa
2.1.1 採用滿二叉樹的狀況進行分析(最優狀況)3d
採用滿二叉樹(每一個節點都有左右節點,除了葉子節點)來進行分析的緣由爲滿二叉樹是一種極端狀況,以下圖:code
從上圖中關於h層
總共有多少個節點有以下推導:對象
假設節點個數爲n
個則有以下關係:blog
針對都是log級別
的關係,底數是多少不影響它是log級別
的則有:接口
2.1.2 單個孩子狀況----二叉搜索樹最壞狀況(節點數等於其高度)
好比:下面這種二叉搜索樹
對於這種只有單個孩子的狀況,此時二叉搜索樹退化成了鏈表,此時的時間複雜度爲O(n)。
2.2.1 logn和n的差距
推薦是最好的支持,關注是最大的鼓勵。親愛的朋友,很榮幸在園子裏遇到您。
本節涉及的源碼地址爲 https://github.com/FelixBin/dataStructure/tree/master/src/SetPart