<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4949960181628888221</id><updated>2026-02-17T16:59:32.008+08:00</updated><category term="解題"/><category term="ACM"/><category term="C++"/><category term="Qt"/><category term="演算"/><category term="翻譯"/><category term="作品"/><category term="介紹"/><category term="目錄"/><category term="筆記"/><category term="語言"/><category term="轉貼"/><category term="USACO"/><category term="雜記"/><category term="Verilog"/><category term="C"/><category term="PHP"/><category term="JS"/><category term="YUI"/><category term="FLOLAC"/><category term="演講"/><title type='text'>Infinite Loop</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default?max-results=15&amp;redirect=false'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default?start-index=16&amp;max-results=15&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>169</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>15</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-6914263816243747901</id><published>2010-09-19T14:18:00.006+08:00</published><updated>2010-09-19T14:31:01.876+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C"/><category scheme="http://www.blogger.com/atom/ns#" term="C++"/><category scheme="http://www.blogger.com/atom/ns#" term="介紹"/><title type='text'>【介紹】Code::Blocks</title><content type='html'>　　為了能撰寫 C/C++ 的程式，你可能需要在自己的電腦中建置一套 &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_development_environment&quot;&gt;IDE（Integrated Development Environment，整合開發環境）&lt;/a&gt;，卻又不想用需要付費、又只能在 Windows 上執行的 &lt;a href=&quot;http://msdn.microsoft.com/zh-tw/vstudio/&quot;&gt;Visual Studio&lt;/a&gt;（雖然 VS 也有提供免費的 &lt;a href=&quot;http://www.microsoft.com/express/Default.aspx&quot;&gt;Express Edition&lt;/a&gt;）。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
　　或許會有人推薦你使用 &lt;a href=&quot;http://www.bloodshed.net/devcpp.html&quot;&gt;Dev-C++&lt;/a&gt; 這套 open source 的免費軟體。不過根據我自己使用過的經驗，Dev-C++ 時常在執行到一半的時候當掉。而且其最新版本 4.9.9.2 是在 2005 年 2 月發佈的，顯然已經好幾年都沒有在繼續更新。&lt;br /&gt;
&lt;br /&gt;
　　在這裡，我要為各位介紹另一款同樣免費又穩定的 IDE - &lt;a href=&quot;http://www.codeblocks.org/&quot;&gt;Code::Blocks&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　Code::Blocks 是一個 open source 的 IDE。由於其是由 &lt;a href=&quot;http://en.wikipedia.org/wiki/WxWidgets&quot;&gt;wxWidgets&lt;/a&gt; 寫成，因此也具備了跨多種平台（Windows、Mac OS X、Linux 等）的能力。&lt;br /&gt;
&lt;br /&gt;
　　Code::Blocks 也支援多種&lt;a href=&quot;http://en.wikipedia.org/wiki/Compiler&quot;&gt;編譯器（compiler）&lt;/a&gt;，如常見的 &lt;a href=&quot;http://en.wikipedia.org/wiki/GNU_Compiler_Collection&quot;&gt;GCC&lt;/a&gt; / &lt;a href=&quot;http://en.wikipedia.org/wiki/MinGW&quot;&gt;MinGW&lt;/a&gt;、Microsoft 的 &lt;a href=&quot;http://en.wikipedia.org/wiki/Visual_C%2B%2B&quot;&gt;Visual C++&lt;/a&gt;、Intel 的 &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler&quot;&gt;ICC&lt;/a&gt; 等。除此之外，Code::Blocks 還支援匯入 Dev-C++ 與 Visual C++ 專案的能力，可謂功能相當豐富。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　在這裡簡單示範一下如何在 Windows （XP Pro SP3）下安裝 Code::Blocks。&lt;br /&gt;
&lt;br /&gt;
　　首先，先進到&lt;a href=&quot;http://www.codeblocks.org/downloads/26&quot;&gt;下載頁&lt;/a&gt;，找到 Windows 用的 binary 版本。當前的最新版本為 10.05，提供了 &lt;b&gt;&quot;codeblocks-10.05-setup.exe&quot;&lt;/b&gt; 與 &lt;b&gt;&quot;codeblocks-10.05mingw-setup.exe&quot;&lt;/b&gt; 兩個安裝檔，分別為單純的 Code::Blocks 與包含 MinGW 的版本。&lt;br /&gt;
&lt;br /&gt;
　　在這裡，我選擇的是&lt;b&gt;不包含&lt;/b&gt; MinGW 的版本。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBjVfcmIknmun8LTD5-O1_V6hyphenhyphen9JgOlcAbLRBP_Ul67UYEhTA3cu07FITQ6MRNqMqXICn4AXKXTG3PxXUILLZ1ReYL_UzcA8mBsXd4HS2j9CKCQHatPLUzBvxZvnBccQHOF_J1BEwaaE/s1600/1.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 281px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBjVfcmIknmun8LTD5-O1_V6hyphenhyphen9JgOlcAbLRBP_Ul67UYEhTA3cu07FITQ6MRNqMqXICn4AXKXTG3PxXUILLZ1ReYL_UzcA8mBsXd4HS2j9CKCQHatPLUzBvxZvnBccQHOF_J1BEwaaE/s400/1.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518505932732053714&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　下載完成、執行安裝檔後，會出現選擇安裝元件的畫面。基本上，遵照預設值，直接按 &quot;Next&quot; 即可。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKJ2-oQqjFfrKu8GaokrWCNRzO-YMriFB5HHoZKMXw_wGu_l_pK8ia9Hd-B-SQrIQZjMwuZjtlyNgnonPF1K7-WDdONAccXUNe9LDf8FFO8hDlox5mlDOiVmsZId8UTqJuleEM8l4m2L8/s1600/2.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKJ2-oQqjFfrKu8GaokrWCNRzO-YMriFB5HHoZKMXw_wGu_l_pK8ia9Hd-B-SQrIQZjMwuZjtlyNgnonPF1K7-WDdONAccXUNe9LDf8FFO8hDlox5mlDOiVmsZId8UTqJuleEM8l4m2L8/s400/2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518505938285384274&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　接著選擇安裝的目錄。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRE4ypvJ1bo3Ji05HveOidNmko7ofUAGSEWxXx5AgMylGcltpONM5uiDP5WIwGV71tSXHb9eAYP_7FDjUOFMm5td3PghClt91wfI9ikox2c_9Ot4Y2-weshSaHGQezMX_v1Kw7yzZPcok/s1600/3.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRE4ypvJ1bo3Ji05HveOidNmko7ofUAGSEWxXx5AgMylGcltpONM5uiDP5WIwGV71tSXHb9eAYP_7FDjUOFMm5td3PghClt91wfI9ikox2c_9Ot4Y2-weshSaHGQezMX_v1Kw7yzZPcok/s400/3.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518505940772369010&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　接著就可以等待安裝完成了。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMLqVZhjKtBs37PYK__adtSV73FbvO3pn7WiLdXxu1CCZCvV_umFMIVJrs3C4QwCDvHevb94NtoeNOuDHBsZYvRxB_u_PdN-FfY-GJVJ3RRGWLc1upYkXaNI0h7c6xPLrllIF_Y0U_svA/s1600/4.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMLqVZhjKtBs37PYK__adtSV73FbvO3pn7WiLdXxu1CCZCvV_umFMIVJrs3C4QwCDvHevb94NtoeNOuDHBsZYvRxB_u_PdN-FfY-GJVJ3RRGWLc1upYkXaNI0h7c6xPLrllIF_Y0U_svA/s400/4.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518505945855004450&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
　　在 Code::Blocks 安裝完成之後，我們還需要安裝 MinGW 作為其使用的編譯環境。（假如在第一步下載的就是包含 MinGW，這一步可以跳過。當然，你也可以選擇 MinGW 以外的編譯環境，如 ICC。）&lt;br /&gt;
&lt;br /&gt;
　　MinGW 的安裝方式請參見&lt;a href=&quot;http://program-lover.blogspot.com/2009/02/gcc-mingw.html&quot;&gt;這篇&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　第一次開啟 Code::Blocks 時，它會請你選擇一個預設的編譯器。後面有寫 &lt;b&gt;&quot;Detected&quot;&lt;/b&gt; 的，代表 Code::Blocks 在你電腦偵測到的已安裝的編譯器。&lt;br /&gt;
&lt;br /&gt;
　　這裡我們選擇 &lt;b&gt;&quot;GNU GCC Compiler&quot;&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiItE8XIc-0ruDCG3PnsrQxZaPG76D_u6o-gfx7XmjDj04rRrG68p5UXnXbfG7H_MlJWUpPJBrU7S6S6e_dfUiqxxDur_qU0jH_WBP8Jn0litbhSEPoNIo28fbLR50NKPVu72cB3VPsZP0/s1600/5.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiItE8XIc-0ruDCG3PnsrQxZaPG76D_u6o-gfx7XmjDj04rRrG68p5UXnXbfG7H_MlJWUpPJBrU7S6S6e_dfUiqxxDur_qU0jH_WBP8Jn0litbhSEPoNIo28fbLR50NKPVu72cB3VPsZP0/s400/5.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518505953521575170&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　安裝到這邊，就可以開始使用 Code::Block 了！&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh70fK_TagqYIVbdIsYZRtxZ8PCj0WHT2HnBigZolbOWjA5Ig5Ag2dWaewpbJSqOZywa5QggZSY6H8oC_2jflJk4pW7sof0TIlWBio0EPNA3crN5rlXp2fOyuG0ilLWajnxzionf6mgs3w/s1600/6.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh70fK_TagqYIVbdIsYZRtxZ8PCj0WHT2HnBigZolbOWjA5Ig5Ag2dWaewpbJSqOZywa5QggZSY6H8oC_2jflJk4pW7sof0TIlWBio0EPNA3crN5rlXp2fOyuG0ilLWajnxzionf6mgs3w/s400/6.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518506473514951042&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
　　想利用 Code::Block 新增一個 C/C++ 的檔案，請點選選單的 &lt;b&gt;File &amp;gt; New &amp;gt; File...&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1F_pmMi3g0To1My5b8hoWM1mouo6dT7-rAv2BChqqSAkdEvuXNzjnihfb4Z0kIWV5CUM-UAvavqPneC1xFzO_dCHBDfO4qCPQSB74T-HSNbsatllhVgXN2fdhTteVVU9JuLrBcEidP8/s1600/7.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs1F_pmMi3g0To1My5b8hoWM1mouo6dT7-rAv2BChqqSAkdEvuXNzjnihfb4Z0kIWV5CUM-UAvavqPneC1xFzO_dCHBDfO4qCPQSB74T-HSNbsatllhVgXN2fdhTteVVU9JuLrBcEidP8/s400/7.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518506480805221298&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　接著選擇 &lt;b&gt;&quot;C/C++ source&quot;&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ8yj6FY1uHeM4Q9EXZrNaxU2WMBTo4DREAT4EFSDv1XydeYTRzLXm-EKPYFrB2O0Z9r5ccL3ydDpiadSkzGuVaVtDzdAriay2CYyjGeCy2S7S_V2yO-t1UCuXVNHeu3ww-WtECQB_Sa4/s1600/8.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 298px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ8yj6FY1uHeM4Q9EXZrNaxU2WMBTo4DREAT4EFSDv1XydeYTRzLXm-EKPYFrB2O0Z9r5ccL3ydDpiadSkzGuVaVtDzdAriay2CYyjGeCy2S7S_V2yO-t1UCuXVNHeu3ww-WtECQB_Sa4/s400/8.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518506483210410018&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　然後選擇 &lt;b&gt;&quot;C&quot;&lt;/b&gt; 或 &lt;b&gt;&quot;C++&quot;&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijCIcXWdruExBJZwXa7FV-0xllHJ8MDU7tQQHgThJBI8ZnzQ665UUou4ZT0imATXDw0kn-PSgOYRpO3R58FLNtEpF9LOMSzsHxMStUizBzCKEZAhaiB5_RRC6Dk7PMVDTAkOPUJiEVNL8/s1600/9.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijCIcXWdruExBJZwXa7FV-0xllHJ8MDU7tQQHgThJBI8ZnzQ665UUou4ZT0imATXDw0kn-PSgOYRpO3R58FLNtEpF9LOMSzsHxMStUizBzCKEZAhaiB5_RRC6Dk7PMVDTAkOPUJiEVNL8/s400/9.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518506485866759266&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　並設定檔案建立的路徑。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9niTnMOe3Mw_YNgolJ-VrmAoohKbr9fgAFyv5AMzJACOQZ2x3hgp7B0P6w3l1ISny90o8cX9hEHILV6FX-03zjwE1EBSk46sJxNawc_65uGYALhEGY62-aEhcCAGdoyCpZDokVO4D20/s1600/10.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9niTnMOe3Mw_YNgolJ-VrmAoohKbr9fgAFyv5AMzJACOQZ2x3hgp7B0P6w3l1ISny90o8cX9hEHILV6FX-03zjwE1EBSk46sJxNawc_65uGYALhEGY62-aEhcCAGdoyCpZDokVO4D20/s400/10.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518506493026777938&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
　　撰寫完程式，再按下工具列的 &lt;b&gt;&quot;Run&quot;&lt;/b&gt; 就可以編譯執行了。&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNmup154ke74ToRCGhuxyJ07ojORmNd29ZkJgeBKEGixlClbX3CB5YZUguZK4LbSmGNSYuU3PJ-ntn7hcqpqnHRWtsx7YyWk4Rio6z-xai4CtdMnmCU4-rHzQR9HT4YWAhXOanda-slvc/s1600/11.PNG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNmup154ke74ToRCGhuxyJ07ojORmNd29ZkJgeBKEGixlClbX3CB5YZUguZK4LbSmGNSYuU3PJ-ntn7hcqpqnHRWtsx7YyWk4Rio6z-xai4CtdMnmCU4-rHzQR9HT4YWAhXOanda-slvc/s400/11.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5518507239228018018&quot; /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Reference:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.codeblocks.org/&quot;&gt;Code::Blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Code::Blocks&quot;&gt;Code::Blocks - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://c9s.blogspot.com/2007/07/visual-c-tutorial.html&quot;&gt;Writing C++ Application Without Visual C++&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/6914263816243747901/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/09/codeblocks.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/6914263816243747901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/6914263816243747901'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/09/codeblocks.html' title='【介紹】Code::Blocks'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggBjVfcmIknmun8LTD5-O1_V6hyphenhyphen9JgOlcAbLRBP_Ul67UYEhTA3cu07FITQ6MRNqMqXICn4AXKXTG3PxXUILLZ1ReYL_UzcA8mBsXd4HS2j9CKCQHatPLUzBvxZvnBccQHOF_J1BEwaaE/s72-c/1.PNG" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4082198811095980759</id><published>2010-09-15T00:34:00.008+08:00</published><updated>2010-09-15T00:52:24.068+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="雜記"/><title type='text'>【雜記】漫談樹狀結構</title><content type='html'>　　在之前寫的「&lt;a href=&quot;http://program-lover.blogspot.com/2008/12/tree.html&quot;&gt;樹（tree）&lt;/a&gt;」這篇文章中，有網友提到：希望能夠瞭解 tree 能夠在應用上什麼問題上面。不過，由於我本身對樹的瞭解也很粗淺，所以這篇就野人獻曝一下，隨意講講一些我知道的東西。學得不甚透徹，可能會有些不完整或是錯誤的地方，就請各位別見怪囉 :P&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
　　先前曾經提到：在樹狀結構中，&lt;b&gt;節點（node）&lt;/b&gt;的&lt;b&gt;分支度（degree）&lt;/b&gt;代表其子節點（child）數量。若是有一種樹狀結構至多只會有 n 個子節點，即樹中的任何節點分支度均小於或等於 n，則我們會將這種樹稱為一棵「&lt;b&gt;n 元樹&lt;/b&gt;｣。&lt;br /&gt;
&lt;br /&gt;
　　其中，大概就屬&lt;b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_tree&quot;&gt;二元樹（binary tree）&lt;/a&gt;&lt;/b&gt;的應用最為廣泛。如上所述，其節點至多只會有兩個子節點。通常我們會直接將之稱為&lt;b&gt;左子（left child）&lt;/b&gt;與&lt;b&gt;右子（right child）&lt;/b&gt;。下圖是一棵二元樹：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/File:Sorted_binary_tree.svg&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/6/67/Sorted_binary_tree.svg&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　在談應用之前，讓我們先來看看一個樹狀結構常見的操作：&lt;b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tree_traversal&quot;&gt;尋訪（traversal）&lt;/a&gt;&lt;/b&gt;，也就是依照某種順序訪問樹中的所有節點。一般來說，常見的尋訪方式包含&lt;b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Depth-first_search&quot;&gt;深度優先尋訪（depth-first traversal）&lt;/a&gt;&lt;/b&gt;與&lt;b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Breadth-first_traversal&quot;&gt;廣度優先尋訪（breadth-first traversal）&lt;/a&gt;&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
　　以上面的樹狀圖來說明，深度優先尋訪會先從根節點 F 開始，走訪 F 的第一個子節點 B，再接著走訪 B 的第一個子節點 A。由於 A 不具有子節點，所以我們退回上一層，再接著走訪 B 的第二個子節點 D。完整的尋訪順序為：F B A D C E G I H。&lt;br /&gt;
&lt;br /&gt;
　　而廣度優先尋訪相對於深度優先尋訪的不斷深入，是以&lt;b&gt;層級順序（level-order）&lt;/b&gt;來進行尋訪。所以同樣由根節點 F 開始，走訪 F 的第一個子節點 B，再接著走訪 F 的第二個子節點 G。由於 F 只有兩個子節點，所以我們接著尋訪下一層 B 的子節點 A 與 D，然後是 G 的子節點 I。完整的尋訪順序為：F B G A D I C E H。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　其中，二元樹又具有三種特殊的尋訪方式：&lt;b&gt;前序（pre-order）&lt;/b&gt;、&lt;b&gt;中序（in-order）&lt;/b&gt;、與&lt;b&gt;後序（post-order）&lt;/b&gt;。若是把尋訪根節點、尋訪左子樹、尋訪右子樹分別記做 D、L、R，則前序的尋訪順序為 D L R、中序的尋訪順序為 L D R、後序的尋訪順序為 L R D。&lt;br /&gt;
&lt;br /&gt;
　　以同樣的圖舉例的話，前序的尋訪順序為：F B A D C E G I H、中序的尋訪順序為：A B C D E F G H I、後序的尋訪順序為：A C E D B H I G F。（正確來說，二元樹只比一般的樹多了中序與後序兩種尋訪方式，因為前序尋訪與深度優先尋訪的順序其實是相同的。）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　說完了尋訪，不過跟應用有什麼關聯呢？其中一個常見的用途是&lt;b&gt;排序（sorting）&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
　　我們可以定義一個特殊的二元樹：樹狀結構中，其左子樹所有節點所存的值必定小於根節點的值，且其右子樹所有節點所存的值必定大於等於根節點的值。如下圖：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/File:Binary_search_tree.svg&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/d/da/Binary_search_tree.svg&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
　　有沒有發現，當我們用中序來尋訪這棵二元樹，我們便可以得到一個升序（ascending order）的數列。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　若是根據定義，給出一個新增節點的操作：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function insertNode(TreeNode root, Type value)
    If root.value &amp;gt; value then
        If root.hasLeftChild Then
            insertNode(root.leftChild, value)
        Else
            root.leftChild = CreateNode(value)
    Else
        If root.hasRightChild Then
            insertNode(root.rightChild, value)
        Else
            root.rightChild = CreateNode(value)
End
&lt;/pre&gt;
&lt;br /&gt;
　　利用這個新增節點的操作，我們便可以將一堆資料建立成一棵符合定義的二元樹。於是，我們便可以利用這個操作，在加上中序尋訪來得到一串排序過的資料。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　事實上，這種特殊的二元樹，被稱為&lt;b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_search_tree&quot;&gt;二元搜尋樹（binary search tree）&lt;/a&gt;&lt;/b&gt;。其義如其名，這種二元樹也可以用以進行「已排序資料」的搜尋（search）。&lt;br /&gt;
&lt;br /&gt;
　　根據定義我們可以得知：若是欲尋找的值小於二元搜尋樹的根節點，則其右子樹必定不可能出現欲尋找的值；同樣的，若是欲尋找的值大於二元搜尋樹的根節點，則其左子樹必定不可能出現欲尋找的值。而這種方式其實就跟&lt;b&gt;&lt;a href=&quot;http://program-lover.blogspot.com/2008/08/binary-search.html&quot;&gt;二分搜尋法（binary search）&lt;/a&gt;&lt;/b&gt;的原理有異曲同工之妙。&lt;br /&gt;
&lt;br /&gt;
　　我們可以定義搜尋的操作如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function search(TreeNode root, Type value)
    If root.value = value then
        print &quot;Found&quot;
    Else If root.value &amp;gt; value then
        If root.hasLeftChild Then
            search(root.leftChild, value)
        Else
            print &quot;Not Found&quot;
    Else
        If root.hasRightChild Then
            search(root.rightChild, value)
        Else
            print &quot;Not Found&quot;
End
&lt;/pre&gt;
&lt;br /&gt;
　　而這種利用二元搜尋樹的搜尋方式，其複雜度為 &lt;b&gt;O(h)&lt;/b&gt;。其中 h 為樹的高度（height）。而若每棵子樹的左右子樹節點數量都相同（或差一），則 h 即等同於 lg n，也就是說搜尋的複雜度為 &lt;b&gt;O(lg n)&lt;/b&gt;，與二分搜尋法相當。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　由以上這些例子，可以知道「樹」不僅可以用來處理常見的排序與搜尋問題，還是種挺有效率的方式呢。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
References：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tree_(data_structure)&quot;&gt;Tree (data structure) - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_tree&quot;&gt;Binary tree - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tree_traversal&quot;&gt;Tree traversal - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_search_tree&quot;&gt;Binary search tree - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.csie.ntnu.edu.tw/~u91029/Tree.html&quot;&gt;Tree - 演算法筆記&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mmdays.com/2008/01/19/data_structure_tree/&quot;&gt;由樹的前序、中序、後序走法來談資料結構 - MMDays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mmdays.com/2008/03/16/tree_sort/&quot;&gt;二元樹在排序的應用 - MMDays&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mmdays.com/2008/03/29/tree_search/&quot;&gt;二元樹排序對搜尋的影響 - MMDays&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4082198811095980759/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/09/blog-post.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4082198811095980759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4082198811095980759'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/09/blog-post.html' title='【雜記】漫談樹狀結構'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-8086730265657059059</id><published>2010-07-23T21:46:00.003+08:00</published><updated>2010-07-23T21:49:38.485+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><category scheme="http://www.blogger.com/atom/ns#" term="轉貼"/><title type='text'>【轉貼】Visualization of Quick sort</title><content type='html'>　　偶然在網路上看到的影片：用動畫展示&lt;a href=&quot;http://program-lover.blogspot.com/2008/06/bubble-sort_20.html&quot;&gt;氣泡排序法（Bubble Sort）&lt;/a&gt;跟&lt;a href=&quot;http://program-lover.blogspot.com/2008/11/quicksort.html&quot;&gt;快速排序法（Quicksort）&lt;/a&gt;的運作原理，並比較兩者的效率（進行比較的次數）。整支影片看起來還滿可愛的。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/vxENKlcs2Tw&amp;amp;hl=zh_TW&amp;amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/vxENKlcs2Tw&amp;amp;hl=zh_TW&amp;amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.youtube.com/watch?v=vxENKlcs2Tw&quot;&gt;Visualization of Quick sort&lt;/a&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/8086730265657059059/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/07/visualization-of-quick-sort.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/8086730265657059059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/8086730265657059059'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/07/visualization-of-quick-sort.html' title='【轉貼】Visualization of Quick sort'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4219719946008419821</id><published>2010-07-11T12:21:00.009+08:00</published><updated>2010-07-11T12:58:08.183+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="FLOLAC"/><category scheme="http://www.blogger.com/atom/ns#" term="雜記"/><title type='text'>【雜記】FLOLAC &#39;10</title><content type='html'>　　&lt;a href=&quot;http://flolac.iis.sinica.edu.tw/flolac10/&quot;&gt;2010 Formosan Summer School on Logic, Language, and Computation（FLOLAC ’10）&lt;/a&gt;，是辦在台大進修推廣部的暑期碩士學分班。雖然是碩士學分班，但由於剛好符合相關學系大二以上的報名資格，又在半自願被網友 yen3 「騙來」的狀態下還是報名了XD。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiykMz8PHXaPcWTtAGk37IHIafKy09zpuImGJxRjvGnX5W8UMUT1kGQII0vZBJ0uyh1HCOj_vAQTeSa7hu6vY96Ty3_U5TzId4r1_3JylCdf2Gk2GpqBmEt5U53atLqi3uZUa7Sk9xPGz0/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiykMz8PHXaPcWTtAGk37IHIafKy09zpuImGJxRjvGnX5W8UMUT1kGQII0vZBJ0uyh1HCOj_vAQTeSa7hu6vY96Ty3_U5TzId4r1_3JylCdf2Gk2GpqBmEt5U53atLqi3uZUa7Sk9xPGz0/s800/FLOAC2010-Poster-final.jpg&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　對於一個語言，我們可以從兩個觀點來看它：一個是語法（syntax），即語言本身的規則（rule）與形式（form）；另一個則是語意（semantics），為語言本身所表達的意義（meaning）。&lt;br /&gt;
&lt;br /&gt;
　　寫出可以執行的程式也許不難，要寫出正確的程式卻不簡單。當我們得到一段程式，我們該如何分析、驗證這個程式的結果，以確保其確實符合我們的預期？更甚者，我們該如何在撰寫程式的同時，也確保我們建構出來的程式一定是正確的？&lt;br /&gt;
&lt;br /&gt;
　　對於程式語法上的錯誤（syntax error）可以經由編譯器（compiler）或直譯器（interpreter）來幫我們檢查出來。但是，語意上的錯誤（logic error 或稱 semantic error）卻難以經由其他工具來協助我們察覺。&lt;br /&gt;
&lt;br /&gt;
　　一般我們也許習慣利用測試資料來確認程式的正確性：只要程式能通過所有的測試資料（即輸出結果符合預期），我們就可以「假設」程式是正確的了。不過，要產出全面性的測試資料本身有其難度，再加上此種方式必須仰賴於程式的實作（implement），作為驗證並不是一種非常好的方式。&lt;br /&gt;
&lt;br /&gt;
　　而 FLOLAC &#39;10 這一系列的課程，主要的內容就是教導如何以邏輯推理為基礎，從語意的角度將程式形式化（formalize）並進行分析。以及用以輔助的 Frama-C 分析工具的使用。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　不過 FLOLAC ’10 的時程有兩天跟期末考撞期，所以一開始就請了兩天假。直到第三天的 Logic 跟 Op 課都已經是第二堂課，FP 課甚至已經結束了。要在沒聽過第一堂課的情況下銜接上內容，一開始還真是一個頭兩個大。還好後來漸漸跟上了，總算有種進入狀況的感覺。&lt;br /&gt;
&lt;br /&gt;
　　歷經了兩週八點準時起床出門上課，直到下午五點下課，比暑假前還規律的暑假生活，水深火熱的 FLOLAC &#39;10 終於順利結束了。雖然課程有點辛苦，不過接觸了不少人、也接觸了不少新東西，感覺收獲也相當多。&lt;br /&gt;
&lt;br /&gt;
　　遇見了 yen3、GSR、dryman，還有其他周圍的人、努力想搞懂 Frama-C 到底在做什麼、跟 dryman 一起到麥當勞邊念書邊聊天、期末考前在 Google Wave 上熱烈的討論。對於整個 FLOLAC 的課程，我想我還滿樂在其中的。&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSdDTNYa34g5vfYf4BiiqyKpJfbHpBLE0VRlWjn_3MY5AwMc5DdbUp0iEOfb9OIYIk_rWDG1s0KqJEPMGqsAd29dAkjdJ0gu3FFHV8pivhj4eI7Nw1OEW6LGn9SvQElpiPIfOgbnQpQGU/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSdDTNYa34g5vfYf4BiiqyKpJfbHpBLE0VRlWjn_3MY5AwMc5DdbUp0iEOfb9OIYIk_rWDG1s0KqJEPMGqsAd29dAkjdJ0gu3FFHV8pivhj4eI7Nw1OEW6LGn9SvQElpiPIfOgbnQpQGU/s400/FLOLAC.JPG&quot; /&gt;&lt;/a&gt;&lt;/center&gt;
&lt;br /&gt;
　　雖然不知道自己能學到多少，又能應用多少。不過也許就像 yen3 所說：「能體會，就能產生質變」。或許在之後就會發現，現在學過的這些，其實都有潛移默化的作用也說不定。
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4219719946008419821/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/07/flolac-10-week-1.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4219719946008419821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4219719946008419821'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/07/flolac-10-week-1.html' title='【雜記】FLOLAC &#39;10'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiykMz8PHXaPcWTtAGk37IHIafKy09zpuImGJxRjvGnX5W8UMUT1kGQII0vZBJ0uyh1HCOj_vAQTeSa7hu6vY96Ty3_U5TzId4r1_3JylCdf2Gk2GpqBmEt5U53atLqi3uZUa7Sk9xPGz0/s72-c/FLOAC2010-Poster-final.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4049736635754483284</id><published>2010-04-11T12:06:00.001+08:00</published><updated>2011-10-27T16:03:45.076+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】插入排序法 - Insertion Sort</title><content type='html'>　　&lt;a href=&quot;http://en.wikipedia.org/wiki/Insertion_sort&quot;&gt;&lt;b&gt;插入排序法（insertion sort）&lt;/b&gt;&lt;/a&gt;與&lt;a href=&quot;http://en.wikipedia.org/wiki/Selection_sort&quot;&gt;選擇排序法（selection sort）&lt;/a&gt;類似，同為較簡易、直觀的&lt;a href=&quot;http://en.wikipedia.org/wiki/Sorting_algorithm&quot;&gt;排序演算法（sorting algorithm）&lt;/a&gt;。其原理都是將資料分為「已排序」與「未排序」兩個部份。再將未排序資料中的第一筆資料插入到已排序資料的適當位置。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
與選擇排序法相同，一般我們習慣將「已排序」的資料擺在資料序列的前端，並將「未排序」的資料擺在資料序列的後端。&lt;br /&gt;
&lt;br /&gt;
若是我們需要將資料由小排到大。則我們會依序取出每個「未排序」的資料，然後由「已排序」資料的最後一筆開始，往前依序尋找第一個比這筆「未排序」資料還小的元素，並將其後的所有資料往後移一格，再將這筆「未排序」資料「插入」在這個「空出來的位子」。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其虛擬碼如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;Function insertionSort(Type data[1..n])
    Index i, j;
    Type value;
    For i from 2 to n do
        value = data[i];

        j = i - 1;
        While j &gt;= 1 and data[j] &gt; value do
            data[j + 1] = data[j];
            j = j - 1;

        data[j + 1] = value;
End
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
讓我們看看實際操作的例子。若是我們需要將以下資料由小排到大：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;83 31 96 17 42 14 54 &lt;/blockquote&gt;&lt;br /&gt;
則每一次迴圈的執行結果如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;red&quot;&gt;&lt;b&gt;83&lt;/b&gt;&lt;/font&gt; 31 96 17 42 14 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;red&quot;&gt;&lt;b&gt;31&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;green&quot;&gt;83&lt;/font&gt; 96 17 42 14 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;green&quot;&gt;31 83&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;96&lt;/b&gt;&lt;/font&gt; 17 42 14 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;red&quot;&gt;&lt;b&gt;17&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;green&quot;&gt;31 83 96&lt;/font&gt; 42 14 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;green&quot;&gt;17 31&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;42&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;green&quot;&gt;83 96&lt;/font&gt; 14 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;red&quot;&gt;&lt;b&gt;14&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;green&quot;&gt;17 31 42 83 96&lt;/font&gt; 54 &lt;/blockquote&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;green&quot;&gt;14 17 31 42&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;54&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;green&quot;&gt;83 96&lt;/font&gt; &lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同樣的，我們必須要分析這種演算法的執行效率如何。&lt;br /&gt;
&lt;br /&gt;
在資料都已排序的最佳情況下，資料大小為 n 的敘述執行次數如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;Function insertionSort(Type data[1..n])
    Index i, j;                                     // 1
    Type value;                                     // 1
    For i from 2 to n do                            // n - 1
        value = data[i];                            // n - 1

        j = i - 1;                                  // n - 1
        While j &gt;= 1 and data[j] &gt; value do         // n - 1
            data[j + 1] = data[j];                  // 0
            j = j - 1;                              // 0

        data[j + 1] = value;                        // n - 1
End
&lt;/pre&gt;&lt;br /&gt;
敘述的執行次數總和：B(n) = 1 + 1 + (n - 1) + (n - 1) + (n - 1) + (n - 1) + (n - 1) = 5n - 3 ∈ Ο(n)。複雜度為線性時間。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
但是在資料完全反序的最差情況（註1）：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;Function insertionSort(Type data[1..n])
    Index i, j;                                     // 1
    Type value;                                     // 1
    For i from 2 to n do                            // n - 1
        value = data[i];                            // n - 1

        j = i - 1;                                  // n - 1
        While j &gt;= 1 and data[j] &gt; value do         // n(n - 1) / 2
            data[j + 1] = data[j];                  // n(n - 1) / 2
            j = j - 1;                              // n(n - 1) / 2

        data[j + 1] = value;                        // n - 1
End
&lt;/pre&gt;&lt;br /&gt;
敘述的執行次數總和：W(n) = 1 + 1 + (n - 1) + (n - 1) + (n - 1) + n(n - 1) / 2 + n(n - 1) / 2 + n(n - 1) / 2 + (n - 1) = (3n&lt;sup&gt;2&lt;/sup&gt; + 3n - 4) / 2 ∈ Ο(n&lt;sup&gt;2&lt;/sup&gt;)，複雜度為平方時間。&lt;br /&gt;
&lt;br /&gt;
平均來說，這種演算法的執行效率並不算高，因此也比較不適合用以處理數量較多的資料。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;註1. 其中的 n(n - 1) / 2 是由 (n - 1) + (n - 2) + (n - 3) + ... + 1 加總化簡而來。 &lt;/blockquote&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4049736635754483284/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/10/insertion-sort.html#comment-form' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4049736635754483284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4049736635754483284'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/10/insertion-sort.html' title='【演算】插入排序法 - Insertion Sort'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-1273125334238030932</id><published>2010-04-10T15:23:00.009+08:00</published><updated>2010-04-10T16:27:18.220+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】合併排序法 - Mergesort</title><content type='html'>　　&lt;a href=&quot;http://en.wikipedia.org/wiki/Merge_sort&quot;&gt;&lt;b&gt;合併排序法（mergesort）&lt;/b&gt;&lt;/a&gt;是一個典型利用&lt;a href=&quot;http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm&quot;&gt;分治法（divide and conquer，D&amp;amp;C）&lt;/a&gt;解決問題的例子。其原理為不斷地將資料分成兩等分，直到每份的資料量小到一個程度後，各自排序後再一一合併起來。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　假設現在有 n 筆資料需要進行排序。&lt;br /&gt;
&lt;br /&gt;
　　則我們首先會將這 n 筆資料分成兩等分（大小皆為 n/2）；接著，再將這兩堆大小為 n/2 的資料各自分為兩等分（大小皆為 n/4）；同樣的，我們再將這四堆大小為 n/4 的資料各自分為兩等分（大小皆為 n/8）。&lt;br /&gt;
&lt;br /&gt;
　　如此進行下去，直到每堆的資料量足夠小（例如：每堆只剩 1 筆資料）之後，我們就分別將每堆資料進行排序，再將這些資料堆兩兩一對進行合併，直到排序完成為止。&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Image:Merge_sort_algorithm_diagram.svg&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Merge_sort_algorithm_diagram.svg/618px-Merge_sort_algorithm_diagram.svg.png&quot; width=&quot;520&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　其虛擬碼大致如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function mergeSort(Type data[1..n])
    If n &amp;lt;= 1 then return

    Index x, y, i, j
    x = n / 2
    y = n - x

    Type left[1..x], right[1..y]
    For i from 1 to x do
        left[i] = data[i]
    For i from 1 to y do
        right[i] = data[x + i]

    mergeSort(left)
    mergeSort(right)
    merge(data, left, right)
End

Function merge(Type data[1..n], Type left[1..x], Type right[1..y])
    Index i, j, k
    i = j = k = 1

    While i &amp;lt;= x and j &amp;lt;= y do
        If left[i] &amp;lt; right[j] then
            data[k] = left[i]
            i = i + 1
        Else
            data[k] = right[j]
            j = j + 1
        k = k + 1

    While i &amp;lt;= x do
        data[k] = left[i]
        i = i + 1
        k = k + 1

    While j &amp;lt;= y do
        data[k] = right[j]
        j = j + 1
        k = k + 1
End
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　讓我們舉個實際的例子說明：現在我們有八筆資料需要排序（由小而大）：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(84、13、73、26、32、19、91、38)
&lt;/blockquote&gt;
&lt;br /&gt;
　　且只要每堆的資料量大於 1 時，就需要再將資料進行分割。&lt;br /&gt;
&lt;br /&gt;
　　首先，我們先將資料分成兩等分：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(84、13、73、26)　(32、19、91、38)
&lt;/blockquote&gt;
&lt;br /&gt;
　　此時每堆的資料量為 4 (8 / 2) &gt; 1。因此，我們還需要將每堆資料再各自分成兩等分：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(84、13)　(73、26)　(32、19)　(91、38)
&lt;/blockquote&gt;
&lt;br /&gt;
　　此時每堆的資料量為 2 (4 / 2) &gt; 1。再一次，我們將每堆資料各自分成兩等分：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(13)　(84)　(26)　(73)　(19)　(32)　(38)　(91)
&lt;/blockquote&gt;
&lt;br /&gt;
　　此時每堆的資料量為 1 (2 / 2) = 1 ，符合停止切割的條件。所以接下來，我們要將資料兩兩合併。在合併的同時，同時確保資料排序：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(13、84)　(26、73)　(19、32)　(38、91)
&lt;/blockquote&gt;
&lt;br /&gt;
　　同樣的，我們將資料兩兩合併：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(13、26、73、84)　(19、32、38、91)
&lt;/blockquote&gt;
&lt;br /&gt;
　　同樣的，我們將資料兩兩合併：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
(13、19、26、32、38、73、84、91)
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　最後，我們從時間效率上來討論合併排序法。設 merge sort 的時間複雜度函數為 T(n)。&lt;br /&gt;
&lt;br /&gt;
　　我們可以知道，在每一次呼叫 mergeSort() 函式時，我們都需要分別將前半段與後半段的資料複製給 left 跟 right，所以複製資料的時間花費為 c&lt;sub&gt;1&lt;/sub&gt;n。&lt;br /&gt;
&lt;br /&gt;
　　然後，我們需要遞迴呼叫兩次資料大小為 n/2 的 mergeSort()，時間花費為 2T(n / 2)。最後再加上呼叫 merge() 函式所需的時間花費 c&lt;sub&gt;2&lt;/sub&gt;n。所以我們可以得到：T(n) = 2T(n / 2) + cn (n &gt; 1)，且 T(1) = 1。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　若是將式子展開：T(n) = 2T(n / 2) + cn = 4T(n / 4) + 2c(n / 2) + cn = 8T(n / 8) + 4c(n / 4) + 2c(n / 2) + cn = ... = cn + cn + cn + ... + cn = cn(lg n + 1) ∈ &lt;b&gt;O(n lg n)&lt;/b&gt;（註1）。&lt;br /&gt;
&lt;br /&gt;
　　由此可見，合併排序的的時間效率是相當不錯的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　另外，因為有網友詢問非遞迴的合併排序法，因此試著寫了以下這個虛擬碼：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function mergeSort(Type data[1..n])
    If n &lt;= 1 then return

    Index i, j, k
    For i from 2 to (n / 2) do
        For j from 0 to (n - 1) step (2 * i) do
            Index x, y
            x = min(i, n - j)
            y = min(i, max(0, n - i - j))

            Type left[1..x], right[1..y]
            For k from 1 to x do
                left[k] = data[j + k]
            For k from 1 to y do
                right[k] = data[i + j + k]

            Index p, q, r
            p = q = 1
            r = j
            While p &amp;lt= x and q &amp;lt= y do
                If left[p] &lt; right[q] then
                    data[r] = left[p]
                    p = p + 1
                Else
                    data[r] = right[q]
                    q = q + 1
                r = r + 1

            While p &amp;lt= x do
                data[r] = left[p]
                p = p + 1
                r = r + 1

            While q &amp;lt= y do
                data[r] = right[q]
                q = q + 1
                r = r + 1
End
&lt;/pre&gt;
&lt;br /&gt;
　　寫起來感覺不太直觀，如果有錯誤歡迎糾正我：）
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
註1. 其實可以直接利用&lt;a href=&quot;http://en.wikipedia.org/wiki/Master_theorem&quot;&gt;支配定理（Master theorem）&lt;/a&gt;來求出複雜度 T(n)。
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/1273125334238030932/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/10/mergesort.html#comment-form' title='12 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1273125334238030932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1273125334238030932'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/10/mergesort.html' title='【演算】合併排序法 - Mergesort'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-3943929717611716454</id><published>2010-03-20T19:12:00.003+08:00</published><updated>2010-03-21T13:55:27.192+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】選擇排序法 - Selection Sort</title><content type='html'>　　&lt;a href=&quot;http://en.wikipedia.org/wiki/Selection_sort&quot;&gt;&lt;b&gt;選擇排序法（selection sort）&lt;/b&gt;&lt;/a&gt;為一種較直觀的&lt;a href=&quot;http://en.wikipedia.org/wiki/Sorting_algorithm&quot;&gt;排序演算法（sorting algorithm）&lt;/a&gt;。其將資料分為「已排序」與「未排序」兩部份，並從「未排序」的資料中找出最大（最小）值，放入「已排序」資料的最後端。如是進行，直到排序結束（未排序資料為空）為止。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　一般來說，我們的作法是：將「已排序」的資料擺在資料序列的前端，並將「未排序」的資料擺在資料序列的後端。&lt;br /&gt;
&lt;br /&gt;
　　假設我們需要將 n 筆資料由大排到小。在起初，這 n 筆資料都是「未排序」的。於是，我們從這 n 筆資料取出其中的最大值，並將之放在「已排序」資料的最後端。換言之，就是將之與第一筆資料進行交換。&lt;br /&gt;
&lt;br /&gt;
　　接著，我們再從剩下的 n - 1 筆資料取出最大值，同樣放入「已排序」資料的最後端（與第二筆資料進行交換）；再從剩下的 n - 2 筆資料取出最大值，放入「已排序」資料的最後端（與第三筆資料進行交換）。&lt;br /&gt;
&lt;br /&gt;
　　以此類推，直到沒有任何「未排序」的資料為止。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　選擇排序法的虛擬碼大致如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function selectionSort(Type data[1..n])
    Index i, j, max
    For i from 1 to n do
        max = i
        For j from i + 1 to n do
            If data[j] &gt; data[max] then
                max = j

        Exchange data[i] and data[max]
End
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　舉例來說，若我們需要將以下資料由大排到小：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
19 58 33 41 28 14 53 84
&lt;/blockquote&gt;
&lt;br /&gt;
　　則以此演算法運作的過程如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;font color=&quot;red&quot;&gt;&lt;b&gt;84&lt;/b&gt;&lt;/font&gt; 58 33 41 28 14 53 &lt;b&gt;19&lt;/b&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;58&lt;/b&gt;&lt;/font&gt; 33 41 28 14 53 19
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;53&lt;/b&gt;&lt;/font&gt; 41 28 14 &lt;b&gt;33&lt;/b&gt; 19
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58 53&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;41&lt;/b&gt;&lt;/font&gt; 28 14 33 19
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58 53 41&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;33&lt;/b&gt;&lt;/font&gt; 14 &lt;b&gt;28&lt;/b&gt; 19
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58 53 41 33&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;28&lt;/b&gt;&lt;/font&gt; &lt;b&gt;14&lt;/b&gt; 19
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58 53 41 33 28&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;19&lt;/b&gt;&lt;/font&gt; &lt;b&gt;14&lt;/b&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;84 58 53 41 33 28 19&lt;/font&gt; &lt;font color=&quot;red&quot;&gt;&lt;b&gt;14&lt;/b&gt;&lt;/font&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　若是我們分析在最差情況下（所有資料的順序剛好完全相反），使用選擇排序法將 n 筆資料排序的敘述執行次數（註1）：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function selectionSort(Type data[1..n])
    Index i, j, max                                 // 1
    For i from 1 to n do                            // n
        max = i                                     // n
        For j from i + 1 to n do                    // n(n - 1) / 2
            If data[j] &gt; data[max] then             // n(n - 1) / 2
                max = j                             // n(n - 1) / 2

        Exchange data[i] and data[max]              // n
End
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　經由以上，我們可以得到最差情況下，敘訴的執行次數總和：W(n) = 1 + n + n + n(n - 1) / 2 + n(n - 1) / 2 + n(n - 1) / 2 + n = (3n&lt;sup&gt;2&lt;/sup&gt; + 3n - 2) / 2 ∈ Ο(n&lt;sup&gt;2&lt;/sup&gt;)。&lt;br /&gt;
&lt;br /&gt;
　　由此可知，選擇排序法的時間複雜度與之前介紹過的&lt;a href=&quot;http://program-lover.blogspot.com/2008/06/bubble-sort_20.html&quot;&gt;氣泡排序法（bubble sort）&lt;/a&gt;相當，同樣為效率不大優良的排序演算法。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 其中的 n(n - 1) / 2 是由 (n - 1) + (n - 2) + (n - 3) + ... + 1 加總化簡而來。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/3943929717611716454/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/08/selection-sort.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/3943929717611716454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/3943929717611716454'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/08/selection-sort.html' title='【演算】選擇排序法 - Selection Sort'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-1916014193248387322</id><published>2010-03-13T12:49:00.000+08:00</published><updated>2010-03-13T12:49:24.918+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="目錄"/><title type='text'>【目錄】Verilog</title><content type='html'>&lt;font color=&quot;red&quot;&gt;&lt;b&gt;Verilog 相關一覽&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font color=&quot;blue&quot;&gt;&lt;b&gt;筆記&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
‧&lt;a href=&quot;http://program-lover.blogspot.com/2010/03/verilog-0.html&quot;&gt;Introduction to Verilog&lt;/a&gt;&lt;br /&gt;
‧&lt;a href=&quot;http://program-lover.blogspot.com/2010/03/verilog-1_12.html&quot;&gt;Quartus II Installation&lt;/a&gt;&lt;br /&gt;
‧&lt;a href=&quot;http://program-lover.blogspot.com/2010/03/verilog-module.html&quot;&gt;Verilog Module&lt;/a&gt;&lt;br /&gt;
‧&lt;a href=&quot;http://program-lover.blogspot.com/2010/03/create-verilog-project.html&quot;&gt;Create a Verilog Project&lt;/a&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/1916014193248387322/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog_12.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1916014193248387322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1916014193248387322'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog_12.html' title='【目錄】Verilog'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4330314759164902553</id><published>2010-03-13T12:48:00.005+08:00</published><updated>2010-03-13T12:58:57.780+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="筆記"/><title type='text'>【筆記】Create a Verilog Project</title><content type='html'>　　安裝好 Verilog 的撰寫環境－－Quartus II 之後，我們還需要建置好一個專案（project）才能正式開始。所以，這裡簡單的描述一下建立專案，以及編譯 Verilog 原始碼的流程。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　首先，點選選單的 &lt;b&gt;File/New Project Wizard&lt;/b&gt;。就會跳出一個專案的建置精靈：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx9Q7wiMe6m1RvJBSVrvIL7zc8tgtqLukr-2weaW5s5Wmns1xR-0cv0LVMnTF5-PnL2AIh8FHLjSsaqef3gDfzS_xccCHSgK4EsQZ5OX44ffo__Gv_D0sykFH02x0XiYRVM1J7Jrxo1Z0/s1600-h/verilog(3).ex1.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx9Q7wiMe6m1RvJBSVrvIL7zc8tgtqLukr-2weaW5s5Wmns1xR-0cv0LVMnTF5-PnL2AIh8FHLjSsaqef3gDfzS_xccCHSgK4EsQZ5OX44ffo__Gv_D0sykFH02x0XiYRVM1J7Jrxo1Z0/s800/verilog(3).ex1.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974547419192770&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　在「&lt;b&gt;What is the working directory for this project?&lt;/b&gt;」中輸入你專案的擺放路徑，並在「&lt;b&gt;What is the name of this project?&lt;/b&gt;」中輸入專案的名稱（註1）。&lt;br /&gt;
&lt;br /&gt;
　　若是專案路徑的資料夾不存在，會跳出訊息問你是否要建立它：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1gW7LHuJDK3Pq9AJz6ELbWHWX59Rlwdz6v-BkJr8RxXZzKIYhL9mSRXSM6zRy9z-ZCQxISKfQvXGBJC1dE-mLPmRJkC1vNNy0v8gI4kTpqL_3N5DD0kpOjsx3afDOLjuU4gbCI57fuS0/s1600-h/verilog(3).ex2.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1gW7LHuJDK3Pq9AJz6ELbWHWX59Rlwdz6v-BkJr8RxXZzKIYhL9mSRXSM6zRy9z-ZCQxISKfQvXGBJC1dE-mLPmRJkC1vNNy0v8gI4kTpqL_3N5DD0kpOjsx3afDOLjuU4gbCI57fuS0/s800/verilog(3).ex2.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974550943909874&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　確定要建立，就選擇「是」。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　按下 Next 之後，我們可以加入一些現有的檔案到專案裡頭：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYsZ622wQV45EorIeac2iRRdv471zDzLV3KxNdHLRQaB0wyCSvONSNKOXl2wPBBydCc09TedBkF6vi2NI9dGBAZl1KoEFSyXT2s8ETg-zE_669FZqzTlFp7ZcqtE7S_frbEhMzyou1Z1s/s1600-h/verilog(3).ex3.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYsZ622wQV45EorIeac2iRRdv471zDzLV3KxNdHLRQaB0wyCSvONSNKOXl2wPBBydCc09TedBkF6vi2NI9dGBAZl1KoEFSyXT2s8ETg-zE_669FZqzTlFp7ZcqtE7S_frbEhMzyou1Z1s/s800/verilog(3).ex3.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974555020816898&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　你可以利用 File name 後方的「...」按鈕開啟檔案對話方塊，選擇要加入的檔案，再按下 Add 按鈕加入專案。也可以直接按下 Add All 將目錄下的檔案都加到專案中。&lt;br /&gt;
&lt;br /&gt;
　　不過，這裡我們還沒有任何現存的檔案可以加入，所以直接按下 Finish 完成專案建置（註2）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　建立好專案之後，我們還需要建立一個 Verilog 的原始碼檔案。按下選單的 &lt;b&gt;File/New&lt;/b&gt;，就會出現對話框詢問你新增的檔案類型：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUZBgEQodIw-jYiA22wUvwmNrtdJ6nqMnPOzTn8OX7vLACCTBL0AY_1bm-pyS0eVXL_kwMvdUUwDIW6UHj4GH1g4Ekq85Gfsd8J2ntCRDv5eGzfVO1AaBJJUD_RwfrRhmFG59edG4ONWE/s1600-h/verilog(3).ex4.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand; width:362px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUZBgEQodIw-jYiA22wUvwmNrtdJ6nqMnPOzTn8OX7vLACCTBL0AY_1bm-pyS0eVXL_kwMvdUUwDIW6UHj4GH1g4Ekq85Gfsd8J2ntCRDv5eGzfVO1AaBJJUD_RwfrRhmFG59edG4ONWE/s800/verilog(3).ex4.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974566114713042&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　由於我們要是 Verilog 的原始碼檔案，所以選擇「&lt;b&gt;Verilog HDL File&lt;/b&gt;」。&lt;br /&gt;
&lt;br /&gt;
　　新增完成之後，就可以直接開始撰寫程式碼（下圖中的程式碼為先前 &lt;a href=&quot;http://program-lover.blogspot.com/2010/03/verilog-module.html&quot;&gt;Verilog Module&lt;/a&gt; 解釋的 AndGate Module）：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioCZebZSYefduwAm4PSHIDi2rZ7ypFRScV7QY8qcuEX1UrhMQG8O5xHa9t51k8N_Ux55fvSD4ztZ6M-sXIbezSzIIcqw31vOOcGPQwb0eXm3Z4Fq6qiqvGfKz_eKng0_MxSM8PW08UPPg/s1600-h/verilog(3).ex5.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioCZebZSYefduwAm4PSHIDi2rZ7ypFRScV7QY8qcuEX1UrhMQG8O5xHa9t51k8N_Ux55fvSD4ztZ6M-sXIbezSzIIcqw31vOOcGPQwb0eXm3Z4Fq6qiqvGfKz_eKng0_MxSM8PW08UPPg/s800/verilog(3).ex5.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974567639629570&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　接下來將檔案存檔：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg72qG6fX8zIg2EJ8FRpmPxjC2JnAmYWEt3J1BfJbzhuSZ0Mtr1CLfiJC9KSsrueEwKRfa9HOYadGoZ_aBQhTCHAFuRxbOSrvFgi9DLs_qbi8HtMehgL3gdJGDBRg20hLXFhG1XgqXCcKg/s1600-h/verilog(3).ex6.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg72qG6fX8zIg2EJ8FRpmPxjC2JnAmYWEt3J1BfJbzhuSZ0Mtr1CLfiJC9KSsrueEwKRfa9HOYadGoZ_aBQhTCHAFuRxbOSrvFgi9DLs_qbi8HtMehgL3gdJGDBRg20hLXFhG1XgqXCcKg/s800/verilog(3).ex6.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974963475642802&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　請記得，&lt;font color=&quot;red&quot;&gt;&lt;b&gt;Quartus II 的主要模組一定要跟檔案名稱相同&lt;/b&gt;&lt;/font&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　接下來，就可以按下選單的 Precessing/Start Compilation 開始編譯的動作。假如跳出「Full Compilation was successful」的對話框，就代表編譯成功了（註3）：&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilTNb4RkjE7jA3LsXhZQkLKz7RKw_E1Or6DpXnLiglLWVKuBC_l0FSjh38sBz3CEQK5jCHt8MJX2tGlz4j1jRIrPr33kBs0NsoJbN8O4nb6z0WXkL0lXjesjBFew3MGZ08O4KzyExTVc/s1600-h/verilog(3).ex7.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 287px; height: 123px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhilTNb4RkjE7jA3LsXhZQkLKz7RKw_E1Or6DpXnLiglLWVKuBC_l0FSjh38sBz3CEQK5jCHt8MJX2tGlz4j1jRIrPr33kBs0NsoJbN8O4nb6z0WXkL0lXjesjBFew3MGZ08O4KzyExTVc/s800/verilog(3).ex7.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447974967695224354&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 建議將專案放在獨立的地方，並為專案取個有意義的名稱，方便以後重複使用專案。&lt;br /&gt;
註2. 實際上後面還有一些設定燒錄晶片跟相關工具的部份，不過這裡我們目前都用不到。&lt;br /&gt;
註3. 這裡會看到其實編譯過程中會有些警告訊息。雖然這裡我們並不在意它，不過你也可以去看看這些警告訊息，查查到底為什麼。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4330314759164902553/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/03/create-verilog-project.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4330314759164902553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4330314759164902553'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/03/create-verilog-project.html' title='【筆記】Create a Verilog Project'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx9Q7wiMe6m1RvJBSVrvIL7zc8tgtqLukr-2weaW5s5Wmns1xR-0cv0LVMnTF5-PnL2AIh8FHLjSsaqef3gDfzS_xccCHSgK4EsQZ5OX44ffo__Gv_D0sykFH02x0XiYRVM1J7Jrxo1Z0/s72-c/verilog(3).ex1.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-8459972036396899837</id><published>2010-03-13T00:09:00.004+08:00</published><updated>2010-03-13T00:18:30.325+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="筆記"/><title type='text'>【筆記】Verilog Module</title><content type='html'>　　在之前的&lt;a href=&quot;http://program-lover.blogspot.com/2010/03/verilog-0.html&quot;&gt;簡介&lt;/a&gt;中提到，Verilog 以&lt;b&gt;模組（module）&lt;/b&gt;作為描述的基本單位。模組如同程式語言中的函式（function），可以將一部份的程式碼封裝起來，並提供對外溝通的介面（interface）。如此一來，我們便可以重複利用這些定義好的模組，以構成較大、較複雜的系統。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　我們可以將模組看成兩個部份：&lt;b&gt;連接埠（port）的宣告&lt;/b&gt;，以及&lt;b&gt;模組的主體（body）&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
　　其中，連接埠類似於程式語言中函式的參數（parameter），&lt;u&gt;提供了對外溝通的介面&lt;/u&gt;。包含了&lt;b&gt;輸入埠（input）&lt;/b&gt;、&lt;b&gt;輸出埠（output）&lt;/b&gt;、或是兼具輸出入的&lt;b&gt;雙向埠（inout）&lt;/b&gt;。簡單來說的話，其實可以把連接埠想成一顆 IC 上面的接腳（pin）。&lt;br /&gt;
&lt;br /&gt;
　　而模組主體則類似於程式語言中的函式主體，&lt;u&gt;表達了模組的結構，或是模組的功能與行為&lt;/u&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　以下是一個 Verilog 的模組，代表一個 and 邏輯閘：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
module AndGate(out, a, b);
    input   a, b;
    output  out;

    and(out, a, b);
endmodule
&lt;/pre&gt;
&lt;br /&gt;
　　接著，讓我們一步一步理解這個簡易的模組。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
module AndGate(out, a, b);
&lt;/pre&gt;
&lt;br /&gt;
　　這裡的「&lt;b&gt;module&lt;/b&gt;」為 Verilog 語法的關鍵字，代表一個模組宣告的開頭；「AndGate」為這個模組的名稱（註1）；而括號中的 out、a、跟 b，則是這個模組的連接埠（註2）。&lt;br /&gt;
&lt;br /&gt;
　　不過，在這裡並沒有指明連接埠的類型（input、output、或是 inout）。所以我們將在下面兩行宣告它們：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
    input   a, b;
    output  out;
&lt;/pre&gt;
&lt;br /&gt;
　　我們宣告 a 跟 b 為 AndGate 的輸入埠，且 out 為 AndGate 的輸出埠。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　而模組主體的部份，我們只做了一個簡單的動作：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
    and(out, a, b);
&lt;/pre&gt;
&lt;br /&gt;
　　「and」為 Verilog 提供的內建邏輯閘。這裡的動作是將輸入埠 a 跟 b 進行 and 運算，並以輸出埠 out 作為運算後的結果（註3）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　最後，我們以「&lt;b&gt;endmodule&lt;/b&gt;」關鍵字結束模組的宣告：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
endmodule
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　這個模組的示意圖大致如下：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYAHMqsmwpQWOMGvMGTIQh-UC-g4d4jRZGuwn1bYnN6z5kdFM63MIYM0dgxxxDWUXx60K-4xeafQQZv1y-PPOd6B5yZVsGuzsSDOAa3Ae-Q3mwBJnWKs0wF_0vs0w2p_M-le1wbWVOlQ/s1600-h/verilog(2).ex1.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 216px; height: 136px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYAHMqsmwpQWOMGvMGTIQh-UC-g4d4jRZGuwn1bYnN6z5kdFM63MIYM0dgxxxDWUXx60K-4xeafQQZv1y-PPOd6B5yZVsGuzsSDOAa3Ae-Q3mwBJnWKs0wF_0vs0w2p_M-le1wbWVOlQ/s800/verilog(2).ex1.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447780283729911650&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 你可以根據模組的功能，自行取一個有意義的名稱。&lt;br /&gt;
註2. 一般來說，我們習慣將 output 寫在前面、將 input 寫在後面。&lt;br /&gt;
註3. 或許想成「將 a 跟 b 接到 and gate 的 input 接腳，並將 out 接到 and gate 的 output 接腳」會比較好理解。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/8459972036396899837/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-module.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/8459972036396899837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/8459972036396899837'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-module.html' title='【筆記】Verilog Module'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgYAHMqsmwpQWOMGvMGTIQh-UC-g4d4jRZGuwn1bYnN6z5kdFM63MIYM0dgxxxDWUXx60K-4xeafQQZv1y-PPOd6B5yZVsGuzsSDOAa3Ae-Q3mwBJnWKs0wF_0vs0w2p_M-le1wbWVOlQ/s72-c/verilog(2).ex1.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4584614795288315478</id><published>2010-03-12T19:34:00.007+08:00</published><updated>2010-03-12T21:14:16.742+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="筆記"/><title type='text'>【筆記】Quartus II Installation</title><content type='html'>　　在實際開始撰寫 Verilog 之前，我們需要先安裝好撰寫執行 Verilog 程式的環境工具。而這裡我們採用的工具，是 &lt;a href=&quot;http://www.altera.com/&quot;&gt;Altera&lt;/a&gt; 公司的 Quartus II 這套軟體。&lt;br /&gt;
&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
　　Quartus II 是一套用以撰寫 Verilog、VHDL、AHDL 等 HDL 的開發工具，除了可以進行程式的編輯與編譯之外，也可以用以產生邏輯圖、狀態圖、波形圖等等，在功能上算是相當齊全。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　現行的 Quartus II 有兩個不同的版本：Web Edition 與 Subscription Edition。&lt;br /&gt;
&lt;br /&gt;
　　其中 Subscription Edition 有提供 30 天的試用期。超過試用期之後，是需要經過授權才可以繼續使用的。而 Web Edition 則是免費的版本，可以直接下載來使用。&lt;br /&gt;
&lt;br /&gt;
　　這裡我們要使用的是 &lt;a href=&quot;http://www.altera.com/products/software/quartus-ii/web-edition/qts-we-index.html&quot;&gt;&lt;b&gt;Web Edition&lt;/b&gt;&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　要取得 Quartus II Web Edition，需要先連到其&lt;a href=&quot;https://www.altera.com/support/software/download/altera_design/quartus_we/dnl-quartus_we.jsp&quot;&gt;下載頁面&lt;/a&gt;：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxMhlPK2gfzMksWmgxZ69ezKJWizDP8MOLZYS5_wM9t_pmL7TXSjr8HhmqT-H6yan_KaODBbbACw47bwup64HKCJr-XxQvGL9Tacdw9mVm9MiFC59IrdYRoPCyheIwFBwGuoXeCMEC36s/s1600-h/verilog(1).ex1.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxMhlPK2gfzMksWmgxZ69ezKJWizDP8MOLZYS5_wM9t_pmL7TXSjr8HhmqT-H6yan_KaODBbbACw47bwup64HKCJr-XxQvGL9Tacdw9mVm9MiFC59IrdYRoPCyheIwFBwGuoXeCMEC36s/s800/verilog(1).ex1.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447708378566211474&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
　　然後，選擇下載「&lt;b&gt;Quartus® II Web Edition Software v9.1 Service Pack 1&lt;/b&gt;」（請依照當前最新版本自行尋找）。&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7dXrEMDmCpkEukJeMRTInZZrgbgYCnUT4W45wPW8Ti4RyX9TpOusLHlv51qL1SXmWWWrBJB3WC70FU1X3dqqkdm36yiKoXsN5rcV1wpP-UGtHwxKmh98-QIelHT_gWX-k7wbt2JTEqP4/s1600-h/verilog(1).ex2.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7dXrEMDmCpkEukJeMRTInZZrgbgYCnUT4W45wPW8Ti4RyX9TpOusLHlv51qL1SXmWWWrBJB3WC70FU1X3dqqkdm36yiKoXsN5rcV1wpP-UGtHwxKmh98-QIelHT_gWX-k7wbt2JTEqP4/s800/verilog(1).ex2.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447708386235002178&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
　　接著會進到 Account Sign-In 的畫面。假設各位都沒有 Altera 的帳號，可以選擇「&lt;b&gt;Get One-Time Access&lt;/b&gt;」並在下面的文字框輸入你的 E-mail，就能夠不經由註冊的步驟繼續下載。&lt;br /&gt;
&lt;br /&gt;
　　當然，若是你真的想註冊一個帳號，選擇「Create Your myAltera Account」並完成註冊步驟也是可以的。&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLxqCf3JqAAAYfEtocPGXvg2CqbQ5MTeM2J3lzJr9tP72f9NEBrnjtyweyuvSeg78Gg87jTXVZd_D6XV-BOBhOTjplPDwCiAjQxVmUlpvHOwXW0sLJnbvANMiugPGNP-jBAgrLjhCnJoA/s1600-h/verilog(1).ex3.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLxqCf3JqAAAYfEtocPGXvg2CqbQ5MTeM2J3lzJr9tP72f9NEBrnjtyweyuvSeg78Gg87jTXVZd_D6XV-BOBhOTjplPDwCiAjQxVmUlpvHOwXW0sLJnbvANMiugPGNP-jBAgrLjhCnJoA/s800/verilog(1).ex3.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447708392883188450&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
　　最後，拉到頁面下方，點選「&lt;b&gt;Click to Download Your File Now&lt;/b&gt;」，就可以進行下載，並開始安裝（因為安裝過程只需要選擇安裝路徑，這裡就不花版面贅述了）。&lt;br /&gt;
&lt;br /&gt;
　　由於檔案大小高達 1.5GB，下載跟安裝的動作比較耗時，所以可能需要耐心等待一下子。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　安裝完成之後，就可以開始使用 Quartus II 這套功能強大的工具囉：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdQzp3g86dQtIj9GzbIuGCx62_bD_sBM9A1OL43cN06RiF393hiqIsgOppm_nuoY2IN4EUJtMrmh4skSElOVmRpvI7OT9ARSYIaBkeMOx5CjLw0ayE5Ou8huMjvxG0ecOVjqhEMKsrPA8/s1600-h/verilog(1).ex4.JPG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdQzp3g86dQtIj9GzbIuGCx62_bD_sBM9A1OL43cN06RiF393hiqIsgOppm_nuoY2IN4EUJtMrmh4skSElOVmRpvI7OT9ARSYIaBkeMOx5CjLw0ayE5Ou8huMjvxG0ecOVjqhEMKsrPA8/s800/verilog(1).ex4.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447710460573033858&quot; /&gt;&lt;/a&gt;&lt;/center&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4584614795288315478/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-1_12.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4584614795288315478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4584614795288315478'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-1_12.html' title='【筆記】Quartus II Installation'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxMhlPK2gfzMksWmgxZ69ezKJWizDP8MOLZYS5_wM9t_pmL7TXSjr8HhmqT-H6yan_KaODBbbACw47bwup64HKCJr-XxQvGL9Tacdw9mVm9MiFC59IrdYRoPCyheIwFBwGuoXeCMEC36s/s72-c/verilog(1).ex1.JPG" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-1804495030123972369</id><published>2010-03-12T19:31:00.004+08:00</published><updated>2010-03-12T21:03:45.193+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Verilog"/><category scheme="http://www.blogger.com/atom/ns#" term="筆記"/><title type='text'>【筆記】Introduction to Verilog</title><content type='html'>　　因為系上這學期有一門要寫 Verilog 的必修課，所以想說乾脆直接在 blog 上做個筆記整理內容，並供一起上課的同學們作為參考。不過，其中的許多內容都不是我非常瞭解的，假如有任何錯誤或問題，都歡迎各位提出來。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　說到 &lt;a href=&quot;http://en.wikipedia.org/wiki/Verilog&quot;&gt;&lt;b&gt;Verilog&lt;/b&gt;&lt;/a&gt; 就不能不先提到 &lt;a href=&quot;http://en.wikipedia.org/wiki/Hardware_description_language&quot;&gt;&lt;b&gt;HDL（Hardware Description Language，硬體描述語言）&lt;/b&gt;&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
　　所謂 HDL，即是利用一般高階語言的程式撰寫法，以達成數位電路功能或結構的設計、驗證與模擬。利用 HDL，我們便可以不必透過傳統的手繪方式設計電路，再在麵包板上接出電路來進行驗證與模擬。而 Verilog 則是主流的兩種 HDL 之一（註1）。&lt;br /&gt;
&lt;br /&gt;
　　Verilog 在設計時採用了近似於 C 語言的語法，以類似於函式（function）的&lt;b&gt;模組（module）&lt;/b&gt;作為描述的基本單位。對於熟悉 C 語言的程式設計師來說，Verilog 還算是相當容易學習。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　在實際的設計上，Verilog 則提供了四種層級的描述方式，供設計者在不同層次的觀點上設計電路。分別為：&lt;b&gt;開關層級（Switch Level）&lt;/b&gt;、&lt;b&gt;邏輯閘層級（Gate Level）&lt;/b&gt;、&lt;b&gt;資料流層級（Dataflow Level）&lt;/b&gt;與&lt;b&gt;行為層級（Behavioral Level）&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
　　開關層級是 Verilog 所提供的最低層級。在這個層級上，設計者需要瞭解電路的開關－－電晶體（transistor）的元件特性，並以此進行電路的設計。&lt;br /&gt;
&lt;br /&gt;
　　在邏輯閘層級中，設計者的觀點從一個個的電晶體，轉到較高層的邏輯閘（logic gate）。以此觀點，設計者可以直接利用如 and、or、not、xor 等邏輯閘，與將之連接的線路來進行設計。&lt;br /&gt;
&lt;br /&gt;
　　在資料流層級中，我們關注的則是資料如何經由硬體元件進行處理、儲存、與流向；而在最高層級的行為層級上，設計者只需要知道模組與函式間的功能，而不去考慮硬體實作的細節。&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrEta6_53dfxAuFp4bV3yY3om-GW4RAtW4BEqzTfzsMcaMcdkcGiBczwlGi94M99NxxDc_3bMT48aJZEBKbyeZkSQw2yX48kXTl9ANcCObRNxPRRbmchR5SHozg2RS2ALPkVx0lHPAKGw/s1600-h/verilog(0).ex1.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 350px; height: 230px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrEta6_53dfxAuFp4bV3yY3om-GW4RAtW4BEqzTfzsMcaMcdkcGiBczwlGi94M99NxxDc_3bMT48aJZEBKbyeZkSQw2yX48kXTl9ANcCObRNxPRRbmchR5SHozg2RS2ALPkVx0lHPAKGw/s800/verilog(0).ex1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5447710727504659810&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 另一種常用的硬體描述語言是 &lt;a href=&quot;http://en.wikipedia.org/wiki/VHDL&quot;&gt;VHDL（Very-High-Speed Integrated Circuit Hardware Description Language）&lt;/a&gt;。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/1804495030123972369/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-0.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1804495030123972369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/1804495030123972369'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2010/03/verilog-0.html' title='【筆記】Introduction to Verilog'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrEta6_53dfxAuFp4bV3yY3om-GW4RAtW4BEqzTfzsMcaMcdkcGiBczwlGi94M99NxxDc_3bMT48aJZEBKbyeZkSQw2yX48kXTl9ANcCObRNxPRRbmchR5SHozg2RS2ALPkVx0lHPAKGw/s72-c/verilog(0).ex1.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-3044757148971300754</id><published>2010-03-07T13:09:00.005+08:00</published><updated>2010-03-20T19:14:23.349+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】氣泡排序法 - Bubble Sort</title><content type='html'>　　&lt;a href=&quot;http://en.wikipedia.org/wiki/Bubble_sort&quot;&gt;&lt;b&gt;氣泡排序法（bubble sort）&lt;/b&gt;&lt;/a&gt;是&lt;a href=&quot;http://en.wikipedia.org/wiki/Sorting_algorithm&quot;&gt;排序演算法（sorting algorithm）&lt;/a&gt;中較簡易的一種。其運作的原理是藉由逐次比較相鄰的兩筆資料，並依照排序條件（由大至小或由小至大）交換資料直到排序完成為止。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　假設現在我們需要將 n 筆資料 A&lt;sub&gt;1&lt;/sub&gt;、A&lt;sub&gt;2&lt;/sub&gt;、......、A&lt;sub&gt;n&lt;/sub&gt; 由小排到大。&lt;br /&gt;
&lt;br /&gt;
　　一開始，我們需要先比較 A&lt;sub&gt;1&lt;/sub&gt; 與 A&lt;sub&gt;2&lt;/sub&gt; 兩筆資料的大小。若是 A&lt;sub&gt;1&lt;/sub&gt; &gt; A&lt;sub&gt;2&lt;/sub&gt;，則交換兩筆資料；接著比較 A&lt;sub&gt;2&lt;/sub&gt; 與 A&lt;sub&gt;3&lt;/sub&gt;。若是 A&lt;sub&gt;2&lt;/sub&gt; &gt; A&lt;sub&gt;3&lt;/sub&gt;，則交換兩筆資料；以此類推，一直到比較完 A&lt;sub&gt;n - 1&lt;/sub&gt; 與 A&lt;sub&gt;n&lt;/sub&gt; 為止。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　這樣就完了嗎？當然還沒。到目前為止，我們只確定 A&lt;sub&gt;n&lt;/sub&gt; 是 n 筆資料中最大的數字。&lt;br /&gt;
&lt;br /&gt;
　　接下來，重複剛剛的動作：比較 A&lt;sub&gt;1&lt;/sub&gt; 與 A&lt;sub&gt;2&lt;/sub&gt;、A&lt;sub&gt;2&lt;/sub&gt; 與 A&lt;sub&gt;3&lt;/sub&gt;、A&lt;sub&gt;3&lt;/sub&gt; 與 A&lt;sub&gt;4&lt;/sub&gt;、......，不同的是，這一次只需要比較到 A&lt;sub&gt;n - 2&lt;/sub&gt; 與 A&lt;sub&gt;n - 1&lt;/sub&gt; 即可。到目前為止，我們可以確定 A&lt;sub&gt;n - 1&lt;/sub&gt; 是 n 筆資料中次大的數字。&lt;br /&gt;
&lt;br /&gt;
　　接著就繼續重複同樣的動作，便能確定每一輪比較中的最大資料，皆在這些資料的最後面。直到所有資料排序完成為止。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　其原理的虛擬碼大致如下：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function bubbleSort(Type data[1..n])
    Index i, j;
    For i from n to 2 do
        For j from 1 to i - 1 do
            If data[j] &gt; data[j + 1] then
                Exchange data[j] and data[j + 1]
End
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　讓我們舉個實際的例子來說明。若是我們現在要將以下這些資料由大排到小：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
1 43 6 79 50 2
&lt;/blockquote&gt;
&lt;br /&gt;
　　則第一輪的比較與交換過程如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;font color=&quot;red&quot;&gt;&lt;b&gt;43 1&lt;/b&gt;&lt;/font&gt; 6 79 50 2
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;6 1&lt;/b&gt;&lt;/font&gt; 79 50 2
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 6 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;79 1&lt;/b&gt;&lt;/font&gt; 50 2
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 6 79 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;50 1&lt;/b&gt;&lt;/font&gt; 2
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 6 79 50 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;2 1&lt;/b&gt;&lt;/font&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
　　第二輪的比較與交換過程如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;font color=&quot;green&quot;&gt;&lt;b&gt;43 6&lt;/b&gt;&lt;/font&gt; 79 50 2 1
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;79 6&lt;/b&gt;&lt;/font&gt; 50 2 1
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 79 &lt;font color=&quot;red&quot;&gt;&lt;b&gt;50 6&lt;/b&gt;&lt;/font&gt; 2 1
&lt;/blockquote&gt;
&lt;blockquote&gt;
43 79 50 &lt;font color=&quot;green&quot;&gt;&lt;b&gt;6 2&lt;/b&gt;&lt;/font&gt; 1
&lt;/blockquote&gt;
&lt;br /&gt;
　　接下來以此類推。&lt;br /&gt;
&lt;br /&gt;
　　由此可以看到，資料中較小的一筆會藉由交換慢慢「浮」到資料頂端，其「氣泡排序」之名也是因此而來。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　若是我們分析在最差情況下（即所有資料的順序剛好完全相反，因為我們必須在每一輪迴圈，藉由不斷交換兩筆資料的動作，把最前頭的資料移到最後面），使用氣泡排序法將 n 筆資料排序的敘述執行次數（註1）：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function bubbleSort(Type data[1..n])
    Index i, j;                                     // 1
    For i from n to 2 do                            // n - 1
        For j from 1 to i - 1 do                    // n(n - 1) / 2
            If data[j] &gt; data[j + 1] then           // n(n - 1) / 2
                Exchange data[j] and data[j + 1]    // n(n - 1) / 2
End
&lt;/pre&gt;
&lt;br /&gt;
　　可得出所有敘述的執行次數總和為：W(n) = 1 + (n - 1) + n(n - 1) / 2 + n(n - 1) / 2 + n(n - 1) / 2 = (3n&lt;sup&gt;2&lt;/sup&gt; - n) / 2 ∈ Ο(n&lt;sup&gt;2&lt;/sup&gt;)，為一個平方時間（quadratic time）的演算法。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　而在最好的情況下（即所有資料都為已排序狀態，因為不需要進行任何一次交換動作）：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function bubbleSort(Type data[1..n])
    Index i, j;                                     // 1
    For i from n to 2 do                            // n - 1
        For j from 1 to i - 1 do                    // n(n - 1) / 2
            If data[j] &gt; data[j + 1] then           // n(n - 1) / 2
                Exchange data[j] and data[j + 1]    // 0
End
&lt;/pre&gt;
&lt;br /&gt;
　　所有敘述的執行次數總和為：B(n) = 1 + (n - 1) + n(n - 1) / 2 + n(n - 1) / 2 + 0 = n&lt;sup&gt;2&lt;/sup&gt; ∈ Ο(n&lt;sup&gt;2&lt;/sup&gt;)。複雜度依舊為平方時間。&lt;br /&gt;
&lt;br /&gt;
　　對於一種排序演算法而言，這樣複雜度是相當沒有效率的。因此這個方法多半只是被拿來簡單的解釋排序概念，而不是拿來實際應用。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 其中的 n(n - 1) / 2 是由 (n - 1) + (n - 2) + (n - 3) + ... + 1 加總化簡而來。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/3044757148971300754/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/06/bubble-sort_20.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/3044757148971300754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/3044757148971300754'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/06/bubble-sort_20.html' title='【演算】氣泡排序法 - Bubble Sort'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-7233628296754922813</id><published>2010-03-07T00:02:00.004+08:00</published><updated>2010-03-07T00:23:38.629+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】遞迴函式 - Recursive Function</title><content type='html'>　　所謂的&lt;a href=&quot;http://en.wikipedia.org/wiki/Recursion_(computer_science)&quot;&gt;&lt;b&gt;遞迴（recursion）&lt;/b&gt;&lt;/a&gt;，簡單來說就是「&lt;a href=&quot;http://en.wikipedia.org/wiki/Subroutine&quot;&gt;函式（function）&lt;/a&gt;不斷呼叫自身」的一種程式撰寫法。遞迴的意義，在於把一個問題切割成相同性質的較小問題來解決。而為了防止程式無窮盡的遞迴下去，我們還必須為所寫出來的遞迴函式設定一個&lt;b&gt;終止條件（termination condition）&lt;/b&gt;。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
　　遞迴的原理，是利用函式本身的&lt;a href=&quot;http://en.wikipedia.org/wiki/Call_stack&quot;&gt;&lt;b&gt;堆疊（stack）&lt;/b&gt;&lt;/a&gt;性質－－&lt;a href=&quot;http://en.wikipedia.org/wiki/LIFO&quot;&gt;&lt;b&gt;後進先出（last in, first out，LIFO）&lt;/b&gt;&lt;/a&gt;來達成的。說得簡單一點，就是當某個函式呼叫另一個函式時，其會先執行完被呼叫的函式，才繼續執行自身的函式內容。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　讓我們舉一個常見的例子來解釋：&lt;a href=&quot;http://en.wikipedia.org/wiki/Factorial&quot;&gt;階乘（factorial）&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
　　在數學上的定義中，對於一個非負整數 n，其階乘代表的是所有小於或等於 n 的正整數乘積，記作 n!。即 n! = 1 × 2 × 3 × ... × n。若我們規定 0! = 1，則可以將之改寫成：對於所有非負整數 n，(n + 1)! = (n + 1) × n!。&lt;br /&gt;
&lt;br /&gt;
　　於是，我們便可以利用程式寫出計算階乘的遞迴函式。以下為其虛擬碼：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Function factorial(Integer n)
    If n = 0 then
        Return 1
    Else
        Return n × factorial(n - 1)
