Java基于二分搜索樹(shù)、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析實(shí)例詳解
本文實(shí)例講述了Java基于二分搜索樹(shù)、鏈表的實(shí)現(xiàn)的集合Set復(fù)雜度分析。分享給大家供大家參考,具體如下:
兩種集合類(lèi)的復(fù)雜度分析
在Java底層基于二叉搜索樹(shù)實(shí)現(xiàn)集合和映射 和Java底層基于鏈表實(shí)現(xiàn)集合和映射中以二分搜索樹(shù)和鏈表作為底層實(shí)現(xiàn)了集合Set
,在本節(jié)就兩種集合類(lèi)的復(fù)雜度分析進(jìn)行分析:
測(cè)試內(nèi)容:Java底層基于二叉搜索樹(shù)實(shí)現(xiàn)集合和映射和Java底層基于鏈表實(shí)現(xiàn)集合和映射中使用的書(shū)籍。
測(cè)試方法:測(cè)試兩種集合類(lèi)查找單詞所用的時(shí)間
//創(chuàng)建一個(gè)測(cè)試方法 Set<String> set:他們可以是實(shí)現(xiàn)了該接口的LinkedListSet和BSTSet對(duì)象 private static double testSet(Set<String> set, String filename) { //計(jì)算開(kāi)始時(shí)間 long startTime = System.nanoTime(); System.out.println("Pride and Prejudice"); //新建一個(gè)ArrayList存放單詞 ArrayList<String> words1 = new ArrayList<>(); //通過(guò)這個(gè)方法將書(shū)中所以單詞存入word1中 FileOperation.readFile(filename, words1); System.out.println("Total words : " + words1.size()); //增強(qiáng)for循環(huán),定一個(gè)字符串word去遍歷words //底層的話(huà)會(huì)把ArrayList words1中的值一個(gè)一個(gè)的賦值給word for (String word : words1) set.add(word);//不添加重復(fù)元素 System.out.println("Total different words : " + set.getSize()); //計(jì)算結(jié)束時(shí)間 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("————————————————————"); //基于鏈表實(shí)現(xiàn)的集合 LinkedListSet<String> linkedListSet = new LinkedListSet<>(); double time2 = testSet(linkedListSet, "pride-and-prejudice.txt"); System.out.println("linkedListSet:" + time2 + "s"); }
結(jié)果:BSTSet的速度比LinkedListed的速度快
集合的時(shí)間復(fù)雜度分析:
1.鏈表情況
2.二叉搜索樹(shù)的情況
在基于二叉搜索樹(shù)的情況下,增加、查詢(xún)、刪除的與二叉搜索樹(shù)的深度有關(guān),每次操作均為從根節(jié)點(diǎn)到某一一支子樹(shù)的葉子節(jié)點(diǎn)之間進(jìn)行操作,時(shí)間復(fù)雜度為0(h)
,h
表示二叉搜索樹(shù)的高度(層數(shù))。
二叉搜索樹(shù)復(fù)雜度如下:
2.1 探究鏈表情況下的n與二叉搜索樹(shù)的h的關(guān)系
下面對(duì)n與h關(guān)系進(jìn)行推導(dǎo):
2.1.1 采用滿(mǎn)二叉樹(shù)的情況進(jìn)行分析(最優(yōu)情況)
采用滿(mǎn)二叉樹(shù)(每個(gè)節(jié)點(diǎn)都有左右節(jié)點(diǎn),除了葉子節(jié)點(diǎn))來(lái)進(jìn)行分析的原因?yàn)闈M(mǎn)二叉樹(shù)是一種極端情況,如下圖:
從上圖中關(guān)于h層
總共有多少個(gè)節(jié)點(diǎn)有如下推導(dǎo):
假設(shè)節(jié)點(diǎn)個(gè)數(shù)為n
個(gè)則有如下關(guān)系:
針對(duì)都是log級(jí)別
的關(guān)系,底數(shù)是多少不影響它是log級(jí)別
的則有:
2.1.2 單個(gè)孩子情況----二叉搜索樹(shù)最壞情況(節(jié)點(diǎn)數(shù)等于其高度)
比如:下面這種二叉搜索樹(shù)
對(duì)于這種只有單個(gè)孩子的情況,此時(shí)二叉搜索樹(shù)退化成了鏈表,此時(shí)的時(shí)間復(fù)雜度為O(n)。
2.2 兩種集合復(fù)雜度統(tǒng)計(jì)
2.2.1 logn和n的差距
推薦是最好的支持,關(guān)注是最大的鼓勵(lì)。親愛(ài)的朋友,很榮幸在園子里遇到您。
本節(jié)涉及的源碼地址為https://github.com/FelixBin/dataStructure/tree/master/src/SetPart
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
java實(shí)現(xiàn)圖像轉(zhuǎn)碼為字符畫(huà)的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖像轉(zhuǎn)碼為字符畫(huà)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Java8 Stream Collectors收集器使用方法解析
這篇文章主要介紹了Java8 Stream Collectors收集器使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章主要為大家介紹了java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼,驗(yàn)證碼實(shí)際上就是隨機(jī)選擇一些字符以圖片的形式展現(xiàn)在頁(yè)面上,感興趣的小伙伴們可以參考一下2016-03-03教你怎么在IDEA中創(chuàng)建java多模塊項(xiàng)目
這篇文章主要介紹了教你怎么在IDEA中創(chuàng)建java多模塊項(xiàng)目,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))
這篇文章主要介紹了JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Java線程監(jiān)聽(tīng),意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Java線程監(jiān)聽(tīng),意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03SpringBoot中并發(fā)定時(shí)任務(wù)的實(shí)現(xiàn)、動(dòng)態(tài)定時(shí)任務(wù)的實(shí)現(xiàn)(看這一篇就夠了)推薦
這篇文章主要介紹了SpringBoot并發(fā)定時(shí)任務(wù)動(dòng)態(tài)定時(shí)任務(wù)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04