6-17 創新班第十課

首先,江老師評價了一下我們的博客,說我的tree那題沒有用新學的方法做,所以我就在博客上貼了程序

       在這裏,江老師講了兩個很重要的概念:

              1、靜態和動態:

                     按照tree那題來舉例:

按照楊鴻飛的方法壓縮路徑就是屬於靜態,而用我們學的方法就是屬於動態:

靜態:

                                          for(int i=1;i<=n;i++)

                           fa[i]=getf(i);

            動態:

                                          while(fa[x]!=x)

                      {

                           int y=fa[x];

                           fa[x]=root;

                           x=y;

                       }

靜態就是整個變化過程完了之後在處理,動態就是有變化就處理,有變化就處理。

靜態——最後處理;

動態——中間處理;

   好吧其實我寫想和博客時都有點暈,不怎麼搞得清楚,不過到時候江老師會再詳細地講,到時候再做補充吧。

            2、不會做題時找出思緒的有效方法:

                            畫大量的例子!!

                     這樣一能讓我們熟悉題目的特徵,二來有時還能找到一些規律。                    

 

 

好吧暫時先寫這麼多,回到家再寫吧。

 

回家續寫:

    後來老師又講到galaxy,說到了它的解題思路:

       由於這題屬於並查集,而並查集的特點就是壓縮路徑,所以就是講了       壓縮路徑的方法(不壓縮路徑也會超時)

       

先定義一個結構體,裏面除了包括正常那些外,在加多一個這個這個節點到根的距離。每次需要用到這個節點時就求距離,然後把兩個節點的距離差求出來,就能求出這兩個節點(艦隊)之間有多少個節點(艦隊)。

 

    接着老師講了遞歸來找根,這樣不僅能順便壓縮路徑,而且程序非常短。

int getf(int x)

{

   if(x==fa[x]) return x;

   return fa[x]=getf(fa[x]);

}

 

程序十分簡單,但是也有一點小問題:

1、          如果這棵樹特別深,那麼就要開十分多的getf()函數,這有可能空間會爆掉。

2、          如果是一個環形,像這個一樣怎麼辦?它會無限遞歸一直退不出來。6-17 創新班第十課 - 周正華 - 周正華的博客

 

所以我們就要用到“啓發式”來解決:拿小的來連大的。

具體如何做江老師說以後會學到,那麼就先不要理它了。

然後江老師順便講了一下明天要學的哈希(hash)算法,大概就是說如何快速比較兩個數的不同之類的。今天特別晚,那這個就留到明天的博客再寫吧。

 

      

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章