一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓
生活随笔
收集整理的這篇文章主要介紹了
一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:在最開始學習編程的時候,打開數據結構的書,最顯眼的就是排序算法,什么堆排序、希爾排序,然后旁邊寫著最壞復雜度、最優復雜度、平均復雜度,是一些O(n)、O(logn)、O(n2)。這時候我腦子想起一首歌——大朋友,你是否有很多問號??? 我相信有很多人也有這個困惑,所以寫下這篇文章,希望能夠幫助更多的人更上一層樓。
說到復雜度,不得不說一下什么是算法?👇
???算法是用于解決特定問題的一系列的執行步驟
一般從以下維度來評估算法的優劣
1、正確性、可讀性、健壯性(對不合理輸入的反應能力和處理能力)
2、時間復雜度(time complexity):估算程序指令的執行次數(執行時間)
3、空間復雜度(space complexity):估算所需占用的存儲空間
我們在使用不同算法解決相同的問題時,效率可能相差非常大,有多大呢???
我們知道有一個數列叫做斐波那契數列
而實現斐波那契數列時我們有遞歸和迭代兩種方式。當我們計算第50個數以上的時候我們就會發現明顯的差別,遞歸使用的時間會以指數式上升,而迭代則一直是秒出。
這個例子雖然有些極端,但如果某一天我們設計出復雜度極高的程序時,我們可能會很深切地影響到我們程序的執行,從而影響到我們的工作穩定情況~~
回歸正題
我們的時間復雜度通常用一個大O表示,在大O后面加一個括號,其中放入我們的復雜度。
重點來了,我們的復雜度是如何展示的呢?n、logn、n2、1都是什么呢??
下面是我們常見的復雜度
在我們的復雜度計算中,我們省略常數位,使用最大的那一位作復雜度的描述。而大小比較的順序為:
接下來我們用代碼來描述一下這些復雜度👇
public static void test1(int n) {// 確定的執行次數if (n > 10) { System.out.println("n > 10");} else if (n > 5) { // 2System.out.println("n > 5");} else {System.out.println("n <= 5"); }// 1 + 4 + 4 + 4for (int i = 0; i < 4; i++) {System.out.println("test");}// 都是O(1)}public static void test2(int n) {// O(n)for (int i = 0; i < n; i++) {System.out.println("test");}}public static void test3(int n) {// 1 + 2n + n * (1 + 3n)// 1 + 2n + n + 3n^2// 3n^2 + 3n + 1// O(n^2)// O(n^2)for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.println("test");}}}public static void test4(int n) {// 1 + 2n + n * (1 + 45)// 1 + 2n + 46n// 48n + 1// O(n)for (int i = 0; i < n; i++) {for (int j = 0; j < 15; j++) {System.out.println("test");}}}public static void test5(int n) {// 8 = 2^3// 16 = 2^4// 3 = log2(8)// 4 = log2(16)// 執行次數 = log2(n)// O(logn)while ((n = n / 2) > 0) {System.out.println("test");}}public static void test6(int n) {// log5(n)// O(logn)while ((n = n / 5) > 0) {System.out.println("test");}}public static void test7(int n) {// 1 + 2*log2(n) + log2(n) * (1 + 3n)// 1 + 3*log2(n) + 2 * nlog2(n)// O(nlogn)for (int i = 1; i < n; i = i * 2) {// 1 + 3nfor (int j = 0; j < n; j++) {System.out.println("test");}}}
在數據規模較小時,不同復雜度所需執行時間走向為👇
在數據規模較大時,不同復雜度所需執行時間走向為👇
當然,大O表示法僅僅是一種粗略的分析模型,是一種估算,能幫助我們短時間內了解一個算法的執行效率
那么,我們的算法有哪些優化的方向呢?
-
用盡量少的存儲空間
-
用盡量少的執行步驟(執行時間)
-
根據情況,可以
??空間換時間
???????? or
??時間換空間
由上可得,我們在寫代碼的時候,合理地使用算法,讓我們的代碼效率更優是多么的重要!!!希望大家都能寫出更優秀的代碼~~
總結
以上是生活随笔為你收集整理的一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你JavaEE的分页查询、分页展
- 下一篇: 什么是LinkedList?什么时候使用