來自斯坦福**的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歲的我深深的感到了孔子所謂的男人三十而立的壓力,從小到大父母對我的要求和期望都比較大,而我總是讓他們失望,一直都是一事無成,有的時候我都在質問自己甚至心中還有一絲幻想,如果時光能倒退從來我以前一定好好學習,考乙個好...