拯救漏油生態危機:菲律賓吉馬拉斯島的故事

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

鎳礦出口禁令再提前 印尼宣布立即停止

摘錄自2019年10月28日中央社報導

印尼投資協調委員會主席巴赫利爾(Bahlil Lahadalia)28日指出,鎳礦業者已和政府達成協議,將立即停止鎳礦出口。這項禁令是為振興印尼冶煉產業發展。印尼上個月已將停止鎳礦出口的時間從2022年提早到明年1月實施,如今這項決定讓時程再度提前。

鎳礦產業協會秘書長梅迪(Meidy Lengkey)告訴路透社,只要政府能協助,讓鎳礦在國內市場能以公平售價賣出,鎳礦業者對於禁止出口的政策沒有意見。

 

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

中興通訊每年投逾50億 進軍新能源汽車

中國手機廠商中興通訊推出的自主研發的大功率無線充電系統,已進入公共交通領域。2014年10月,中興通訊攜手蜀都客車共同發佈全球首個無線充電城市微循環解決方案。該方案可以在不專門征地的情況下,在社區附近將任何現有停車位或路面直接改造為安全快捷的充電站。   “目前我們已經與10多個城市簽約,包括四川、河北、雲南、河南等省的城市,與當地政府就公共汽車的無線充電進行合作。”中興通訊副總裁孫枕戈稱,下一步將會把無線充電落實到私家車領域。據孫枕戈介紹,今後新能源汽車有可能將以PPP(政府與私人組織之間合作建設城市基礎設施專案)模式進行運營,而且將獲得中央政府和地方政府的補貼。   孫枕戈表示,從2015年開始,中興通訊每年將投入至少10億元人民幣(約合新臺幣50.6億)進行無線充電設施的商業運作。中興通訊未來的戰略是將通訊技術與各行各業相連,即M-ICT戰略,無線充電項目是其中的一項,該項目是中興與大專院校、研究機構共同合作的結果。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

硬件對同步的支持-TAS和CAS指令

目錄

  • Test and Set
  • Compare and Swap
    • 使用CAS實現線程安全的數據結構。

現在主流的多處理器架構都在硬件水平上提供了對併發同步的支持。
今天我們討論兩個很重要的硬件同步指令:Test-and-Set和Compare-and-Swap

Test and Set

一個Test-and-Set(TAS)指令包括兩個子步驟,把給定的內存地址設置為1,然後返回之前的舊值。
這兩個子步驟在硬件上實現為一個原子操作,執行期間不會被其他處理器打斷。
(一個CPU可以使用諸如Dual-port RAM电子原件提供的TAS指令,此外,CPU自身也可以提供CAS指令)
值得注意的是,TAS指令是在單個內存word(或字節)上實現,這限制了變量非0即1,並且TAS總是把變量設置為1。
可見,TAS生而為自旋鎖,下面是使用TAS實現自旋鎖的偽代碼[2]:

lock = 0 //shared state
while(test_and_set(lock)==0){ //try lock
       //do nothing   
}
// 臨界區代碼
lock = 0   //release 

當第一個線程執行這段代碼時,TAS指令會立即把lock設置為1,並返回0 ,線程退出while循環進入臨界區。
如果另一個線程嘗試進入臨界區,TAS會把lock設置為1,但是也會返回1(由第一個線程的TAS指令設置為1),
此時第二個線程會一直while循環(忙等待),直到第一個線程退出臨界區代碼,執行了lock=0,即釋放了鎖。
這種通過while-loop等待獲取鎖的實現稱為自旋鎖(spin lock)。

Compare and Swap

compare-and-swap(CAS)指令和TAS指令類似,但是比TAS要更複雜。
與TAS只有一個參數不同,CAS指令需要三個參數,一個內存位置(V)、一個期望舊值(A)、一個新值(B)。
CAS指令的執行過程:

1.比較內存V的值是否與A相等?
2.如果相等,則用新值B替換內存位置V的舊值
3.如果不相等,不做任何操作。
4.無論哪個情況,CAS都會把內存V原來的值返回。

偽代碼:

int CAS(int *ptr,int oldvalue,int newvalue)
{
   int temp = *ptr;
   if(*ptr == oldvalue)
       *ptr = newvalue
   return temp;
}

以上過程在CAS指令中是原子操作。
CAS支持32bit/64bit的數據類型,這使得CAS能夠實現一些更複雜的自旋鎖。

使用CAS實現線程安全的數據結構。

我們使用CAS實現一個併發的平衡二叉搜索樹。[1]
基本思路是,所有的更新操作都要在二叉樹的副本上進行,更新完成后,使用CAS指令把新的根節點引用替換舊的引用。

//共享變量
  root = pointer to the root of the tree
//插入操作
do
  old_root = root
  new_root = new Tree
  # copy old_root into new_root
  # do insertion into new_root
until compare_and_swap (root, old_root, new_root) == old_root
平衡操作:
do
  old_root = root
  new_root = balanced_copy_of (old_root)
until compare_and_swap (root, old_root, new_root) == old_root

如果并行的執行平衡操作和插入操作,插入操作完成後會把二叉樹的根節點指向新的引用。
等到平衡操作完成后,compare_and_swap將會失敗,因為此時根節點指向了插入操作產生的新地址,不再等於old_root,
平衡操作會重複循環執行,直到成功更新根節點。
同樣的,如果平衡操作先於插入操作完成,插入操作的CAS指令也會失敗(根節點已指向平衡操作產生的新地址),然後插入操作重複循環,直到成功。

基於CAS指令可以實現基礎的信號量、互斥量之外,還可以實現更複雜的lock-free和wait-free算法。

延伸閱讀:

1.康奈爾大學操作系統課件:Architectural support for synchronization
2.wiki:Test-and-Set指令
3.wiki:Compare-and-swap指令
4.TAS vs CAS

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

人類的「故鄉」找到了! 20萬年前誕生於非洲波札那

摘錄自2019年10月29日中央社報導

科學家29日表示,人類祖先是在距今20萬年前誕生於非洲的波札那北部,當地現遍布沙漠和鹽地,但20萬年前卻是廣大的湖泊溼地,生機盎然。

科學期刊「自然」(Nature)刊出由澳洲雪梨大學(University of Sydney)和嘉文醫學研究所(Garvan Institute of Medical Research and University of Sydney)遺傳學家海斯(Vanessa Hayes)所率研究團隊做的這份研究。

法新社報導,現居南非與納米比亞的科伊桑人(Khoisan)是一支古老種族,他們體內有高比例的線粒體DNA支系L0,國際研究團隊從200名科伊桑人身上採集DNA樣本,和地理分布、考古、氣候變遷資料相比對。

在涵蓋現今波札那北部、納米比亞、辛巴威的地區,20萬年前有一個相當於目前維多利亞湖(Lake Victoria,面積約6.8萬平方公里)兩倍的大湖破裂後,形成廣袤的溼地,人類的祖先就誕生於此。

海斯說:「我們談的是構造上的現代人種,即現今的人類。現今人類事實上最老就是回溯到L0支系,這個支系全回溯到這個起源地。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

歐洲電動自行車熱銷 美利達搶攻市場

歐洲人一向喜歡騎自行車旅遊、運動,看中銀髮族人數增加,讓退休老年人也能享受騎車樂趣的電動自行車,也成為最夯運動商品,各大車廠積極搶攻電動自行車市場。 比利時最大的自行車展於本周在庫特萊 (Kortrijk) 舉行,吸引超過 10 萬人次參觀。台灣自行車廠商美利達也從荷蘭前來參展。   看中銀髮商機,這幾年各大車廠都把焦點放到電動自行車領域,從一開始以通勤用為主,到現在不少車廠都針對高單價的公路車、登山車,推出電動車款,讓銀髮族也能輕鬆和朋友騎自行車出遊。   美利達荷蘭分公司總經理柯柏芮德表示,電動自行車將是未來歐洲自行車市場的一大主流商品,成長速度也相當快。歐洲 1 年的電動自行車銷售量達 20 萬輛,他樂觀預估市場至少可以擴大到數百萬輛。美利達也於 2 年前在德國生產基地擴充電動自行車生產線,搶攻歐洲電動自行車市場。        

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

Java工具類—包裝類

Java工具類——包裝類

我們都知道,JDK 其實給我們提供了很多很多 Java 開發者已經寫好的現成的類,他們其實都可以理解成工具類,比如我們常見的集合類,日期相關的類,數學相關的類等等,有了這些工具類,你會發現它能很大程度的幫你節省時間,能很方便的實現你的需求。當然,沒有這些包,你也能實現你的需求,但是你需要時間,今天我們主要是來學習一下包裝類。

一、包裝類介紹

1、為什麼需要包裝類?

我們知道 Java 語言是一個面向對象的編程語言,但是 Java 中的基本數據類型卻不是面向對象的,但是我們在實際使用中經常需要將基本數據類型轉換成對象,便於操作,比如,集合的操作中,這時,我們就需要將基本類型數據轉化成對象,所以就出現了包裝類。

2、包裝類是什麼呢?

包裝類,顧名思義就是將什麼經過包裝的類,那麼是將什麼包裝起來的呢,顯然這裡是將基本類型包裝起來的類。包裝類的作用就是將基本類型轉成對象,將基本類型作為對象來處理。

Java 中我們知道,基本數據類型有8個,所以對應的包裝類也是8個,包裝類就是基本類型名稱首字母大寫。但Integer 和 Character 例外,它們显示全稱,如下面表格所示:

基本數據類型 對應包裝類
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

二、包裝類的繼承關係

通過閱讀 Java8 的 API 官方文檔或者看源代碼我們可以得知8個包裝類的繼承關係如下:

通過以上的繼承關係圖,我們其實可以這樣記憶,包裝類裏面有6個與数字相關的都是繼承自 Number 類,而其餘兩個不是與数字相關的都是默認繼承 Object 類。通過看 API 官方文檔,我們還可以得知這8個包裝類都實現了Serializable , Comparable 接口。比如下圖的 Integer 類

public final class Integer extends Number implements Comparable<Integer> {}

三、包裝類的使用方法(基本操作)

接下來關於包裝類的講解我就講Integer包裝類,其他的都依此類推,用法和操作都是差不多的,只是名字不一樣而已。

1、包裝類的構造方法

8個包裝類都有帶自己對應類型參數的構造方法,其中8個包裝類中除了Character還有構造方法重載,參數是String類型的。

Integer one = new Integer(666);
Integer two = new Integer("666");

2、包裝類的自動拆裝箱

在了解自動拆裝箱之前,我們得先知道什麼是拆箱和裝箱。其實拆裝箱主要應對基本類型與包裝類型的相互轉換問題。

  • 裝箱:將基本類型轉換成包裝類型的過程叫做裝箱。

  • 拆箱:將包裝類型轉換成基本類型的過程叫做拆箱。

其實,在 JDK1.5 版本之前,是沒有自動拆裝箱的,開發人員要手動進行裝拆箱:

//手動裝箱,也就是將基本類型10轉換為引用類型
Integer integer = new Integer(10);
//或者
Integer integer1 = Integer.valueOf(10);

//手動拆箱,也就是將引用類型轉換為基本類型
int num = integer.intValue();

而在在 JDK1.5 版本之後,為了減少開發人員的工作,提供了自動裝箱與自動拆箱的功能。實現了自動拆箱和自動裝箱,如下方代碼所示:

//自動裝箱
Integer one = 1;
//自動拆箱
int two = one + 10;

其實以上兩種方式本質上是一樣得,只不過一個是自動實現了,一個是手動實現了。至於自動拆裝箱具體怎麼實現的我這裏不做深入研究。

四、包裝類的緩存機制

我們首先來看看以下代碼,例1:

public static void main(String[] args) {
  Integer i1 = 100;
  Integer i2 = 100;
  Integer i3 = new Integer(100);
  Integer i4 = new Integer(100);
  System.out.println(i1 == i2);//true
  System.out.println(i1 == i3);//false
  System.out.println(i3 == i4);//false
  System.out.println(i1.equals(i2));//true
  System.out.println(i1.equals(i3));//true
  System.out.println(i3.equals(i4));//true
}

當我們修改了值為200的時候,例2:

public static void main(String[] args) {
  Integer i1 = 200;
  Integer i2 = 200;
  Integer i3 = new Integer(200);
  Integer i4 = new Integer(200);
  System.out.println(i1 == i2);//false
  System.out.println(i1 == i3);//false
  System.out.println(i3 == i4);//false
  System.out.println(i1.equals(i2));//true
  System.out.println(i1.equals(i3));//true
  System.out.println(i3.equals(i4));//true
}

通過上面兩端代碼,我們發現修改了值,第5行代碼的執行結果竟然發生了改變,為什麼呢?首先,我們需要明確第1行和第2行代碼實際上是實現了自動裝箱的過程,也就是自動實現了 Integer.valueOf 方法,其次,比較的是地址,而 equals 比較的是值(這裏的 eauals 重寫了,所以比較的是具體的值),所以顯然最後五行代碼的執行結果沒有什麼疑惑的。既然比較的是地址,例1的第5行代碼為什麼會是true呢,這就需要我們去了解包裝類的緩存機制。

其實看Integer類的源碼我們可以發現在第780行有一個私有的靜態內部類,如下:

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
}

我們知道,靜態的內部類是在整個 Integer 加載的時候就已經加載完成了,以上代碼初始化了一個 Integer 類型的叫 cache 的數組,取值範圍是[-128, 127]。緩存機制的作用就是提前實例化相應範圍數值的包裝類對象,只要創建處於緩存範圍的對象,就使用已實例好的對象。從而避免重複創建多個相同的包裝類對象,提高了使用效率。如果我們用的對象範圍在[-128, 127]之內,就直接去靜態區找對應的對象,如果用的對象的範圍超過了這個範圍,會幫我們創建一個新的 Integer 對象,其實下面的源代碼就是這個意思:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

所以 例1 代碼里,i1 和i2 是100,值的範圍在[-128, 127],所以直接區靜態區找,所以i1和i2指向的地址是同一個,所以 i1==i2;而在例2的代碼里,i1 和i2 是200,值的範圍不在在[-128, 127],所以分別創建了一個新的對象,放在了堆內存里,各自指向了不同的地址,所以地址都不同了,自然 i1 不等於 i2。

通過分析源碼我們可以發現,只有 double 和 float 的自動裝箱代碼沒有使用緩存,每次都是 new 新的對象,其它的6種基本類型都使用了緩存策略。
使用緩存策略是因為,緩存的這些對象都是經常使用到的(如字符、-128至127之間的数字),防止每次自動裝箱都創建一次對象的實例。

五、包裝類和基本數據類型的區別

  • 默認值不同

包裝類的默認值是null,而基本數據類型是對應的默認值(比如整型默認值是0,浮點型默認值是0.0)

  • 存儲區域不同

基本數據類型是把值保存在棧內存里,包裝類是把對象放在堆中,然後通過對象的引用來調用他們

  • 傳遞方式不同

基本數據類型變量空間裏面存儲的是值,傳遞的也是值,一個改變,另外一個不變,而包裝類屬於引用數據類型,變量空間存儲的是地址(引用),傳遞的也是引用,一個變,另外一個跟着變。

五、小結

