組隊學習 分治演算法 打卡

2021-10-23 12:12:43 字數 3681 閱讀 3615

將原本複雜的問題,拆分成相同解決方法的簡單的小問題,然後將小問題的答案歸併成初始問題的解。

採用遞迴的方式,將問題層層分解,直到子問題滿足設定好的終止條件結束遞迴求解子問題的解,然後將解歸併。

示意圖如下:

示例1

輸入: [3,2,3]

輸出: 3

示例2

輸入: [2,2,1,1,1,2,2]

輸出: 2

首先想到的方法是使用雜湊表來對陣列中的元素對映,『鍵』為元素值,『值』為元素存在的次數,最後把最大『值』輸出。

而採用分治的思想的話,首先:陣列中存在的次數大於一半的元素,在陣列中只存在乙個並且該數至少也是左右區間中一部分的出現次數最多的數。

class

solution

:def

majorityelement

(self, nums: list[

int])-

>

int:

ifnot nums:

return

# 設定終止條件

n =len(nums)

if n ==1:

return nums[-1

]#劃分資料

left = self.majorityelement(nums[

:n//2]

) right = self.majorityelement(nums[n//2:

])#對每個子問題求解,把結果回溯

if left == right:

return left

if nums.count(left)

> nums.count(right)

:return left

else

:return right

該題使用分治演算法效率並不是很好,當左右區間的數不同時,需要回到初始陣列統計各自的次數,相當於又兩次迴圈。

該題的分治法類似於線段樹的操作,參考至題解

不僅可以解決區間 [0,n−1],還可以用於解決任意的子區間 [l,r] 的問題。如果我們把 [0,n−1] 分治下去出現的所有子區間的資訊都用堆式儲存的方式記憶化下來,即建成一顆真正的樹之後,我們就可以在 o(log n) 的時間內求到任意區間內的答案,我們甚至可以修改序列中的值,做一些簡單的維護,之後仍然可以在 o(log n) 的時間內求到任意區間內的答案,對於大規模查詢的情況下,這種方法的優勢便體現了出來。這棵樹就是上文提及的一種神奇的資料結構——線段樹

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

以前做的方法是使用動態規劃,用dp[i]表示到第i個數時,陣列的連續最大子序和;對於第i+1個元素則需要比較 dp[i[ + num[i+1]與num[i+1]的大小,即判斷現在的數對於結果是增的,還是減的。最後返回dp陣列的最大值。

現在採用分治的方法:

感謝組裡大佬@金金金給出的解釋:

class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

#判斷終止條件

n =len(nums)

if n ==1:

return nums[-1

]#劃分資料集,判斷最大子序和是在左區間,或者是右區間,還是在 左右區間的中間區域 得到

left = self.maxsubarray(nums[

:n//2]

) right = self.maxsubarray(nums[n//2:

])#對子問題求解

#求解左右區間的中間區域

max_l = nums[

len(nums)//2

-1]# max_l為該陣列的最右邊的元素

tmp =

0# tmp用來記錄連續子陣列的和

for i in

range

(len

(nums)//2

-1,-

1,-1

):# 從右到左遍歷陣列的元素

tmp += nums[i]

max_l =

max(tmp ,max_l)

# 從左到右計算右邊的最大子序和

max_r = nums[

len(nums)//2

] tmp =

0for i in

range

(len

(nums)//2

,len

(nums)):

tmp += nums[i]

max_r =

max(tmp,max_r)

#返回三個區域的最大值

return

max(left,right,max_l+max_r)

示例1

輸入: 2.00000, 10

輸出: 1024.00000

示例2

輸入: 2.00000, -2

輸出: 0.25000

解釋: 2-2 = 1/22 = 1/4 = 0.25

分治法也就是快速冪的遞迴方法:

如果n為偶數,可以先遞迴求出y = x^(n/2),然後根據result = y*(y)回溯。

如果n為奇數時,result = y^2*x

總結為:

《資料探勘》組隊學習打卡1

有幸在組隊最後時刻加入戰隊,開始一段新的學習旅程。目前已完成task1的學習,關於賽題理解部分,本賽題屬於比較簡單的基礎型專案,適合作為入門。檢視訓練 測試資料概況 import numpy as np import pandas as pd path data train data pd.read...

《機器學習基礎》組隊學習打卡1

本節內容 線性回歸的概念 主要學習以下5個方面 1 線性回歸的一般形式 有資料集 其中,1 2 3 其中n表示變數的數量,d表示每個變數的維度。2 線性回歸損失函式 代價函式 目標函式 損失函式 loss function 度量單樣本 的錯誤程度,損失函式值越小,模型就越好。代價函式 cost fu...

《機器學習基礎》組隊學習第二次打卡

一 學習內容 貝葉斯概率模型 二 知識點梳理 1.相關概念 生成模型 在概率統計理論中,生成模型是指能夠隨機生成觀測資料的模型,尤其是在給定某些隱含引數的條件下。它給觀測值和標註資料序列指定乙個聯合概率分布。在機器學習中,生成模型可以用來直接對資料建模 例如根據某個變數的概率密度函式進行資料取樣 也...