日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

一分钟带你了解什么是“复杂度” 算法上的O(1)、O(n)、O(logn) 这些都是什么❓❓

發布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一分钟带你了解什么是“复杂度” 算法上的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) 这些都是什么❓❓的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。