簡體   English   中英

想知道Java中此代碼段的時間復雜度

[英]Like to know the time complexity of this code snippet in Java

我想知道以下代碼段的時間復雜度,

FileReader fr = new FileReader("myfile.txt");
BufferedReader br = new BufferedReader(fr);

for (long i = 0; i < n-1; i++ ) {
   br.readLine();       
}
System.out.println("Line content:" + br.readLine());
br.close();
fr.close();

編輯:我想說,n =一個常數,例如100000

復雜度為O(n),但這並不能告訴您太多信息,因為您不知道每個readLine()需要多少時間。

當單個操作具有非常可變的運行時行為時,計算復雜度沒有多大意義。

在這種情況下,循環非常便宜,並且不會對整個程序的運行時間有太大貢獻。 另一方面,從磁盤加載將對運行時間有很大貢獻,但是如果沒有有關每個文件的平均行數和平均行長的統計信息,很難說。

這是一個非常簡單的情況,但是這里是找到時間復雜度的方法。 可以將相同的方法應用於更復雜的算法。

對於以下代碼部分(無論readline()的復雜性如何)

for (long i = 0; i < n-1; i++ ) {
   br.readLine();       
}

i = 0將被執行(n-1)次, i < n-1將被執行n次, i++將被執行n-1次,並且br.readline(); 將執行n-1次。

這給我們n-1 + n + n-1 + n-1 = 4 * n-3 這與n成正比,因此復雜度為O(n)

我不確定您所說的“時間復雜度”是什么,但是它的性能似乎與它從中讀取文件的大小成線性關系(AKA O(n))。

讀取整個文件的時間復雜度應為O(N) ,其中N是文件的大小。

但是,鑒於所涉及的軟件數量,證明這一點將很困難。 您已經在main方法,閱讀器堆棧(包括Charset解碼器)和JVM中獲得了Java代碼。 然后,您在操作系統中有了代碼。 然后,您必須考慮內核內存中的文件緩沖,文件系統組織,磁盤查找時間等。

(這是沒有意義的,只是考慮由應用程序所花費的時間,我們可以有把握地預測將采取由其他組件占據了總時間的組成部分。)

而且,正如亞倫(Aaron)所說的那樣,復雜性度量並不能成為實際文件讀取時間的可靠預測指標。

readLine()函數必須掃描輸入的每個字符,直到下一個換行符。 這應該是O(N),其中N是前n行(您讀取的)中的字節數。 使用緩沖的讀取器不會降低算法的復雜性,只會減少讀取給定字節數所需的實際IO調用次數(這是一件好事,因為IO調用很昂貴)。 在這種情況下,唯一改變的方法是如果緩沖區的讀取大小比要讀取的字節總數大得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM