Java基礎之toString的序列化 匿名對象 復雜度精解

toString的序列化、匿名對象、復雜度

序列化

toString 方法的原理就是序列化,他可以幫助我們講一個抽象的對象變得具體,譬如把對象裡面的名字、年齡、身高等信息具象為字符串。(總之,序列化:將對象轉化為字符串;反序列化:將字符串轉化為對象)。

匿名對象

匿名對象適用於隻想使用一次的情況,因為匿名對象是沒有引用的,每次用都要重新new 一遍對象,很麻煩。

class Person {
    public void eat{
        //略
    }
    public void show{
        //內容略
    }
}
//主函數略寫
new Person.eat();//此即為匿名函數的寫法
new Person.show();

復雜度

復雜度是衡量一個計算機運行效率的東西,分為時間復雜度和空間復雜度,空間復雜度衡量的是一個程序所占用儲存空間,時間復雜度衡量的是一個程序的運行時間(當然,不是那種真實的時間),但是當下,計算機的內存空間已經發展到瞭一定的高度,所以不需要再去關註這個東西瞭。

時間復雜度

我們是不可能能真正去測算一個程序的執行時間的,因為,每個計算機的性能不同,執行的時間快慢也不同。一個算法所花費的時間是正比於語句的執行次數的。

所以,算法中的基本操作的執行次數,為算法時間復雜度。

以下為時間復雜度示例,一起來具體分析。

fq4IVU.jpg

上面已經講過瞭,時間復雜度的定義就是 算法中的基本操作的執行次數,所以我們算一下上面這段代碼每段語句的執行次數就可以求出(上面的圖片已經標註),所以這段代碼的時間復雜度為:N^2 + 2N + 10。(1 太小,可以忽略)。

大O的漸進表示法

用參數 1 取代式子中的常數項在修改後函數中隻保留最高項如果最高項的系數不為 1 ,那麼就把他前面的系數去掉

(其實歸根到底就是 ,對於一個有不同項的式子(譬如:N^2+2N+10 變 N^2) ,去掉最高項以外的其他項 , 去掉最高項的常數,但是如果其時間復雜度僅僅是一個常數,直接轉為O(1)即可)

時間復雜度的分類

時間復雜度被分為三類(可以以數組的查找為例)

第一類:最好情況(1次找到,即假定我們要找的是數組的第一個元素)

第二類:最壞情況(最後一個找到,即假設我們要找的是數組的最後一個元素,N次)

第三類:平均情況(中間找到,即假設我們要找到的是數組的中間元素,N/2次)

但是,平時我們嘴裡面常說的時間復雜度其實是最壞的情況,所以,以上以查找數組為例的時間復雜度應該為:O(N)。

計算時間 復雜度的方法

既要看程序的執行次數,也要看程序的具體的執行內容而定。

示例 1

fvahBd.jpg

如上圖,要求計算冒泡排序的時間復雜度。這裡要算出 最好情況和最壞情況 ,最好情況也就是順序,一次性的隻有圖中的第一個框子的程序進行執行,第二個框子裡的程序根本沒執行所以不納入考慮范圍。因此,最好情況為:O(N)。

但是最壞情況就是逆序,從大到小的那種,這樣的話,第二個框子必須每次都執行。即為:N(N-1),因此根據剛剛上面的規則,去掉最高項以外的其他項之後,最壞情況為:O(N^2)。

示例 2

fvjP7F.jpg

如上圖,是二分查找的代碼,這個代碼要計算它的時間復雜度,就必須知道裡面循環執行的次數,而下圖,以四個元素的數組為例進行查找,最終發現規律(註意,這裡要算的時間復雜度考慮最壞情況,也就是說我們不管數組裡有幾個元素查找的都是最後一個元素)。如圖,分支處的判斷與賦值其實就是進入循環裡面所做的事情,也就是說有幾個分支,循環就執行瞭幾次,下圖那個,四個元素,三個分支,所以,循環執行瞭三次,其時間復雜度也是 3 。最後的到用n 表示出來的n ,但是下圖中的值其實並不準確,根據上面說過的原理,我們可以略去 1 那個常數。然後log 裡面的 2 也是能夠去掉的,用 log n 特指 二分查找的時間復雜度。

fvXSde.jpg

示例3

計算遞歸的時間復雜度,公式:時間復雜度 = 遞歸的次數 * 遞歸執行的次數。

//階乘遞歸
long factorial(int n) {
    return n < 2 ? n :factorial(n-1)*n;
}//求此段代碼的時間復雜度
//  n     a
//  2     2*1
//  3     3*1
//綜上,找出的規律說明輸入多少
//時間復雜度就是多少。
//因此,答案為O(N)
//計算斐波那契數列的時間復雜度
int fibonacci(int n) {
    return n < 2 ? n :fibonacci(n-1)+fibonacci(n-2);
}
//

空間復雜度

空間復雜度不是看程序占多少字節,這個是沒有意義的,但是如果我們要計算空間復雜度的話,其實求的是變量的個數。

fxcJ78.jpg

如上圖,冒泡排序的空間復雜度是O(1),之所以是這樣子的是因為函數參數裡面的那個 int[] array,他其實並不算在內,因為這是一個必須空間,就是說,要存這N 個數據就必須是要開辟的,這種必須空間不納入考慮范圍。但是循環裡面的那個 sort 變量是納入考慮范圍,因為這才是實實在在創建的變量,又因為這個變量在for 循環裡面,僅僅是每次循環賦一次值,並不是每次循環都創建一次,所以 時間復雜度為 1。

fxcvjI.jpg

同樣的,上圖起到決定空間復雜度的變量即為圖中畫紅線的變量。容量一律用N 來表示,故為O(N)。

fxh9fO.jpg

此處遞歸代碼的空間復雜度為O(N),因為每次遞歸都會開辟函數的棧幀,這個棧幀裡面存有值,因為上面的代碼的遞歸次數是 N 次,所以它也就開辟瞭 N 次,也就有瞭N 個值。

到此這篇關於Java基礎之toString的序列化 匿名對象 復雜度精解的文章就介紹到這瞭,更多相關Java toString內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: