斯坦福 演算法1 第一周作業

2021-09-11 07:32:16 字數 3085 閱讀 1678

來自斯坦福**的algorithms: design and analysis,與目前coursera上的版本內容沒有變化,不過時間安排略有不同。

三路歸併排序的複雜度。和兩路沒有啥區別,依然要遞迴log

nlogn

logn

層,只不過log的底數從2變成3。每一層的計算複雜度依然是o(n

根據大o表示法的定義寫一下即可。

這個也可以先用大o表示法的定義寫一下。發現給的條件與目標並不能直接得到。於是思考其目標成立的條件。

先看選項1,如果f(n

)≤g(

n)f(n) \leq g(n)

f(n)≤g

(n),因此2f(

n)≤2

g(n)

2^ \leq 2^

2f(n)≤

2g(n

),也就是2f(

n)=o

(2g(

n))2^=o(2^)

2f(n)=

o(2g

(n))

。於是選項1正確。另外可以舉一反例,比如f(n

)=2n

,g(n

)=nf(n) = 2n, g(n) = n

f(n)=2

n,g(

n)=n

,此時無法得到2f(

一共需要比較k-1次,每一次比較的次數為2n,3n,…,kn,因此其總數量級為nk2

比較大小。指數比較多的可以取log之後比較。

問題1,在限定比較次數內得到第二大的數。由於其比較次數只比n大一點,所以遍歷兩次的做法顯然不行。於是考慮本週內容中的歸併方式。

step1,把每次歸併陣列的操作改為比較兩個小陣列的最大值,並保留較大的乙個。因此比較次數為n/2+n/4+…+2,相加得到n-1。此時得到陣列最大值。

step2,回溯與最大值比較過的數字中的最大值,它就是陣列的第二大的數。(顯然第二大的數一定與最大值比較過,不然無法得出最大數。)回溯的比較次數與遞迴函式的層數相同,即log

n−1logn-1

logn−1

。於是滿足比較次數的要求。

c++ 實現:

int get_second(vectorv) }}

int a = v[n/2];

int index = 0;

for(int gap = n/2; gap >= 1; gap/=2)

return a;

}

實現的**雖然不複雜但貌似被我搞得過程很複雜。仔細想了一下應該能證明這麼做的正確性。

問題2,相對簡單。要求用o(l

ogn)

o(logn)

o(logn

)的複雜度找到駝峰型陣列中的最大值。用二分查詢,每次判斷mid位置與左右兩個數之間的關係來判斷邊界的變換。相對簡單,c++實現如下:

int get_max(vectorv) else

right = mid-1;

}return 0;

}

問題3,在有序陣列中判斷是否存在乙個下標i令a[i]=i。依然是用二分查詢,因為是有序陣列,因此邊界變化也好判斷。

實現課程中的逆序數計算。**如下:

#include #include #include #include #include using namespace std;

long long count(vector& v1,vector&v2, int begin, int end, bool flag)

else else

}else else }}

if(i < mid)

while(i < mid)

if(j < end)

while(j < end)

return res;

}}vectorreaddata(string filename)

}return res;

}int main() ;

vectorv2(test);

long long res = count(test,v2,0,test.size(),true);

cout << res 歸併排序的一大問題是歸併陣列的處理。因為不可能只用乙個陣列做inplace的歸併,因此至少需要兩個陣列。比較*****的做法是每次遞迴呼叫都生成乙個新的小陣列返回,這樣做比較廢空間與開闢陣列的時間,因此可以使用兩個陣列將其來回利用,減少損耗。具體可以看**,使用了乙個布林值來表示當前函式是將v2中的小陣列歸併到v1還是將v1中的數歸併到v2中。

斯坦福 演算法2 第二週作業

來自斯坦福 的algorithms design and analysis,與目前coursera上的版本內容沒有變化,不過時間安排略有不同。可以有反例。但我貌似沒咋想出來。錯誤的原因大概是因為用在了有向圖上面。問題1 用kruskal演算法實現課上講的聚類演算法。如下 include includ...

第一周作業

專案shrinkwrap games operating systems 這些軟體是怎麼說服你 陌生人 成為他們的使用者的?他們的目標都是盈利麼?通過廣告 老使用者口碑推薦 實體店推薦等方式發展新使用者,目標一般是盈利的,賺取使用者現金。通過廣告 老使用者口碑推薦等方式發展新使用者,目標一般是盈利的...

第一周作業

我的乙個小目標 7月13下午15.58分,我不遠千里踏上了北上求學謀生之路 年近快30歲的我深深的感到了孔子所謂的男人三十而立的壓力,從小到大父母對我的要求和期望都比較大,而我總是讓他們失望,一直都是一事無成,有的時候我都在質問自己甚至心中還有一絲幻想,如果時光能倒退從來我以前一定好好學習,考乙個好...