1. 程式人生 > 程式設計 >Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

本文例項講述了Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析。分享給大家供大家參考,具體如下:

兩種集合類的複雜度分析

在Java底層基於二叉搜尋樹實現集合和對映和Java底層基於連結串列實現集合和對映中以二分搜尋樹和連結串列作為底層實現了集合Set,在本節就兩種集合類的複雜度分析進行分析:
測試內容:Java底層基於二叉搜尋樹實現集合和對映和Java底層基於連結串列實現集合和對映中使用的書籍。
測試方法:測試兩種集合類查詢單詞所用的時間

 //建立一個測試方法 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的速度快

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

集合的時間複雜度分析:

1.連結串列情況

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

2.二叉搜尋樹的情況

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

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

二叉搜尋樹複雜度如下:

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

2.1 探究連結串列情況下的n與二叉搜尋樹的h的關係

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

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

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

採用滿二叉樹(每個節點都有左右節點,除了葉子節點)來進行分析的原因為滿二叉樹是一種極端情況,如下圖:

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

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

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

假設節點個數為n個則有如下關係:

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

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

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

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

比如:下面這種二叉搜尋樹

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

對於這種只有單個孩子的情況,此時二叉搜尋樹退化成了連結串列,此時的時間複雜度為O(n)。

2.2 兩種集合複雜度統計

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

2.2.1 logn和n的差距

Java基於二分搜尋樹、連結串列的實現的集合Set複雜度分析例項詳解

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

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

更多關於java演算法相關內容感興趣的讀者可檢視本站專題:《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》、《Java檔案與目錄操作技巧彙總》和《Java快取操作技巧彙總》

希望本文所述對大家java程式設計有所幫助。