快速排序的離散數學分析

来源:http://www.cnblogs.com/joey-hua/archive/2016/01/13/5128301.html
-Advertisement-
Play Games

QUICKSORT(A,p,r)1 if pA[i]3 return PARTITION(A,p,r)PARTITION(A,p,r)1 x=A[r]2 i=p-13 for j=p to r-14 do if A[j]A[j]7 exchange A[i+1]A[r]8 re...


QUICKSORT(A,p,r)
1  if p<r
2     then q = PARTITION(A,p,r)
3         QUICKSORT(A,p,q-1)
4         QUICKSORT(A,q+1,r)

RANDOMIZED-PARTITION(A,p,r)
1  i=RANDOM(p,r)
2  exchange A[r]<->A[i]
3  return PARTITION(A,p,r)

PARTITION(A,p,r)
1  x=A[r]
2  i=p-1
3  for j=p to r-1
4     do if A[j]<=x
5         then i=i+1
6            exchange A[i]<->A[j]
7  exchange A[i+1]<->A[r]
8  return i+1

這裡為了效率更高效,把切分值改成隨機化,演算法原碼請參考 演算法-5.快速排序

1.最壞情況分析

如果快速排序中每一層遞歸上所做的都是最壞情況劃分,則運行時間為Θ(n2)。從直覺上看,這就是最壞情況運行時間。下麵來證明。

利用代換法,可以證明快速排序的運行時間為O(n2)。設T(n)是過程QUICKSORT作用於規模為n的輸入上的最壞情況時間,則有:

  (遞歸式1)

其中參數q由0變到n-1,這是因為過程PARTITION產生兩個子問題,總的大小為n-1.我們猜測T(n)<=cn2成立,c為某個常數。將此式代入遞歸式1,得:

表達式q2+(n-q-1)2在參數的取值區間0<=q<=n-1的某個端點上取得最大值,因為該式關於q的二階導數是正的(所以原表達式是凹函數,並且當q=(n-1)/2時為最小值)。這樣,就有界

對T(n)就有:

因為我們可以選擇足夠大的常數c,使得項c(2n-1)能支配Θ(n)。於是,快速排序的(最壞情況)運行時間為Θ(n2)。

2.期望的運行時間(即平均運行時間)

設當QUICKSORT在一個包含n個元素的數組上運行時,PARTITION在第4行中所做比較的總次數為X。那麼,QUICKSORT的運行時間為O(n+X)。證明:

根據對PARTITION的調用共有n次。每一次調用都需做固定量的工作,再執行若幹次for迴圈。在for迴圈的每一輪迭代中,都要執行第4行。

我們的目標是計算出X,即在對PARTITION的所有調用中,所執行的總的比較次數。我們並不打算分析在每一次PARTITION調用中做了多少次比較,而是希望導出關於總的比較次數的一個界。為了達到這一目的,我們必須瞭解演算法在何時要對數組中的兩個元素進行比較,何時不進行比較。為了便於分析,我們將數組A的各個元素重新命名為z1,z2,...,zn,其中z是數組A中第i個最小的元素。此外,我們還定義Zij={zi, zi+1, ... ,zj}為z與z之間(包含這兩個元素)的元素集合。

那麼,演算法何時會比較z與z呢?為了回答這個問題,我們首先觀察到每一對元素至多比較一次。這是為什麼呢?因為各個元素僅與主元元素進行比較,並且,在某一次PARTITION調用結束之後,該次調用中所用到的主元元素就再也不會與任何其他元素進行比較了。

我們的分析要用到指示器隨機變數,我們定義

我們要考慮的是在演算法的執行過程中,是否有任何的比較發生,而不是在迴圈的一次迭代或對PARTITION的一次調用中是否有比較發生。因為每一對元素至多被比較一次,因而,我們可以很容易地刻划算法所執行的總的比較次數:

對上式兩邊取期望值,再利用期望值的線性特性和引理1,可以得到:

在上式中,Pr{z與z進行比較}還有待於進一步計算。

一般而言,一旦一個滿足zi<x<z的主元x被選擇後,我們知道,z與z以後是再也不可能進行比較了。另一方面,如果z在Zij 中的所有其他元素之前被選為主元,那麼z就將與Zij 中的除了它自己以外的所有元素進行比較。類似地,如果z在Zij 中其他元素之前被選為主元,那麼z將與Zij 中除自身以外的每項進行比較。由此我們知道,z會與z進行比較,當且僅當Zij中將被選作主元的第一個元素是z或zj

我們現在來計算這一事件發生的概率。在Zij中的某一元素被選為主元之前,集合Zij 整個都是在同一划分中的。於是,Zij中的任何元素都會等可能地被首先選為主元。因為集合Zij中共有j-i+1個元素,所以,任何元素被首先選為主元的概率是1/(j-i+1)。於是,我們有:

上式中的第二行成立是因為其中涉及的兩個事件是互斥的。將等式綜合起來,有:

在求這個和式時,可以將變數作個變換(k=j-i),並利用等式1中給出的有關調和級數的界:

                                               

                                                

於是,我們可以得出結論,即利用RANDOMIZED-PARTITION,快速排序演算法期望的運行時間為O(nlgn)。

 

引理1:給定樣本空間S和S中的事件A,令XA=I{A},則E[XA]=Pr{A}

等式1:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近自己在做一個小系統玩的時候涉及到了文件的上傳,於是在網上找到Java上傳文件的方案,最後確定使用common-fileupload實現上傳操作。需求說明用戶添加頁面有一個“上傳”按鈕,點擊按鈕彈出上傳界面,上傳完成後關閉上傳界面。所需Jar包commons.fileupload-1.2.0.ja...
  • Hadoop7天課程 課程體系 Day01>>>>>>>>>>>>>>>>>>>> hadoop項目簡介 hadoop簡介 hadoop前景 apache的開源項目 解決問題:(核心) 海量數據的存儲(HDFS) ---Hadoop分散式文件系統,解決機器怎麼存儲 海量數據的分析(MapReduce...
  • http://www.2cto.com/database/201204/126772.html
  • 本文目錄列表:1、基於當前日的小時數和分鐘數2、mysqlunix_timestamp和from_unixtime的mssql實現3、總結語4、參考清單列表基於當前日的小時數和分鐘數 平時工作中遇到過一天內個時間段的用戶登錄情況的需求,也有針對每個小時內的分鐘段內的用戶的活躍度的需求,很多類似的需求...
  • 手冊上只說了truncate table不能截斷由外鍵約束引用的表。也沒給個例子。我自己寫一個吧。 還空著那麼多地方,也沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站站長。
  • 重覆記錄:有兩個意義上的重覆記錄 一是完全重覆的記錄,也即所有欄位均重覆的記錄; 二是部分關鍵欄位重覆的記錄,比如Name欄位重覆,而其他欄位不一定重覆或都重覆可以忽略。 1、對於第一種重覆,比較容易解決,使用1 select distinct * from tableName 就可以得...
  • Softmax是機器學習中最常用的輸出函數之一,網上有很多資料介紹它是什麼以及它的用法,但卻沒有資料來介紹它背後的原理。本文首先簡單地介紹一下Softmax,然後著重從數學分析的角度來分析一下它背後的原理。
  • 今天花了些時間整理了下MySQL中分別查找當天、昨天、近一周、近一個月等等時間段數據的代碼1、查詢今天數據的語句select * frim 表名 where to_days(時間欄位名)==to_days(now());select now();//獲得當前時間 格式:2016-01-12 2...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...