標籤: USB CONNECTOR

  • 電動車免牌照稅 可望延長至 2018 年

    為鼓勵購買低汙染的環保車輛,電動汽車將再延長牌照稅免稅期 3 年。包括電動小客車、巴士與貨車,免徵牌照稅優惠將可持續至 2018 年 1 月 5 日為止。   為基於扶植國內電動車研發製造的需要,立法院財政委員會 12 日將審查由行政院提出的用牌照稅法修正草案,授權給地方政府對以電能為動力的電動汽車,免徵牌照稅優惠期間,可以再延長 3 年。經濟日報指出,這項減稅法案可望趕在立法院本會期結束前完成修法程序,以便接續提供減免。   財政部指出,免徵電動車使用照稅優惠措施自 2012 年 1 月 5 日施行至今,國庫釋出的免稅利益將近新台幣 1,000 萬元,平均每年約為 300 萬元。過去 3 年,申請免稅的電動車由 319 輛成長到 574 輛,減稅金額也從約 200 萬元倍增至近 400 萬元。財政部認為,電動車申請免稅案件逐年增加,代表電動車的使用與購買意願也在上升。  

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

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

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

    ※回頭車貨運收費標準

  • python高級-閉包-裝飾器

    閉包內容:

    1. 匿名函數:能夠完成簡單的功能,傳遞這個函數的引用,只有功能

    2. 普通函數:能夠完成複雜的功能,傳遞這個函數的引用,只有功能

    3. 閉包:能夠完成較為複雜的功能,傳遞這個閉包中的函數以及數據,因此傳遞是功能+數據

    4. 對象:能夠完成最複雜的功能,傳遞很多數據+很多功能,因此傳遞的是數據+功能

    ———————————————————

    1. 對全局函數進行修改:在函數當中加global,在閉包中外邊中的變量加nonlocal

    2. 閉包定義:有兩個函數嵌套使用,裏面的函數可以使用外面函數所傳輸的參數,最後可傳遞的是裏面函數的結構與數據(個人理解)。

    3. 最後閉包可以在python中引申出裝飾器 ———————————————————

     1 def closure():
     2     # 在函數內部再定義一個函數,
     3     # 並且這個函數用到了外邊函數的變量,那麼將這個函數以及用到的一些變量稱之為閉包
     4     def closure_in(x):
     5         print('---------我是打不死的%s--------' %x)
     6     return closure_in
     7  8 x = closure()
     9 x('小強')
    10 11 print('*'*20)
    12 # -----加餐---------
    13 def closure_1(a,b,c):
    14     def closure_on(x):
    15         print('-----%s加餐-------' %b)
    16         print(a*x + c)
    17     return closure_on
    18 19 demo = closure_1(2,'小強',3) #傳closure_1函數
    20 demo(4) #傳clsure_on函數
    21 22 #注:函數不加括號,調用的是函數本身【function】;函數加括號,調用的是函數的return結果。

     

    裝飾器內容:

    代碼要遵守‘開放封閉’原則;對已經寫好的函數遵守封閉,對功能擴展遵守開放;

     1 # 裝飾器的作用:為了對原來的代碼上進行擴展
     2 def decoration(func):
     3     def call_func():
     4         print('-------正在裝飾 -------' )
     5         func()
     6     return call_func
     7  8 #@decoration     #--->demo_new = decoration(demo)
     9 def demo():
    10    print('demo----')
    11 12 demo_new = decoration(demo)
    13 demo_new()

     

    使用裝飾器來測試一個函數的運行時:

     1 import time
     2 def set_func(func):
     3     def call_func():
     4         start_time = time.time()
     5         func()
     6         stop_func = time.time()
     7         print(‘alltimes is %f’ %(stop_func-start_fun))
     8     return call_func
     9 @set_func
    10 def test1():
    11     print(‘——-test1———’)    
    12 test1()
    13 14 #等價於:
    15 @set_func==test1 = set_func(test1)
    16

     

    1. 沒有參數,沒有返回值的函數進行裝飾:
     1 def set_func(func):
     2     def call_func():
     3         print(‘———test2——-’)
     4         print(‘———-test3——’)
     5         func()
     6     return call_func
     7     
     8 @set_func
     9 def test1():
    10     print(‘——test1——-   ’)

     

    2. 對有參數無返回值的函數進行裝飾:
     1 def set_func(func):
     2     def call_func(a):  #
     3         print(‘———test2——-’)
     4         print(‘———-test3——’)
     5         func(a) #
     6     return call_func
     7     
     8 @set_func
     9 def test1(num):
    10     print(‘——test1——- %d    ’ %num)
    11 12 test1(100) —->call_func(100)
    13 test1(200)——>call_func(200)

     

    復現裝飾器原理:

    ————————————————————————-

    只要遇到@函數 裝飾器(這句話),在程序中就已經執行了!!
    3. 不定長參數的函數裝飾:
     1 def set_func(func):
     2     def call_func(*args,**kwargs):  #
     3         print(‘———test2——-’)
     4         print(‘———-test3——’)
     5         func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;
     6         #func(args,kwargs)—>不行,相當於傳遞了兩個參數:一個元祖,一個字典。
     7     return call_func
     8     
     9 @set_func
    10 def test1(num,*args,**kwargs):
    11     print(‘——test1——- %d    ’ %num)
    12     print(‘——test1——-   ’ , args)
    13     print(‘——test1——- ’ ,kwargs )
    14     
    15 test1(100)  
    16 test1(100,200)
    17 test1(100,200,300,mm=100)

    注意:*args保存不定長參數,以元祖保存,**kwargs保存字典形式(mm=…)

    4.對應的返回值參數進行裝飾、通用裝飾器:
     1 #通用裝飾器
     2 def set_func(func):
     3     print(“開始進行裝飾———-”)
     4     def call_func(*args,**kwargs):  #
     5         print(‘———test2——-’)
     6         print(‘———-test3——’)
     7         return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。
     8         #func(args,kwargs)—>不行,相當於傳遞了兩個參數:一個元祖,一個字典。
     9     return call_func
    10     
    11 @set_func
    12 def test1(num,*args,**kwargs):
    13     print(‘——test1——- %d    ’ %num)
    14     print(‘——test1——-   ’ , args)
    15     print(‘——test1——- ’ ,kwargs )
    16     return ‘ok’    #—-返回給上面的func(),然後return func—ret
    17     
    18 ret = test1(100)
    19

     

    5. 多個裝飾器對同一個函數進行裝飾:
     1 def add_qx(func):
     2     print(“——開始進行裝飾權限1———-”)
     3     def call_func(*args,**kwargs):  #
     4         print(‘這是權限驗證1’)
     5         return func(*args,**kwargs)
     6     return call_func
     7     
     8  9 def add_xx(func):
    10     print(“——開始進行裝飾xx功能———-”)
    11     def call_func(*args,**kwargs):  #
    12         print(‘這是xx權限驗證’)
    13         return func(*args,**kwargs)
    14     return call_func
    15     
    16 @add_qx
    17 @add_xx
    18 def test1():
    19     print(‘——test1——-’) 
    20 21 test1()
    22

     

    首先執行第一個,但是第一個裝飾器下面不是函數(裝飾器原則:下面必須是函數,否則不執行),所以第一個函數先等待,等第二個裝飾器執行后形成函數在交給第一個裝飾器;所以運行結果是:

    1. 開始進行裝飾xx的功能,

    2. 開始進行裝飾權限1,

    3. 這是權限驗證1,

    4. 這是xx權限驗證,

    5. ——-test1——-,

    ——————裝飾器練習—————- 輸出格式:<td><h1>haha</h1></td>

     1 def set_func_1(func):
     2     def call_func():
     3         return ‘<h1>’ + func() + ’</h1> 4     return call_func
     5     
     6  7 def set_func_2(func):
     8     def call_func():
     9         return ‘<td>’ + func() + ’</td>10     return call_func
    11     
    12 @set_func_1()
    13 @set_func_2()
    14 def get_str():
    15     return ‘haha’
    16     
    17 print(get_str()) 

    18 最後執行的效果: <h1><td>haha</td></h1>
    6. 用類對函數進行裝飾(了解):
     1 class Test(object):
     2     def __init__(self,func):
     3         self.func = fun
     4         
     5     def __call__(self):
     6         print(‘這裡是裝飾器的功能。。。。’)
     7         return self.func()
     8         
     9 @Test
    10 def get_str():
    11     return ‘haha’
    12     
    13 print(get_str())

     

    以上就是裝飾器與閉包的全部內容,希望有所收穫,如果有錯誤,希望指出,感謝!!

     

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

    【其他文章推薦】

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

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

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

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

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

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

  • 常見的索引模型淺析

    常見的索引模型淺析

      索引的出現是為了提高數據庫查詢的效率,就像書的目錄一樣。常見的索引模型有哈希表、有序數組、B+樹。

    • 自適應哈希索引(AHI)

      哈希表是一種常見的數據結構,即通過哈希算法計算出一個数字在表中的位置,並將数字存入該表。哈希索引就是通過哈希表來實現的,一般情況下查找時間複雜度為O(1)。InnoDB會監控對錶上各索引頁的查詢,會自動根據訪問的頻率和模式為某些熱點頁建立哈希索引,所以又叫自適應哈希索引,訪問模式一樣指查詢的條件一樣。

      比如我們維護一張身份證信息和用戶姓名的表,需要根據身份證號查詢姓名,哈希索引大概是這樣的:

      哈希索引適合只有等值查詢的場景,例如select * from T where index_col = ‘##’。哈希索引是無序的,如果需要區間查詢,那就要把所有數據掃描一遍。

    • 有序數組索引

      有序數組在等值查詢和區間查詢場景中效率都很高,同樣用上面的表舉例,索引大概是這樣的:

      要查詢某條數據或者區間的時候,使用二分法時間複雜度為O(logN)。但如果需要在中間更新數據時,那麼就要移動後面所有的數據。有序數組索引只適用於靜態存儲引擎,比如保存2019年度學校所有學生信息。

    • B+樹索引

      B+樹是為磁盤或其他直接存取輔助設備設計的一種平衡查找樹。下面是一顆高度為2的B+樹,所有記錄都在恭弘=叶 恭弘子結點上順序存放,恭弘=叶 恭弘子結點通過指針相連。

      B+樹索引就是B+樹在數據庫中的實現,由於B+索引在數據庫中具有高扇出性,在數據庫中B+樹的高度一般為2~4層。查找某一鍵值的行記錄時最多只需要2~4次IO。以InnoDB的一個整数字段索引為例,這顆B+樹大概是1200叉樹,這裏N叉樹的N取決於數據塊的大小。高度為4的時候就可以存1200的3次方個值,大概為17億。考慮到樹根的數據塊總是在內存中,一個10億行的表上一個整数字段的索引,查找一個值最多只需要訪問3次磁盤。

      在InnoDB存儲引擎中,表是根據主鍵順序存放的。根據恭弘=叶 恭弘子結點內容,B+樹索引又分為聚簇索引和輔助索引。

      • 聚簇索引:按照每張表的主鍵構造一顆B+樹,恭弘=叶 恭弘子結點的key是主鍵值, value是該行的其他字段值,聚簇索引的恭弘=叶 恭弘子結點也稱為數據頁。
      • 輔助索引:恭弘=叶 恭弘子結點的內容是主鍵的值。

    我們用一個例子來說明上面的概念,創建一張表,在字段k上有索引:

    create table T(
    id int primary key, 
    k int not null, 
    name varchar(16),
    index (k))engine=InnoDB;

      表中R1~R5的(ID,k)值分別為(100,1)、(200,2)、(300,3)、(500,5)和(600,6),兩顆B+樹如下,可以明顯看到這兩個顆樹的區別。

      使用普通索引查詢時,例如 select * from T where k = 2,需要先搜索k索引樹,得到ID的值為200;再到ID索引搜索一次。這個過程就叫做回表,非主鍵索引查詢需要多搜索一棵樹。

      參考資料:《MySQL實戰45講》

           《MySQL技術內幕:InnoDB存儲引擎》第二版

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

    ※台北網頁設計公司全省服務真心推薦

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 4. union-find算法

    4. union-find算法

      算法的主題思想:

      1.優秀的算法因為能夠解決實際問題而變得更為重要;

      2.高效算法的代碼也可以很簡單;

      3.理解某個實現的性能特點是一個挑戰;

      4.在解決同一個問題的多種算法之間進行選擇時,科學方法是一種重要的工具;

      5.迭代式改進能夠讓算法的效率越來越高效;

     

       1. 動態連通性

      動態連接:輸入是一對整數對的序列,其中每個整數代表某種類型的對象(或觸點),我們將整數對p q 解釋為意味着p連接到q。我們假設“連接到”是等價關係:

      對稱性:如果p連接到q,則q 連接到p。

      傳遞性:如果p連接到q且q 連接到r,則p連接到r。
      自反性:p與p連接。
      等價關係將對象劃分為多個等價類 或連接的組件。等價類稱為連通分量或分量。
      我們的目標是編寫一個程序,以從序列中過濾掉多餘的對:當程序從輸入中讀取整數對 p q時,只有在該對點不等價的情況下,才應將對寫入到輸出中,並且將p連接到q。如果等價,則程序應忽略整數對pq 並繼續讀取下對。

      

     

      動態連通性問題的應用:

        1.網絡

        2.變量名等價性

        3.數學集合

          在更高的抽象層次上,可以將輸入的所有整數看做屬於不同的數學集合。

       2. 定義問題

      設計算法的第一個任務就是精確地定義問題。

      算法解決的問題越大,它完成任務所需的時間和空間可能越多。我們不可能預先知道這其間的量化關係,通常只會在發現解決問題很困難,或是代價巨大,或是發現算法所提供的信息比原問題所需要的更加有用時修改問題。例如,連通性問題只要求我們的程序能夠判斷出給定的整數對是否相連,但並沒有要求給出兩者之間的通路上的所有連接。這樣的要求更難,並會得出另一組不同的算法。

      為了定義和說明問題,先設計一份API  來封裝基本操作: 初始化,連接兩個觸點,查找某個觸點的分量 ,判斷兩個觸點是否屬於同一分量,分量的數量:

        /// <summary>
        /// 動態連通API
        /// </summary>
        public interface IUnionFind
        {
            /// <summary>
            /// 連接
            /// </summary>
            /// <param name="p"></param>
            /// <param name="q"></param>
            void Union(int p, int q);
    
            /// <summary>
            /// 查找觸點 p 的分量標識符
            /// </summary>
            /// <param name="p"></param>
            /// <returns></returns>
            int Find(int p);
    
            /// <summary>
            /// 判斷兩個觸點是否處於同一分量
            /// </summary>
            /// <param name="p"></param>
            /// <param name="q"></param>
            /// <returns></returns>
            bool Connected(int p, int q);
    
            /// <summary>
            /// 連通分量的數量
            /// </summary>
            /// <returns></returns>
            int Count();
        }

      為解決動態連通性問題設計算法的任務轉化為實現這份API:

        1. 定義一種數據結構表示已知的連接;

        2. 基於此數據結構高效的實現API的方法;

      數據結構的性質會直接影響算法的效率。這裏,觸點為索引,觸點和連接分量都是用 int 值表示,將會使用分量中某個觸點的值作為分量的標識符。所以,一開始,每個觸點都是只含有自己的分量,分量標識符為觸點的值。由此,可以初步實現一部分方法:

     

        public class FirstUnionFind:IUnionFind
        {
            private int[] id;//* 分量id 以觸點作為索引
            private int count;//分量數量
    
            public FirstUnionFind(int n)
            {
                count = n;
                id = new int[n];
                for (var i = 0; i < n; i++)
                {
                    id[i] = i; // 第一個 i 作為觸點,第二個 i 作為觸點的值
                }
            }
    
            public int Count()
            {
                return count;
            }
    
            public bool Connected(int p, int q)
            {
                return Find(p) == Find(q);
            }
    
            public int Find(int p)
            {
                
            }
    
            public void Union(int p, int q)
            {
                
            }
        }

     

      Union-find 的成本模型 是數組的訪問次數(無論讀寫)。

       3. quick-find算法實現

      quick-find 算法是保證當且僅當 id[p] 等於 id[q] 時,p 和 q 是連通的。也就是說,在同一個連通分量中的所有觸點在 id[ ] 中的值全部相等。

      所以 Find 方法只需返回 id[q],Union 方法需要先判斷 Find(p)  是否等於 Find(q) ,若相等直接返回;若不相等,需要將 q 所在的連通分量中所有觸點的 id [ ] 值全部更新為 id[p]。

        public class QuickFindUF: IUnionFind
        {
            private int[] id;//* 分量id 以觸點作為索引
            private int count;//分量數量
    
            public QuickFindUF(int n)
            {
                count = n;
                id = new int[n];
                for (var i = 0; i < n; i++)
                {
                    id[i] = i; // 第一個 i 作為觸點,第二個 i 作為觸點的值
                }
            }
    
            public int Count()
            {
                return count;
            }
    
            public bool Connected(int p, int q)
            {
                return Find(p) == Find(q);
            }
    
            public int Find(int p)
            {
                return id[p];
            }
    
            public void Union(int p, int q)
            {
                var pID = Find(p);
                var qID = Find(q);
    
                if (pID == qID)
                    return;
    
                for (var i = 0; i < id.Length; i++)
                {
                    if (id[i] == qID)
                        id[i] = pID;
                }
                count--; //連通分量減少
            }
    
            public void Show()
            {
                for(var i = 0;i<id.Length;i++)
                    Console.WriteLine("索引:"+i+",值:"+ id[i] );
                Console.WriteLine("連通分量數量:"+count);
            }
        }

      

      算法分析

      Find() 方法只需訪問一次數組,所以速度很快。但是對於處理大型問題,每對輸入 Union() 方法都需要掃描整個數組。

      每一次歸併兩個分量的 Union() 方法訪問數組的次數在 N+3 到 2N+1 之間。由代碼可知,兩次 Find 操作訪問兩次數組,掃描數組會訪問N次,改變其中一個分量中所有觸點的值需要訪問 1 到 N – 1 次(最好情況是該分量中只有一個觸點,最壞情況是該分量中有 N – 1個觸點),2+N+N-1。

      如果使用quick-find 算法來解決動態連通性問題並且最後只得到一個連通分量,至少需要調用 N-1 次Union() 方法,那麼至少需要 (N+3)(N-1) ~ N^2 次訪問數組,是平方級別的。

     

       4. quick-union算法實現

      quick-union 算法重點提高 union 方法的速度,它也是基於相同的數據結構 — 已觸點為索引的 id[ ] 數組,但是 id[ ] 的值是同一分量中另一觸點的索引(名稱),也可能是自己(根觸點)——這種聯繫成為鏈接。

      在實現 Find() 方法時,從給定觸點,鏈接到另一個觸點,知道到達根觸點,即鏈接指向自己。同時修改 Union() 方法,分別找到 p q 的根觸點,將其中一個根觸點鏈接到根觸點。

    public class QuickUnionUF : IUnionFind
        {
            private int[] id;
            private int count;
    
            public QuickUnionUF(int n)
            {
                count = n;
                id = new int[n];
                for (var i = 0; i < n; i++)
                {
                    id[i] = i; // 第一個 i 作為觸點,第二個 i 作為觸點的值
                }
            }
    
            public int Count()
            {
                return count;
            }
    
            public bool Connected(int p, int q)
            {
                return Find(p) == Find(q);
            }
    
            public int Find(int p)
            {
                while (p != id[p])
                    p = id[p];
                return p;
            }
    
            public void Union(int p, int q)
            {
                var pRoot = Find(p);
                var qRoot = Find(q);
    
                if (pRoot == qRoot)
                    return;
    
                id[pRoot] =qRoot;
    count
    --; //連通分量減少 } public void Show() { for (var i = 0; i < id.Length; i++) Console.WriteLine("索引:" + i + ",值:" + id[i]); Console.WriteLine("連通分量數量:" + count); } }

      

      森林表示

      id[ ] 數組用父鏈接的形式表示一片森林,用節點表示觸點。無論從任何觸點所對應的節點隨着鏈接查找,最後都將到達含有該節點的根節點。初始化數組之後,每個節點的鏈接都指向自己。

     

      算法分析

      定義:一棵樹的大小是它的節點的數量。樹中一個節點的深度是它到根節點的路徑上鏈接數。樹的高度是它的所有節點中的最大深度。

      quick-union 算法比 quick-find 算法更快,因為它對每對輸入不需要遍歷整個數組。

      分析quick-union 算法的成本比 quick-find 算法的成本要困難,因為quick-union 算法依賴於輸入的特點。在最好的情況下,find() 方法只需訪問一次數組就可以得到一個觸點的分量表示;在最壞情況下,需要 2i+1 次數組訪問(i 時觸點的深度)。由此得出,該算法解決動態連通性問題,在最佳情況下的運行時間是線性級別,最壞情況下的輸入是平方級別。解決了 quick-find 算法中 union() 方法總是線性級別,解決動態連通性問題總是平方級別。

      quick-union 算法中 find() 方法訪問數組的次數為 1(到達根節點只需訪問一次) 加上 給定觸點所對應節點的深度的兩倍(while 循環,一次讀,一次寫)。union() 訪問兩次 find() ,如果兩個觸點不在同一分量還需加一次寫數組。

       假設輸入的整數對是有序的 0-1, 0-2,0-3 等,N-1 對之後N個觸點將全部處於相同的集合之中,且得到的樹的高度為 N-1。由上可知,對於整數對 0-i , find() 訪問數組的次數為 2i + 1,因此,處理 N 對整數對所需的所有訪問數組的總次數為 3+5+7+ ……+(2N+1) ~ n^2

      

      

      5.加權 quick-union 算法實現

      簡單改動就可以避免 quick-union算法 出現最壞情況。quick-union算法 union 方法是隨意將一棵樹連接到另一棵樹,改為總是將小樹連接到大樹,這需要記錄每一棵樹的大小,稱為加權quick-union算法。

      代碼:

        public class WeightedQuickUnionUF: IUnionFind
        {
            int[] sz;//以觸點為索引的 各個根節點對應的分量樹大小
            private int[] id;
            private int count;
    
            public WeightedQuickUnionUF(int n)
            {
                count = n;
                id = new int[n];
                sz = new int[n];
                for (var i = 0; i < n; i++)
                {
                    id[i] = i; // 第一個 i 作為觸點,第二個 i 作為觸點的值
                    sz[i] = 1;
                }
            }
    
            public int Count()
            {
                return count;
            }
    
            public bool Connected(int p, int q)
            {
                return Find(p) == Find(q);
            }
    
            public int Find(int p)
            {
                while (p != id[p])
                    p = id[p];
                return p;
            }
    
            public void Union(int p, int q)
            {
                var pRoot = Find(p);
                var qRoot = Find(q);
    
                if (pRoot == qRoot)
                    return;
    
                if (sz[pRoot] < sz[qRoot])
                {
                    id[pRoot] = qRoot;
                }
                else
                {
                    id[qRoot] = pRoot;
                }
                    
                count--; //連通分量減少
            }
    
            public void Show()
            {
                for (var i = 0; i < id.Length; i++)
                    Console.WriteLine("索引:" + i + ",值:" + id[i]);
                Console.WriteLine("連通分量數量:" + count);
            }
        }

     

      算法分析

      加權 quicj-union 算法最壞的情況:

      

      這種情況,將要被歸併的樹的大小總是相等的(且總是 2 的 冥),都含有 2^n 個節點,高度都正好是 n 。當歸併兩個含有 2^n 個節點的樹時,得到的樹含有 2 ^ n+1 個節點,高度增加到 n+1 。

      節點大小: 1  2  4  8  2^k = N

      高       度: 0  1  2  3  k

      k = logN

      所以加權 quick-union 算法可以保證對數級別的性能。

      對於 N 個觸點,加權 quick-union 算法構造的森林中的任意節點的深度最多為logN。

      對於加權 quick-union 算法 和 N 個觸點,在最壞情況下 find,connected 和 union 方法的成本的增長量級為 logN。

      對於動態連通性問題,加權 quick-union 算法 是三種算法中唯一可以用於解決大型問題的算法。加權 quick-union 算法 處理 N 個觸點和 M 條連接時最多訪問數組 c M logN 次,其中 c 為常數。

      

      三個算法處理一百萬個觸點運行時間對比:

      

      

      三個算法性能特點:

     

      6.最優算法 – 路徑壓縮

      在檢查節點的同時將它們直接連接到根節點。

      實現:為 find 方法添加一個循環,將在路徑上的所有節點都直接鏈接到根節點。完全扁平化的樹。

     

      

      研究各種基礎問題的基本步驟:

      1. 完整而詳細地定義問題,找出解決問題所必須的基本抽象操作並定義一份API。

      2. 簡潔地實現一種初級算法,給出一個精心組織的開發用例並使用實際數據作為輸入。

      3. 當實現所能解決的問題的最大規模達不到期望時決定改進還是放棄。

      4. 逐步改進實現,通過經驗性分析和數學分析驗證改進后的效果。

      5. 用更高層次的抽象表示數據結構或算法來設計更高級的改進版本。

      6. 如果可能盡量為最壞情況下的性能提供保證,但在處理普通數據時也要有良好的性能。

      7.在適當的時候將更細緻的深入研究留給有經驗的研究者並解決下一個問題。

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

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

    ※回頭車貨運收費標準

  • 高雄鼓勵換電動機車 最高補助額達 2.3 萬

    高雄市機車總數達 201 萬輛,成為都市的污染源之一,為了鼓勵機車族更換電動機車,高雄市政府環保局推動補助政策,換車最高可獲得 2.3 萬元的補助。   高雄市政府環境保護局空噪科長鄭嵐 26 日下午表示,根據交通部機動車輛統計資料,高雄市截至 103 年 12 月底掛牌的使用中機車,總數約 201 萬輛,為鼓勵民眾汰舊換購電動車輛,高雄市環保局持續推動淘汰補助方案,除了經濟部工業局補助純購電動機車,機車族可獲得補助 7,200 元到 10,000 元外,若搭配汰舊二行程機車,再加碼補助至 17,400 元到 23,000 元。   他表示,同時,為了提升友善充電環境,高雄環保局近年來也積極推動充電站架設,除了原有公用及私有充電站,103 年完成社區大樓與電動機車經銷商等 25 座,共有充電站 217 站,讓高雄市騎乘電動車市民處處皆有電可充,建構低碳生活圈。

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

    【其他文章推薦】

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

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

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

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

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

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

  • 中興攜手國家電網組合資公司 建成都無線汽車充電站

    中興子公司中興新能源汽車與國家電網四川省電力公司達成協議,將在成都組建合資公司。此合資公司在傳統集中式充電模式的基礎上分佈式建設無線汽車充電站,第一批支援無線充電的社區巴士同日會在成都正式投入運營。   除社區巴士外,中興還將逐步推廣支持無線充電的大型公車專案,而房車的無線充電技術亦已成熟,用戶如有條件和需要,可對房車和停車廠進行改造,即可享有無線充電功能。

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

    ※台北網頁設計公司全省服務真心推薦

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 新能源汽車入北京 改為備案制

    在中國的全球新能源汽車大會上,北京市科委新能源與新材料處處長許心超透露,北京市新能源汽車準入方式有所調整,由先前的新能源汽車目錄方式改為備案方式,車型只要備案即可在北京銷售、上牌。   先前規定,按照《北京市示範應用新能源小客車生企業及品目錄》,北京市共有 7 款新能源汽車可在備案之後直接銷售、上牌。而這次許心超表示,按照中央的要求,準入方式也在改變,主要採取備案制,只要備案了就可銷售,政府則加強事後監管。
    這意味著所有中國純電動汽車都可以進京銷售、上牌,享受財政補貼,而不再像以前必須要先進入嚴格的北京市新能源汽車目錄。   另一方面,為了讓純電動汽車的使用者迅速找到充電樁,相關部門也在進行改進,一是和百度合作,標注所有充電樁的電子地圖將很快上線;二是印製北京充電樁地圖;三是辦充電體驗周活動,在 2 月 2 日至 6 日,將分 2 次聯合所有北京的汽車企業,做充電實際體驗。

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

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

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

    ※回頭車貨運收費標準

  • 發展電動車 梅克爾盼德國2030年前設百萬充電站

    摘錄自2019年11月3日中央通訊社德國報導

    德國總理梅克爾4日將與本國汽車工業代表會商,討論如何加速發展低碳排的電池驅動交通工具。她3日透過影片表示,德國在2030年前應設置100萬座電動車充電站。

    德國境內目前僅有約2萬座電動車公共充電站。梅克爾指出:「為達此(發展電動車)目的,我們想在2030年前設置100萬座充電站,而產業界將必須加入相關計畫。我們要談的就是這個。」

    路透社報導,預定明天在總理府舉行的會議,將是為相關議題舉辦的第二場,涉及儘速採取行動,以期交通運輸產業為德國達成國家碳排減量目標做出貢獻。會議將聚焦於汽油和柴油的替代方案,其中包括氫燃料和電池,以及政府和業界如何分攤給予消費者的補助,以刺激相關產品買氣。

    梅克爾表示,政府也將致力於保障就業機會。

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

    【其他文章推薦】

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

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

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

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

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

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

  • 巴西浮油事件3個月 污染擴至座頭鯨保育區

    巴西浮油事件3個月 污染擴至座頭鯨保育區

    摘錄自2019年11月3日中央通訊社巴西報導

    巴西東北巴伊亞州(Bahia)外海阿布羅略斯(Abrolhos)群島四周,有著巴西最豐富的海洋多樣性。群島中一座國家公園有著罕見珊瑚群、海鳥以及座頭鯨繁殖地。巴西海軍3日通報,困擾巴西海岸3個月的浮油污染已飄到座頭鯨保育區,嚴重污染生物多樣性豐富的群島地區,背後的環境及經濟破壞目前還無法量化。海軍在聲明中表示,海軍船艦清理的油污有部分在海洋中,有部分則在海灘上。

    這些油污3個月前開始出現在巴西東北部外海,巴西著名2000公里海岸線上的200多個海灘都遭油漬污染。船員及志工已在海灘上清出數噸重的原油。巴西官員說,目前還無法量化油漬造成的環境及經濟破壞。

    巴西政府2日點名一艘掛有希臘旗幟的油輪布普林納號(Bouboulina)是主要嫌疑犯,說這艘油輪當時從委內瑞拉載石油前往新加坡。巴西國家太空署(Inpe)2日表示,海中仍可能有油污在洋流推動下,南下至巴西東南的聖靈州(Espiritu Santo)及里約熱內盧州(Rio De Janeiro)。

    清理污染的志工。照片來源: Kleber from Burgos / WWF-Brasil

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

    ※台北網頁設計公司全省服務真心推薦

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

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 「寂靜的春天」預言實現了 研究發現新菸鹼類影響水生物和魚群

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

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

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

    ※回頭車貨運收費標準