<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 117  文章 - 72  trackbacks - 0

    聲明:原創(chuàng)作品(標(biāo)有[原]字樣)轉(zhuǎn)載時請注明出處,謝謝。

    常用鏈接

    常用設(shè)置
    常用軟件
    常用命令
     

    訂閱

    訂閱

    留言簿(7)

    隨筆分類(130)

    隨筆檔案(123)

    搜索

    •  

    積分與排名

    • 積分 - 155764
    • 排名 - 390

    最新評論

    一、主元素問題
        設(shè)T[0..n-1]n個元素的數(shù)組。對任一元素x,設(shè)S(x)={i|T[i]=x}。當(dāng)|S(x)|>n/2時,稱xT的主元素。
    1) 如果T中元素存在序關(guān)系,按分治策略設(shè)計并實現(xiàn)一個線性時間算法,確定T[0..n-1]是否有一個主元素。
    2) T中元素不存在序關(guān)系,只能測試任意兩個元素是否相等,試設(shè)計并實現(xiàn)一個O(nlogn)有效算法,確定T是否有一個主元素。進一步,能找到一個線性時間算法嗎?
    注:實現(xiàn)的算法要求列出足夠的實驗結(jié)果。
     
    1)  基于分治法的線性時間求主元素算法
       算法思想
    中位數(shù):數(shù)列排序后位于最中間的那個數(shù)。如果一個數(shù)列有主元素,那么必然是其中位數(shù)。求一個數(shù)列有沒有主元素,只要看中位數(shù)是不是主元素。
    找中位數(shù)的方法:選擇一個元素作為劃分起點,然后用快速排序的方法將小于它的移動到左邊,大于它的移動到右邊。這樣就將元素劃分為兩個部分。此時,劃分元素所在位置為k。如果k>n/2,那么繼續(xù)用同樣的方法在左邊部分找;如果k<n/2就在右邊部分找;k=n/2就找到了中位元素。
    根據(jù)快速排序的思想,可以在平均時間復(fù)雜度為O(n)的時間內(nèi)找出一個數(shù)列的中位數(shù)。然后再用O(n)的時間檢查它是否是主元素。
       算法實現(xiàn)
    對應(yīng)的Java程序在MajorElement.java
    ----------------------------------------------------------------------------------------
    判斷是否是主元素的偽代碼:
    master(A):
          len length[A]
          median randomizedSelect(A , 0 , n - 1 , n/2); ?求中位數(shù)
          cnt 0
          ?計算中位數(shù)出現(xiàn)次數(shù)
          for i 0 to len – 1
            do if A[i] = median
                   then cnt cnt + 1
          if cnt > n/2
            then print "主元素:" +median + "出現(xiàn)次數(shù):" + cnt
            else print "無主元素"
    ----------------------------------------------------------------------------------------
    找一個序列中第k大的數(shù)偽代碼
    randomizedSelect(A , p , q , k):
          r randomizedPartition (p , q)  ?找出劃分元素r
          if r = k
            then return A[r]
            else if r > k
                       then randomizedSelect(A , p , r – 1, k)
                       else randomizedSelect(A , r + 1 , q , k)
    ----------------------------------------------------------------------------------------
    實現(xiàn)隨機劃分的偽代碼:
    randomizedPartition(A , p , q ):
          rand
    random(p , q)
          exchange A[rand] A[q]
          return partition(p , q)
    ----------------------------------------------------------------------------------------
    基于快速排序思想的劃分偽代碼:
    partition(A , p , q ):
          pivot A[q]
          i p – 1
          for j p to q – 1
               do if A[j] <= pivot
                    then i i + 1
                                exchange A[i] A[j]
          exchange A[i + 1] A[q]
          return i + 1
    ----------------------------------------------------------------------------------------
       時間復(fù)雜度分析
    master()中求中位數(shù)可以在平均時間復(fù)雜度為O(n)的時間內(nèi)完成,檢查中位數(shù)是否是主元素耗時O(n),所以時間復(fù)雜度為O(n)
     
    2) 無序關(guān)系時求主元素的O(nlgn)的算法
       算法思想
        中存在主元素,則將分為兩部分后,的主元素也必為兩部分中至少一部分的主元素,因此可用分治法。
    將元素劃分為兩部分,遞歸地檢查兩部分有無主元素。算法如下:
    a. 只含一個元素,則此元素就是主元素,返回此數(shù)。
          b. 分為兩部分T1 T2(二者元素個數(shù)相等或只差一個),分別遞歸調(diào)用此方法求其主元素m1 m2
          c. m1 m2 都存在且相等,則這個數(shù)就是的主元素,返回此數(shù)。
    d. m1 m2 都存在且不等,則分別檢查這兩個數(shù)是否為的主元素,若有則返回此數(shù),若無則返回空值。
    e. m1 m2 只有一個存在,則檢查這個數(shù)是否為的主元素,若是則返回此數(shù),若否就返回空值。
    f. m1 m2 都不存在,則無主元素,返回空值。
       算法實現(xiàn)
    相應(yīng)的Java程序在MasterElement.java
    -----------------------------------------------------------------------------------------
    O(nlgn)的算法偽代碼:
    ?求T[p..q]中的主元素。返回主元素及其出現(xiàn)次數(shù)或空(表示無主元素)
    CheckMaster(T , p , q):
          if p ← q
               then return T[p] and 1
          len ← q – p + 1
          r ← p + len / 2
          a and numa ← CheckMaster(T , p , r – 1)
          b and numb ← CheckMaster(T , r , q)
         
          if a = NIL and b = NIL
               then return NIL
          if a = NIL and b NIL
               then return CheckAnotherPart(T , len , p , r – 1 , b , numb)
          if a NIL and b = NIL
               then return CheckAnotherPart(T , len , r , q , a , numa)
          if a NIL and b NIL
    then if a = b
               then numa ← numa + numb
                      return a and numa
                          else re ← CheckAnotherPart(T , len , p , r – 1 , b ,numb)
                                 if re NIL
                                     then return re
                                      else return CheckAnotherPart(T, len, r, q, a, numa)
    -----------------------------------------------------------------------------------------
    ?檢查候選主元素是否是主元素
    CheckAnotherPart(T , len , p , q , c , numc):
          numc ← CheckNum(T , p , q , c) + numc
          if num > len/2
               then return c and numc
               else return NIL
    -----------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------
    ?計算T[p..q]element出現(xiàn)的次數(shù)
    CheckNum( T , p , q , element):
          cnt ← 0
          for i ← p to q
               do if T[i] = element
                          then cnt ← cnt + 1
          return cnt
    ----------------------------------------------------------------------------------------
       時間復(fù)雜度分析
    T(n)=2T(n/2)+n  
    所以時間復(fù)雜度為O(nlgn)
     
     
    3)無序關(guān)系時求主元素的O(n)算法
       算法思想
    在一個集合中,刪除兩個不同的數(shù),則集合的主元素保持不變。根據(jù)這個原理,可以很快求出主元素。
       算法實現(xiàn)
    -------------------------------------------------------------------------------------
    相應(yīng)的Java程序在MainElement.java
    master(A):
          n ← length[A]
          count ← 1
          seed ← A[0]
          ?找候選主元素
          for i ← 1 to n – 1
               do if A[i] = seed
                       then count ← count + 1
                       else if count > 0
                                  then count ← count – 1
                                  else seed ← A[i]
          ?查找候選主元素是否是主元素
          count ← 0
          for i ← 0 to n – 1
            do if A[i] = seed
                   then count ← count + 1
          if count > n/2
            then return seed and count
            else return NIL
    -------------------------------------------------------------------------------------
       時間復(fù)雜度分析
    時間復(fù)雜度為O(n)
     
     
    4)算法測試
    對前面三個求主元素算法,使用測試數(shù)據(jù)進行測試:
    測試數(shù)組
    結(jié)果
    0,0,1,1,0,8,1,1,1
    主元素:1出現(xiàn)次數(shù):5
    13,17,26,3,5,2,17,3
    無主元素
    1,2,3,4,5,6,7,8
    無主元素
    1,0,0,1,0,2,0
    主元素:0 出現(xiàn)次數(shù):4
    1,3,4,1,2,1,1,4,0,1,1,1
    主元素:1 出現(xiàn)次數(shù):7
    0,1,1
    主元素:1 出現(xiàn)次數(shù):2
    13,17,26,3,5,2,17,3,3,3,3,3,3
    主元素:3 出現(xiàn)次數(shù):7
    100,58
    無主元素
    597
    主元素:597 出現(xiàn)次數(shù):1
    6,1,2,2,2,3,5
    無主元素
    7,7,7,7,7,7
    主元素7  出現(xiàn)次數(shù):6
    5,9,45,96,77,28,13
    無主元素

    文章來源:http://wintys.blog.51cto.com/425414/100688
    主元素.zip
    posted on 2009-03-18 12:02 天堂露珠 閱讀(599) 評論(0)  編輯  收藏 所屬分類: Algorithm
    主站蜘蛛池模板: 久久乐国产综合亚洲精品| 国产成人精品免费久久久久| 福利免费在线观看| 成人免费视频国产| 亚洲欧洲国产精品久久| 国内精品一级毛片免费看| 中文字幕在线亚洲精品| 亚洲欧美日韩中文无线码 | 国产精品亚洲а∨无码播放| 亚洲AV永久无码精品网站在线观看| 久久午夜无码免费| 亚洲精品自偷自拍无码| 亚洲精品国产精品乱码不99| 亚洲免费综合色在线视频| 2022年亚洲午夜一区二区福利| 中文字幕无码免费久久9一区9| 亚洲制服丝袜精品久久| 蜜臀AV免费一区二区三区| 亚洲成人午夜在线| 丝袜捆绑调教视频免费区| 亚洲精品福利你懂| 日本免费人成视频播放| 久久午夜夜伦鲁鲁片无码免费| 无码天堂亚洲国产AV| 四虎精品亚洲一区二区三区| 美景之屋4在线未删减免费| 午夜神器成在线人成在线人免费| 亚洲国产区男人本色在线观看| 伊人久久精品亚洲午夜| 女人被男人躁的女爽免费视频| 免费不卡在线观看AV| 久久久久亚洲av无码专区导航| 日本片免费观看一区二区| 亚洲va久久久久| 亚洲福利在线视频| 狠狠色婷婷狠狠狠亚洲综合| 久久免费观看国产精品| 一级毛片免费视频网站| 亚洲成a人片在线观看无码| 亚洲免费网站在线观看| 国内精品久久久久影院免费|