6.3 基於二分搜索樹、鏈表的實現的集合Set複雜度分析

兩種集合類的複雜度分析

在【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

集合的時間複雜度分析:

1.鏈表狀況

2.二叉搜索樹的狀況

在基於二叉搜索樹的狀況下,增長、查詢、刪除的與二叉搜索樹的深度有關,每次操做均爲從根節點到某一一支子樹的葉子節點之間進行操做,時間複雜度爲0(h),h表示二叉搜索樹的高度(層數)。ide

二叉搜索樹複雜度以下:測試

2.1 探究鏈表狀況下的n與二叉搜索樹的h的關係

下面對n與h關係進行推導:spa

2.1.1 採用滿二叉樹的狀況進行分析(最優狀況)3d

採用滿二叉樹(每一個節點都有左右節點,除了葉子節點)來進行分析的緣由爲滿二叉樹是一種極端狀況,以下圖:code

 

 從上圖中關於h層總共有多少個節點有以下推導:對象

假設節點個數爲n個則有以下關係:blog

針對都是log級別的關係,底數是多少不影響它是log級別的則有:接口

2.1.2 單個孩子狀況----二叉搜索樹最壞狀況(節點數等於其高度)

好比:下面這種二叉搜索樹

 

 
對於這種只有單個孩子的狀況,此時二叉搜索樹退化成了鏈表,此時的時間複雜度爲O(n)。

2.2 兩種集合複雜度統計

2.2.1 logn和n的差距

 

推薦是最好的支持,關注是最大的鼓勵。親愛的朋友,很榮幸在園子裏遇到您。

本節涉及的源碼地址爲   https://github.com/FelixBin/dataStructure/tree/master/src/SetPart

相關文章
相關標籤/搜索