​ 以上就是我對於Java包裝類的個人理解,其實學習這些工具類還有一個更好的學習方式,就是去看官方文檔(API官方文檔地址:https://docs.oracle.com/javase/8/docs/api/)

公眾號:良許Linux

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

四川綿陽2020年產15萬輛新能源車 總產值達5059億

中國四川省綿陽市政府常務會議審議並原則通過了《綿陽市新能源汽車產業發展規劃(2015—2020年)》。規劃提出欲在綿陽科技城集中發展區建設集新能源汽車核心技術研發、核心零件生產製造、整車製造與體驗、國家級專業孵化器、中國國家級工程技術實驗與檢測中心為一體的國家新能源汽車研究與產業發展基地。到2020年,實現年產15萬輛新能源汽車的產能,新能源汽車及關鍵零部件產業總產值1000億元人民幣(折合新台幣約5059億元)。   綿陽新能源汽車產業已擁有川汽、華晨汽車南方基地、中國重汽綿陽分公司等整車製造企業,還擁有長虹、安縣英志鋰電池等一批新能源汽車零配件企業。規劃提出,綿陽要「全域規劃」,加快新能源汽車在公共交通、公務、出租等領域的示範應用,政府採購的特種車輛也要優先選擇新能源汽車;大力發展農用低速電動車,不斷擴大新能源汽車應用範圍。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

解惑3:時間頻度,算法時間複雜度

一、概述

先放百科上的說法:

算法的時間複雜度(Time complexity)是一個函數,它定性描述該算法的運行時間。這是一個代表算法輸入值的字符串的長度的函數。

時間複雜度常用大O符號表述,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。

例如,如果一個算法對於任何大小為 n (必須比 n0 大)的輸入,它至多需要 5n3 + 3n 的時間運行完畢,那麼它的漸近時間複雜度是 O(n3).

二、時間頻度

要理解時間複雜度,需要先理解時間頻度,而時間頻度簡單的說,就是算法中語句的執行次數

舉個例子:

要計算1+2+…+100,現在有兩種算法

public int fun1(int n){
    int total;
    for(int i = 0; i <= n; i++){
        total+=i;
    }
    return total;
}

public int fun2(int n){
    int total = (1 + n)*n/2;
    return total;
}

我們可以看見,對於fun1()這個方法,不管n多大,永遠需要執行n+1次,也就是說他的時間頻度是T(n)=n+1,

而對與fun2()來說,不管n多大都只需要執行1次,所以他的時間頻度T(n)=1。

當n趨向無窮大時,有三個忽略

1.忽略常數項

比如T(n)=2n+1,當n趨向無窮大時,可以忽略常數項1;

參見下圖:

  • 2n+20 和 2n 隨着n 變大,執行曲線無限接近, 20可以忽略
  • 3n+10 和 3n 隨着n 變大,執行曲線無限接近, 10可以忽略

2.忽略低次項

比如T(n)=2n+3n^8,當n趨向無窮大時,可以忽略低次項及其係數2n;

參見下圖:

  • 2n^2+3n+10 和 2n^2 隨着n 變大, 執行曲線無限接近, 可以忽略 3n+10
  • n^2+5n+20 和 n^2 隨着n 變大,執行曲線無限接近, 可以忽略 5n+20

3.忽略係數

比如T(n)=2n^8,當n趨向無窮大時,可以忽略係數2。

參見下圖:

  • 隨着n值變大,5n^2+7n 和 3n^2 + 2n ,執行曲線重合, 說明 這種情況下, 5和3可以忽略。
  • 而n^3+5n 和 6n^3+4n ,執行曲線分離,說明多少次方式關鍵

三、時間複雜度

我們現在理解了時間頻度的T(n)的含義,假設當有一個輔助函數f(n),使得當n趨近無窮大時,T(n)/f(n)的極限值為不等於0的常數,就叫f(n)為T(n)的同量級函數,記作T(n)=O(f(n)),

稱O(f(n))為算法的時間漸進複雜度,也就是時間複雜度

又根據時間頻度T(n)的“三個忽略”原則,我們可以知道時間複雜度是這樣得到的:

  1. 忽略所有常數
  2. 只保留函數中的最高階項
  3. 去掉最高階項的係數

舉個例子:

某算法T(n)=2n^3+4n-5,按步驟走:

  1. T(n)=2n^3+4n
  2. T(n)=2n^3
  3. T(n)=n^3

即可得該算法時間複雜度為O(n^3)

四、常見時間複雜度

這裏按複雜度從低到高列舉常見的時間複雜度:

  1. 常數階O(1)

    // 無論代碼執行了多少行,只要是沒有循環等複雜結構,那這個代碼的時間複雜度就都是O(1) 。
    public void fun(int n){
        n+=1;
    }
    
  2. 對數階O(log2n)

    // 根據公式有 n = 2^x,也就是 x = log2n,x即為循環代碼執行次數,所以時間複雜度為O(log2n)
    public void fun(int n){
        int i = 1;
        while(i < n){
            i = i *2
        }
    }
    
  3. 線性階O(n)

    // 一般來說,只要代碼里只有一個循環結構,即輸入規模和執行次數呈線性相關,那這個代碼的時間複雜度就都是O(n) 。
    public void fun(int n){
        for(int i = 0; i < n; i++){
            n+=i;
        }
    }
    
  4. 線性對數階O(nlogn)

    // 可以簡單理解為對數階的程序被放入了循環結構中,也就是n*O(logn),下面的代碼的複雜度就是O(nlog2n)
    public void fun(int n){
        int j = 1;
        for(int i = 0; i < n; i++){
            while(i < n){
                j = j *2
            }
        }
    }
    
  5. 平方階O(n²),立方階O(n3),K次方階O(nk)

    // 平方階可以簡單理解為線性階中嵌套一個線性階,也就是O(logn)*O(logn),下面的代碼複雜度就是O(n^2)
    // 立方階同理,就是三個線性階的嵌套,K次方階同理
    public void fun(int n){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; i++){
    			i=i+j;
            } 
        }
    }
    