End
&lt;/pre&gt;
&lt;br /&gt;
　　在這裡，我們相當於將原始的問題 n! 看作是 n × (n - 1)! 這個較小的問題。也就是得知 (n - 1)! 的值，就可以求得 n! 的解。同樣的，又可以將 (n - 1)! 看作是 (n - 1) × (n - 2)!、將 (n - 2)! 看作是 (n - 2) × (n - 3)!、......。&lt;br /&gt;
&lt;br /&gt;
　　舉例來說，若是我們需要利用程式求出 6! 的值。則在我們呼叫 factorial(6) 時，為了得出結果，亦須求出 factorial(5) 的值。而為了得出 factorial(5) 的結果，我們亦須求出 factorial(4) 的值......。一直不斷遞迴下去，直到達到終止條件：n = 0 為止。&lt;br /&gt;
&lt;br /&gt;
　　實際運作的結果，就如下圖所示意的（藍箭頭代表呼叫，紅箭頭代表回傳）：&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyOf7mzNkIiI6tcSWVQU3LxbCdUEB3L0NMV1x4Mid1Mudr3aB-XkQXQf29t1OeRtRi_tLAi_9NNf7RiSzPQ-IJThtHs_YJOwAi_pX7IA-zLKEcHZocjNPQ2dZYB72O1OhckMPgEahwaQs/s1600-h/recursion.ex1.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 520px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyOf7mzNkIiI6tcSWVQU3LxbCdUEB3L0NMV1x4Mid1Mudr3aB-XkQXQf29t1OeRtRi_tLAi_9NNf7RiSzPQ-IJThtHs_YJOwAi_pX7IA-zLKEcHZocjNPQ2dZYB72O1OhckMPgEahwaQs/s800/recursion.ex1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5445551418808877650&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　除此之外，遞迴還可以解決相當多其他的問題。例如&lt;a href=&quot;http://program-lover.blogspot.com/2008/08/fibonacci-sequence.html&quot;&gt;斐波那契數列（fibonacci sequence）&lt;/a&gt;、&lt;a href=&quot;http://program-lover.blogspot.com/2008/05/mouse-in-maze.html&quot;&gt;老鼠走迷宮（mouse in a maze）&lt;/a&gt;、以及&lt;a href=&quot;http://program-lover.blogspot.com/2008/06/tower-of-hanoi.html&quot;&gt;河內塔（tower of hanoi）&lt;/a&gt;等等，這裡我就不加贅述了。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　雖然利用程式的遞迴解法較為直觀，但是不斷堆疊函式的結果，極有可能浪費了過多的記憶體空間。其實，遞迴的程式多半都能藉由迴圈的方式替代，只是程式也可能會因此變得複雜難懂。至於實際上要使用何者，就看你怎麼選擇囉。
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/7233628296754922813/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/11/recursive-function.html#comment-form' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/7233628296754922813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/7233628296754922813'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/11/recursive-function.html' title='【演算】遞迴函式 - Recursive Function'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyOf7mzNkIiI6tcSWVQU3LxbCdUEB3L0NMV1x4Mid1Mudr3aB-XkQXQf29t1OeRtRi_tLAi_9NNf7RiSzPQ-IJThtHs_YJOwAi_pX7IA-zLKEcHZocjNPQ2dZYB72O1OhckMPgEahwaQs/s72-c/recursion.ex1.png" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4949960181628888221.post-4657215487644355919</id><published>2010-03-06T21:34:00.006+08:00</published><updated>2010-03-06T21:59:08.795+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="演算"/><title type='text'>【演算】複雜度分析 - Complexity Analysis</title><content type='html'>　　在&lt;a href=&quot;http://program-lover.blogspot.com/2008/08/algorithm.html&quot;&gt;演算法簡介&lt;/a&gt;中，我們提到了「找電話」問題的兩個演算法：分別為「依序找」跟「按筆劃找」。我們可以知道，對於相同的問題，可能會同時存在許多不同的解法。然而在這種擁有多種可能解法的情況下，我們理應對這些演算法進行評估，並從中選擇一種最有效的方式。&lt;br /&gt;
&lt;span id=&quot;detail&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　從比較執行時間的層面來看，或許你會想到：直接利用計時器來比較不同演算法實現程式的執行時間。但是，這種方式的變因太多。實作演算法的程式語言、記憶體大小、不同的編譯（直譯）器、甚至是電腦中運行的程式，可能都會影響計時所得的結果。相對的，這種方式也就顯得不太準確。&lt;br /&gt;
&lt;br /&gt;
　　除了實際去計時之外，我們也可以假設演算法中「每一步」的執行時間都相同。於是，我們也可以直接拿演算法所有「步驟」的執行次數總和來進行比較。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　讓我們同樣以「依序找電話」演算法為例。&lt;br /&gt;
&lt;br /&gt;
　　先考慮在最差情況（worst case）下（也就是欲尋找的電話號碼不在電話簿中，因為你必須搜遍整本電話簿），「依序找電話」虛擬碼每行敘述的執行次數如下（方便起見，我們以變數 n 代表電話簿的大小 phoneBook.size）：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;code&quot;&gt;
Input name                                          // 1
While True do                                       // n
    If index &gt; phoneBook.size then                  // n
        Output &quot;phone number not found&quot;             // 1
        Break loop                                  // 1

    If phoneBook.record[index].name = name then     // n
        Output phoneBook.record[index].phone        // 0
        Break loop                                  // 0

    index = index + 1                               // n
&lt;/pre&gt;
&lt;br /&gt;
　　因此在最差情況下，每行敘述的執行次數總和：&lt;b&gt;W(n) = 1 + n + n + 1 + 1 + n + 0 + 0 + n = 4n + 3&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
　　由此可以發現，&lt;u&gt;一個演算法的執行時間通常會隨著輸入資料的大小 n 的成長而成長&lt;/u&gt;（註1）。而這個與資料大小 n 相關的時間（或空間）函數，則稱為這個演算法的&lt;b&gt;複雜度（complexity）&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　不過，我們還可以用更簡明、更具數學意義的方式來表達它。&lt;br /&gt;
&lt;br /&gt;
　　首先，我們可以知道當 n 是一個相當大的數字時，4n 是遠大於 3 的。換句話說，就是我們只需要保留函數的最高項，也就是這個例子中的 4n。而若是只想考慮其函數的成長趨勢，我們甚至可以連其係數一併省略，只注意 n 這個部份，代表這個演算法是一個線性時間（linear time）的演算法，記作 O(n)。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　&lt;a href=&quot;http://en.wikipedia.org/wiki/Big_O_notation&quot;&gt;&lt;b&gt;Ο（big-omicron，或是稱作 big-O）&lt;/b&gt;&lt;/a&gt;是一個&lt;b&gt;漸進符號（asymptotic notation）&lt;/b&gt;，代表了函數的&lt;b&gt;漸進上限（asymptotic upper bound）&lt;/b&gt;。其定義如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
　　對於兩個非負函數 f(n) 與 g(n)，若且唯若存在一正整數 n&lt;sub&gt;0&lt;/sub&gt; 與 c &gt; 0，使得所有整數 n ≥ n&lt;sub&gt;0&lt;/sub&gt; 都滿足 0 ≤ f(n) ≤ cg(n)，則 f(n) ∈ Ο(g(n))。
&lt;/blockquote&gt;
&lt;br /&gt;
　　簡單來說，若是我們說一個演算法的複雜度函數 f(n) ∈ Ο(g(n))，就代表函數 f(n) 的成長趨勢與 g(n) 相似或是更慢的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　除了 big-omicron 之外，我們還可以使用 &lt;b&gt;Ω（big-omega）&lt;/b&gt;、&lt;b&gt;Θ（big-theta）&lt;/b&gt;、&lt;b&gt;ο（little-omicron）&lt;/b&gt;與 &lt;b&gt;ω（little-omega）&lt;/b&gt;來表達一個演算法的複雜度。&lt;br /&gt;
&lt;br /&gt;
　　big-omega 代表了函數的&lt;b&gt;漸進下限（asymptotic lower bound）&lt;/b&gt;。簡單來說，若是我們說一個演算法的複雜度函數 f(n) ∈ Ω(g(n))，就代表 f(n) 函數圖形的成長趨勢與 g(n) 相似或是更快的。其正式的定義如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
　　對於兩個非負函數 f(n) 與 g(n)，若且唯若存在一正整數 n&lt;sub&gt;0&lt;/sub&gt; 與 c &gt; 0，使得所有整數 n ≥ n&lt;sub&gt;0&lt;/sub&gt; 都滿足 0 ≤ cg(n) ≤ f(n)，則 f(n) ∈ Ω(g(n))。
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　那麼 big-theta 呢？其實，big-theta 也就相等於 big-omicron 與 big-omega 的交集，也就是 Θ(g(n)) = Ο(g(n)) ∩ Ω(g(n))，代表 f(n) 函數圖形的成長趨勢與 g(n) 是相似的。其正式的定義如下：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
　　對於兩個非負函數 f(n) 與 g(n)，若且唯若存在一正整數 n&lt;sub&gt;0&lt;/sub&gt;, c&lt;sub&gt;1&lt;/sub&gt;與 c&lt;sub&gt;2&lt;/sub&gt; &gt; 0，使得所有整數 n ≥ n&lt;sub&gt;0&lt;/sub&gt; 都滿足 c&lt;sub&gt;1&lt;/sub&gt;g(n) ≤ f(n) ≤ c&lt;sub&gt;2&lt;/sub&gt;g(n)，則 f(n) ∈ Θ(g(n))。
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　而 little-omicron 與 little-omega 則分別為 big-omicron 與 big-omega 和 big-theta 的差集，即 ο(g(n)) = Ο(g(n)) - Θ(g(n)), ω(g(n)) = Ω(g(n)) - Θ(g(n))。以下為其正式定義：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
　　對於兩個非負函數 f(n) 與 g(n)，若且唯若存在一正整數 n&lt;sub&gt;0&lt;/sub&gt; 與 c &gt; 0，使得所有整數 n ≥ n&lt;sub&gt;0&lt;/sub&gt; 都滿足 0 ≤ f(n) &lt; cg(n)，則 f(n) ∈ ο(g(n))。
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote&gt;
　　對於兩個非負函數 f(n) 與 g(n)，若且唯若存在一正整數 n&lt;sub&gt;0&lt;/sub&gt; 與 c &gt; 0，使得所有整數 n ≥ n&lt;sub&gt;0&lt;/sub&gt; 都滿足 0 ≤ cg(n) &lt; f(n)，則 f(n) ∈ ω(g(n))。
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　　為了方便比較，我們可以將 f(n) 與 g(n) 比擬成 a 跟 b，則：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;f(n) ∈ Ο(g(n)) ≈ a ≤ b&lt;/li&gt;
&lt;li&gt;f(n) ∈ Ω(g(n)) ≈ a ≥ b&lt;/li&gt;
&lt;li&gt;f(n) ∈ Θ(g(n)) ≈ a = b&lt;/li&gt;
&lt;li&gt;f(n) ∈ ο(g(n)) ≈ a &lt; b&lt;/li&gt;
&lt;li&gt;f(n) ∈ ω(g(n)) ≈ a &gt; b&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
　　雖然存在這麼多種漸進符號以表達演算法的複雜度，但是一般來說，當我們分析一個演算法的複雜度，比較常使用 big-omicron 來表達估算後的結果。這是因為對於一個演算法，其所耗費的時間（或是記憶體）上限，通常才是我們需要關注的重點。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
註1. 對於演算法所使用的記憶體空間，通常也是如此。
&lt;/blockquote&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://program-lover.blogspot.com/feeds/4657215487644355919/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://program-lover.blogspot.com/2008/10/complexity-analysis.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4657215487644355919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4949960181628888221/posts/default/4657215487644355919'/><link rel='alternate' type='text/html' href='http://program-lover.blogspot.com/2008/10/complexity-analysis.html' title='【演算】複雜度分析 - Complexity Analysis'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/17636157464310241832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>