分治法思想與體會

  分治,即分而治之,是將一個規模爲n的問題分解爲k個規模較小的子問題,這些子問題互相獨立且與原問題相同。遞歸地解決這些子問題,而後將各子問題的解合併獲得原文題的解。其算法設計模式以下:算法

divide-and-conquer(P){編程

  if (|P|<=n0)設計模式

    adhoc(P);ide

  divide P into smaller subinstances P1,P2,...,Pk;函數

  for (i=1; i<=k; i++)學習

    yi = divide-and-conquer(Pi);設計

  return merge(y1,y2,...,yk);遞歸

在人們大量的實踐中,發如今用分治法的時候,使子問題規模大體相同是最好的,,而許多問題中,將一個問題分紅大小相等的k個子問題的處理方法(通常狀況下k=2)幾乎老是比子文體規模不等的好。方法

 

  對分治法深有體會的一次是第一次結對編程那會的第二題。原先老師還沒要求時間複雜度爲O(log2 n)時,我是直接在main函數裏直接寫了if進行判斷的,而後一堆的判斷語句。把時間複雜度擴大到了O(n)。後來就開始思索要怎樣將複雜度變小。當時是明確知道要用二分法才能將時間複雜度變小,但還不知道怎麼在find函數裏添加語句進行判斷。用二分法就能夠將時間複雜度變爲O(log2 n)。後來加上了下面這兩個語句。di

  if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]爲界,若是x在a[l]左邊,那麼輸出l以及l+1
  if(x>a[l]) cout<<l<<" "<<l+1;//若是x在a[l]左邊,那麼輸出l-1以及l
   
  而後瞬間把10幾行if判斷的語句縮減成兩行,又下降了計算的時間複雜度,就以爲很神奇。解決問題有不少方法,但既然已是第二年學習C++編程了,就要對本身有更高的要求,追求簡潔及時間、空間複雜度降到最優的算法,這也是算法課存在的意義,也是你學了那麼久編程的意義。打題仍是要多思考,多嚴格要求本身,不能想着投機取巧,單純完成題目就好。
 
  接下來就是對結對編程狀況的彙報。
  以爲結對編程挺好的,由於結對編程,不只關乎本身完成做業的狀況,還關乎隊友的。這個時候,你就會由於很差意思而要求本身作得好一點,不要拖累隊友,也不能將編程任務所有推脫出去。在這一背後推力下,就能「迫使」本身往前走,從而有了進步。並且又能夠一塊兒思考,一塊兒討論,能更快的發現新解題思路,更快完成任務。
相關文章
相關標籤/搜索