一、演算法效率
演算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率稱為時間複雜度,而空間效率被 稱為空間複雜度。時間複雜度主要衡量的是一個演算法的運行速度,而空間複雜度主要衡量一個演算法所需的額 外空間,在電腦發展的早期,電腦的儲存容量很小。所以對空間複雜度很在乎。但是經過電腦產業的 迅速發展,電腦的儲存容量已經達到了很高的程度。所以我們如今已經不需要再特別重視一個演算法的空間複 雜度。
二、時間複雜度
1.時間複雜度概念
一個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。也就是說當我們拿到一個程式碼,來看這個程式碼的時間複雜度的時候,主要是去找這個程式碼當中執行語句次數最多的程式碼執行了多少次。
2.大O的漸進表示法
看圖分析:
#當N的值越來越大,2N和10的值就可以忽略不記了。
實際中我們計算時間複雜度時,我們其實不一定要計算精確的執行次數,而只需要大概執行次數,那麼這裡 我們使用大O的漸進表示法。
大O符號(Big O notation):是用來描述函數漸進式的數學符號。
1、用常數1取代運行時間中的所有加法常數。
2、在修改後的運行次數函數中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階。
透過上面我們會發現大O的漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數。
另外有些演算法的時間複雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規模的最大運行次數(上界)
#平均情況:任意輸入規模的期望運行次數
最佳情況:任意輸入規模的最小運行次數(下界)
例如:在長度為N數組中搜尋一個資料x
最好情況:1次找到
最壞情況:N次找到
平均情況:N/2次找到
在實際中一般情況關注的是演算法最壞的運作情況,所以在陣列中搜尋資料時間複雜度為O(N)
計算時間複雜度
範例1:
# #基本運算執行了100次,透過推導大O階方法,時間複雜度為O(1)
#例題4:計算冒泡排序的時間複雜度
基本運算執行最好N次,最壞執行了(N*(N-1))/2次,透過推導大O階方法時間複雜度一般看最壞, 時間複雜度為O( N^2
例題5:二分查找的時間複雜度
#基本運算執行最好1次,最壞O(logN)次,時間複雜度為O(logN) ps:logN在演算法分析中表示是底數為2,對數為N。有些地方會寫成lgN。(建議透過摺紙查找的方式講解logN是怎麼計算出來的)(因為二分查找每次排除掉一半的不適合值,一次二分剩下:n/2 兩次二分剩下:n/2/2 = n/4)
例題6:計算階乘遞歸的時間複雜度
遞歸的時間複雜度= 遞歸的次數*每次遞歸執行的次數
透過計算分析發現基本運算遞歸了N次,時間複雜度為O(N)。
範例7:計算斐波那契遞歸的時間複雜度
透過計算分析發現基本操作遞歸了2^N次,時間複雜度為O(2^N)。
規律:
2^0 2^1 2^2 2^3……2^(n-(n-1))
等比數列求和
a1就代表第一項,q是等比就是2,1(1-2^n)/-1 ,相當於2^n 1,所以時間複雜度為O(2^n)
三、空間複雜度
空間複雜度是對一個演算法在運行過程中暫時佔用存儲空間大小的量度。空間複雜度不是程式佔用了多少bytes 的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的數量。空間複雜度計算規則基本上跟實踐複雜度 類似,也使用大O漸進表示法。
範例1:計算冒泡排序的空間複雜度
#使用了常數個額外空間,所以空間複雜度為O(1)
範例2:計算斐波那契的空間複雜度
動態開啟了N個空間,空間複雜度為O(N)
例題3:計算階乘遞歸的空間複雜度
遞歸呼叫了N次,開啟了N個堆疊幀,每個堆疊幀使用了常數個空間。空間複雜度為O(N)
以上是Java時間複雜度與空間複雜度實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具