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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

递归算法(二)-分治法

發布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归算法(二)-分治法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分治法

分治算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。即一種分目標完成程序算法,簡單問題可用二分法完成。

分治法解題的一般步驟:

  • 分解,將要解決的問題劃分成若干規模較小的同類問題;
  • 求解,當子問題劃分得足夠小時,用較簡單的方法解決;
  • 合并,按原問題的要求,將子問題的解逐層合并構成原問題的解。
  • 實現方法:分治法一般是通過遞歸調用實現的。例如排序算法(快速排序,歸并排序),傅里葉變換(快速傅里葉變換)等。

    分治法使用場景

  • 該問題的規模縮小到一定的程度就可以容易的解決。
  • 該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質。
  • 利用該問題分解出的子問題的解可以合并為該問題的解。
  • 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。
  • 第一條特征是絕大多數問題可以滿足的,問題的復雜性一般是隨著問題規模的增加而增加;第二條特征是應用分治法的前提。它是大多數問題可以滿足的,此特征反映了遞歸思想的應用。第三條特征是關鍵,能否利用分治法完全取決于問題是否具有第三條特征,如果具備了第一條和第二條,而不具備第三條特征,則可以考慮使用貪心法或者動態規劃法。第四條關系到分治法的效率,如果各個子問題是不獨立的則分治法要做尋多不必要的工作,重復的解決公共的子問題,此時雖然可用分治法,但一般使用動態規劃法較好。

    歸并排序

    歸并排序是采用分治法的一個非常典型的應用。歸并排序的思想就是先遞歸分解數組,再合并數組。

    將數組分解最小之后,然后合并兩個有序數組,基本思路是比較兩個數組的最前面的數,誰小就先取誰,取了后相應的指針就往后移一位。然后再比較,直至一個數組為空,最后把另一個數組的剩余部分復制過來即可。

    def merge_sort(alist):# 終止條件if len(alist) <= 1:return alist# 二分分解num = len(alist)//2left = merge_sort(alist[:num])right = merge_sort(alist[num:])# 合并return merge(left,right)def merge(left, right):'''合并操作,將兩個有序數組left[]和right[]合并成一個大的有序數組'''#left與right的下標指針l, r = 0, 0result = []while l<len(left) and r<len(right):if left[l] < right[r]:result.append(left[l])l += 1else:result.append(right[r])r += 1result += left[l:]result += right[r:]return resultalist = [54,26,93,17,77,31,44,55,20] sorted_alist = merge_sort(alist) print(sorted_alist)#時間復雜度O(nlogn)

    運行結果:
    [17, 20, 26, 31, 44, 54, 55, 77, 93]

    快速排序

    快速排序(英語:Quicksort),又稱劃分交換排序(partition-exchange sort),通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

    步驟為:

  • 從數列中挑出一個元素,稱為"基準"(pivot),
  • 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區結束之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作。
  • 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。
  • 遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會結束,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

    # 快速排序 # 思路:尋抓元素的正確位置,左邊的元素都小于該元素,右邊的都大于該元素 # 移動游標low,high不動則交換直到相遇(可同時交換,也可異步交換) def quick_sort(alist,first,end):# 終止條件if first >= end:returnn = len(alist)mid_value = alist[first]low = firsthigh = endwhile low <high:# 注意處理特殊情況,遇到相等的元素放在一邊處理while low < high and alist[high] >= mid_value:high -= 1alist[low] =alist[high]# low += 1while low < high and alist[low] < mid_value:low += 1alist[high] = alist[low]# high -= 1# 代碼執行到此,alist[0]找到正確位置,解析來把劃分出來的兩段新列表遞歸執行alist[low] = mid_value# 遞歸部分# 對基準元素左邊的子序列進行快速排序quick_sort(alist,first,low-1)# 對基準元素右邊的子序列進行快速排序quick_sort(alist,low+1,end)alist = [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist)

    運行結果:[17, 20, 26, 31, 44, 54, 55, 77, 93]

    多數元素

    給定一個大小為 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。

    你可以假設數組是非空的,并且給定的數組總是存在多數元素。

    class Solution:def majorityElement(self, nums: List[int]) -> int:# 該題分治法不是最優解,但是很好的練習return self.getmajrity(nums,0,len(nums)-1)def getmajrity(self,nums,left,right):# 終止條件if left == right:return nums[left]mid = left + (right - left) // 2leftmajrity = self.getmajrity(nums,left,mid)rightmajrity = self.getmajrity(nums,mid+1,right)#--------------- 此處為分界線上部分為分,下部分為并----------------------# 當左邊的多數元素 與 右邊的多數元素相等時:返回其中任一值,如左邊if leftmajrity == rightmajrity: # 算是一個小優化(可以不要)return leftmajrity# # 如果不相等,需要分別計算左右兩邊,然后比較leftcount,rightcount = 0,0for i in nums[left:right+1]: ## 這里需要+1 否則nums[right]取不到if i == leftmajrity:leftcount += 1elif i == rightmajrity:rightcount += 1if leftcount >= rightcount:return leftmajrityelse:return rightmajrity

    最大子序列和

    給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

    class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)#遞歸終止條件if n == 1:return nums[0]mid = len(nums) // 2#遞歸計算左半邊最大子序和max_left = self.maxSubArray(nums[:mid])#遞歸計算右半邊最大子序和max_right = self.maxSubArray(nums[mid:])# -----------分界線 上面為分 下面為并----------------------------#計算中間的最大子序和,從右到左計算左邊的最大子序和,從左到右計算右邊的最大子序和,再相加max_l = nums[mid - 1]tmp = 0for i in range(mid - 1, -1, -1):tmp += nums[i]max_l = max(tmp, max_l)max_r = nums[mid]tmp = 0for i in range(mid, len(nums)):tmp += nums[i]max_r = max(tmp, max_r)#返回三個中的最大值return max(max_right,max_left,max_l+max_r)

    參考資料

    leetcode 官網
    https://zhuanlan.zhihu.com/p/72734354

    總結

    以上是生活随笔為你收集整理的递归算法(二)-分治法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 午夜久久乐 | 亚洲AV成人无码久久精品同性 | 色综合天天干 | 黄色精品在线 | 乱精品一区字幕二区 | 嫩草影院永久入口 | 四虎影院色| 久久系列| 9久久9毛片又大又硬又粗 | 欧美日韩视频一区二区 | 午夜爱爱毛片xxxx视频免费看 | 久久日视频 | 成年视频在线观看 | www.亚洲色图| 免费在线观看不卡av | 天天爽夜夜爽一区二区三区 | 91精品人妻互换一区二区 | 亚洲日本在线播放 | 成人污| 91视频免费看| 爆操巨乳美女 | 精品国产乱码久久久 | 欧美成人一区二区三区片免费 | 国产91色在线 | 天天综合色网 | 大香依人 | 亚洲精品久久久蜜桃网尤妮丝 | 欧美成人一区二区三区片免费 | 99在线视频精品 | 国产三级精品在线观看 | 国产精品高清在线观看 | 国产专区一区二区 | 成人爽站w47pw | 亚洲国产亚洲 | 国产免费aa | 黄色va | 可以看av| 国产精品无码无卡无需播放器 | 欧美综合区| 精品精品精品 | 午夜av免费在线观看 | 亚洲国产精品女人久久久 | 婷婷伊人综合中文字幕 | av在线亚洲天堂 | 国产精品成人一区二区三区 | 九九三级 | 日韩毛片在线免费观看 | 中国黄色一级视频 | 人妻天天爽夜夜爽一区二区三区 | 亚州视频在线 | 久久久久一级 | 在线a网| 一级黄色大片免费观看 | 国产精品23p | 免费黄色的网站 | 欧美国产一区二区在线观看 | 精品国产乱码久久久久久1区2区 | 刘亦菲毛片 | 欧美精品久久久 | 少妇毛片一区二区三区 | 日韩伦理视频 | 国产精品1区2区3区4区 | www.色欧美 | 国产一区二区伦理 | 亚洲区中文字幕 | 少妇人妻偷人精品无码视频新浪 | 国产精品一区二区人人爽 | 午夜精品久久久久久久久久久久久 | 黄色a一级视频 | 中文字幕日韩精品在线观看 | 中文在线一区二区 | 国产老妇伦国产熟女老妇视频 | 欧美精品99 | 一级片观看 | 九九这里只有精品视频 | 国产黑丝一区 | 亚洲精品一区二区在线观看 | av观看一区 | 成人在线国产视频 | 男人的影院 | 午夜精品一区二区三区在线观看 | 欧美激情 一区 | 中文亚洲av片不卡在线观看 | 在线免费观看日韩 | 91视频久久久 | 中文日本在线 | 国产精选中文字幕 | 久久久嫩草 | 日韩在线一区二区三区四区 | 日韩视频一区二区在线观看 | japanese国产在线观看 | 国产精品成人国产乱一区 | 亚洲自拍偷拍综合 | 亚洲在线网站 | 久久久精品人妻无码专区 | 在线黄av| 免费毛片看片 | 日韩综合第一页 | 久久五十路 |