日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法图解第四章笔记与习题(快速排序)

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法图解第四章笔记与习题(快速排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法圖解第四章筆記與習題(快速排序)

文章目錄

  • 算法圖解第四章筆記與習題(快速排序)
    • 4.1 分而治之
    • 4.2 快速排序
    • 4.3 大$O$表示法的平均情況和最糟情況
    • 4.4 小結
    • 練習
        • 習題4.1
        • 習題4.2
        • 習題4.3
        • 習題4.4
      • 使用大O表示法時,下面各種操作都需要多長時間?
        • 習題4.5
        • 習題4.6
        • 習題4.7
        • 習題4.8


4.1 分而治之

分而治之(divide and conquer)D&G是一種著名的遞歸式問題解決方法。——分而治之是遞歸的。

分而治之的算法是遞歸的。使用分而治之算法解決問題的過程包括兩個步驟。

(1)找出基線條件,這種條件必須盡可能接單。

(2)不斷地將問題分解(或者說縮小規模),直到使其符合基線條件。

例如,對于數組類問題的基線條件,則常常是數組為空,或數組內僅有一個元素。分解方式則通常是將其分為兩個盡可能等大小的數組。


4.2 快速排序

def quicksort(array):if len(array) < 2: # 基線條件:為空或只包含一個元素的數組是“有序”的return arrayelse: # 遞歸條件pivot = array[0] # 選定數組中的第一個值為基準值less = [i for i in array[1:] if i <= pivot] # 得到比基準值小的數字組成的數組greater = [i for i in array[1:] if i > pivot] # 得到比基準值大的數字組成的數組return quicksort(less) + [pivot] + quicksort(greater) # 將子數組進行快速排序,再與基準值一同組成有序數組。print(quicksort([10, 5, 2, 3]))


4.3 大OOO表示法的平均情況和最糟情況

  • 最糟情況指的是算法運行時可能遇到的最壞的情況。

  • 平均情況指的是算法遇到時的最佳情況。(最佳情況也是平均情況)

快速排序的平均情況為O(nlog?n)O(n\log n)O(nlogn),最糟情況為O(n2)O(n^2)O(n2)。這取決于基準值選取的好壞。

當每次基準值選取的均為最差情況時,則需要對包含nnn個元素的數組進行nnn次基準值的選取。當每次基準這選取的均為最佳情況時,則僅需要log?n\log nlogn次選取。(二分)

而當每一次選取基準值后,數組的每個元素均需要和基準值進行對比,因此,每次選取基準值之后需要進行nnn次比較。

因此,快速排序的最糟情況為O(n?n)=O(n2)O(n* n)=O(n^2)O(n?n)=O(n2),平均情況為O(nlog?n)O(n\log n)O(nlogn)


4.4 小結

  • 分而治之算法將問題逐步分解。使用分而治之算法處理列表時,基線條件很可能是空數組或只包含一個元素的數組。
  • 實現快速排序時,請隨機地選擇用作基準值的元素。快速排序的平均運行時間為O(nlog?n)O(n \log n)O(nlogn)
  • OOO表示法中的常量有時候事關重大,這就是快速排序比合并排序快的原因所在。
  • 比較簡單查找和二分查找時,常量幾乎無關緊要,因為列表很長時,O(log?n)O(\log n)O(logn)的速度比O(n)O(n)O(n)快得多。

練習

習題4.1

  • 請編寫前述sum函數的代碼。(遞歸求和,基線條件為數組空)
def sum(arr):if arr == []: # 基線條件:數組為空return 0 # elif len(arr) == 1: # 基線條件:數組內只有一個元素(可省略) # return arr[0]else:return arr[0] + sum(arr[1:]) # 遞歸條件:計算數組中第一個元素外元素的和,并與第一個元素再相加

習題4.2

  • 編寫一個遞歸函數來計算列表包含的元素數。
def count(arr):if arr == []: # 基線條件:數組為空return 0 # elif len(arr) == 1: # 基線條件:數組內只有一個元素(可省略) # return 1else:return 1 + count(arr[1:]) # 遞歸條件:計算數組中第一個元素外剩余元素個數,再加一

上面兩題中,數組內只有一個元素的情況均可省略。因為數組只有一個元素——即剩余數組為空的情況,已經被基線條件包含了,因此可以省略。


習題4.3

  • 找出列表中最大的數字。
def max(arr):if arr == []: # 基線條件:數組為空return Noneelif len(arr) == 1: # 基線條件:數組內只有一個元素return arr[0]elif len(arr) == 2: # 基線條件:數組內有兩個元素,返回最大值(可用內置的max()代替)if arr[0] > arr[1]:return arr[0]else:return arr[1]else:return max([arr[0], max(arr[1:])]) # 遞歸條件:比較第一個元素與數組中剩余元素的最大值。

習題4.4

  • 還記得第1章介紹的二分查找嗎?它也是一種分而治之算法。你能 找出二分查找算法的基線條件和遞歸條件嗎?

基線條件:數組中僅剩一個元素(是否為查找元素為另外的判斷,不屬于基線條件之內)

遞歸條件:將數組分為兩部分,如果查找值比第一部分的最大值小,則對第一部分繼續二分查找,否則對剩余部分進行二分查找。


使用大O表示法時,下面各種操作都需要多長時間?

習題4.5

  • 打印數組中每個元素的值。

每個元素進行一次打印操作。$O(n) $。


習題4.6

  • 將數組中每個元素的值都乘以2。

n個元素進行一次乘法操作。故為O(n)O(n)O(n)


習題4.7

  • 只將數組中第一個元素的值乘以2。

O(1)O(1)O(1)


習題4.8

  • 根據數組包含的元素創建一個乘法表,即如果數組為[2, 3, 7, 8, 10],首先將每個元素 都乘以2,再將每個元素都乘以3,然后將每個元素都乘以7,以此類推。

n個元素做n次乘法操作。故為O(n2)O(n^2)O(n2)


總結

以上是生活随笔為你收集整理的算法图解第四章笔记与习题(快速排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。