五、複雜度的四個概念

  1. 最壞情況時間複雜度:代碼在最理想情況下執行的時間複雜度。
  2. 最好情況時間複雜度:代碼在最壞情況下執行的時間複雜度。
  3. 平均時間複雜度:用代碼在所有情況下執行的次數的加權平均值表示
  4. 均攤時間複雜度:在代碼執行的所有複雜度情況中絕大部分是低級別的複雜度,個別情況是高級別複雜度且發生具有時序關係時,可以將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。

舉個例子:

長度為n的數組查找一個給定元素k

public void fun(int[] arr,int k){
    for(int i = 0; i < arr.length; i++){
        if(arr[i] == k){
            //找到了
        }
    }
}

上面這個方法,最好的情況下元素k就在數組第一位,複雜度為O(1),但是最壞的情況下,元素k在數組最後一位,複雜度為O(n)。

同一段代碼在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述代碼的時間複雜度,我們引入這4個概念,當然,在大多數時候我們是不用特意區分這四種情況的。

六、總結

總結一下如何快速判斷程序的時間複雜度:

  • 只關注循環最多的那部分代碼
  • 總複雜度等於量級最大的那段代碼的複雜度
  • 嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

中國二月電動車銷量增4倍 充電設施市場備具潛力

中國汽車工業協會3月10日披露,2015年2月份我國汽車產銷總量低迷,與上年同期比較,產銷總體微弱下降。資料顯示,今年2月汽車產銷分別完成163.18萬輛和159.33萬輛,比上月分別下降28.7%和31.3%,比上年同期分別下降0.4%和0.2%。   但新能源汽車卻出現井噴式增長。2月新能源汽車生產量達6190輛,銷售量為6045輛,同比分別增長2.7倍和3倍。其中純電動汽車產銷分別完成3061輛和2890輛,同比分別增長2.8倍和4倍;插電式混合動力汽車產銷分別完成3129輛和3155輛,同比分別增長2.7倍和2.4倍。   根據銀河證券的推算,假設到2020年,新能源汽車累計產銷量超過500萬輛。按照一輛車對應1個慢充、0.2個快充計算,預計至2020年將會催生500萬個慢充和100萬個快充的市場需求。隨著充電樁建設加速,充電設備未來投資額將會超過850億元人民幣。充電設施高成長前景已然顯現。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?