<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>專有名詞 &#8211; 科技島-掌握科技新聞、科技職場最新資訊</title>
	<atom:link href="https://www.technice.com.tw/tag/%E5%B0%88%E6%9C%89%E5%90%8D%E8%A9%9E/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.technice.com.tw</link>
	<description>專注於科技新聞、科技職場、科技知識相關資訊，包含生成式AI、人工智慧、Web 3.0、區塊鏈、科技職缺百科、生物科技、軟體發展、雲端技術等豐富內容，適合熱衷科技及從事科技專業人事第一手資訊的平台。</description>
	<lastBuildDate>Wed, 21 Sep 2022 08:29:29 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://www.technice.com.tw/wp-content/uploads/2022/12/cropped-wordpress_512x512-150x150.png</url>
	<title>專有名詞 &#8211; 科技島-掌握科技新聞、科技職場最新資訊</title>
	<link>https://www.technice.com.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">223945996</site>	<item>
		<title>那些聽起來很專業的「演算法 Algorithm」跟「Big O notation」到底是什麼？</title>
		<link>https://www.technice.com.tw/experience/19667/</link>
					<comments>https://www.technice.com.tw/experience/19667/#respond</comments>
		
		<dc:creator><![CDATA[科編推薦]]></dc:creator>
		<pubDate>Wed, 21 Sep 2022 08:29:27 +0000</pubDate>
				<category><![CDATA[產業]]></category>
		<category><![CDATA[Big O]]></category>
		<category><![CDATA[專有名詞]]></category>
		<category><![CDATA[工作甘苦談]]></category>
		<category><![CDATA[工程師]]></category>
		<category><![CDATA[演算法]]></category>
		<category><![CDATA[科技業]]></category>
		<guid isPermaLink="false">https://www.technice.com.tw/?p=19667</guid>

					<description><![CDATA[<p>Photo by Nadine Shaabana on Unsplash 文／00如是說 各行各業免不了都有一 &#8230;<content><!-- wp:image {"id":19673,"sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large"><img src="https://www.technice.com.tw/wp-content/uploads/2022/09/image-12-1-1024x535.png" alt="" class="wp-image-19673"/><figcaption>Photo by <a href="https://unsplash.com/@nadineshaabana?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Nadine Shaabana</a> on <a href="https://unsplash.com/s/photos/circle?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>文／<a href="https://medium.com/frontend-fighter/%E9%82%A3%E4%BA%9B%E8%81%BD%E8%B5%B7%E4%BE%86%E5%BE%88%E5%B0%88%E6%A5%AD%E7%9A%84-%E6%BC%94%E7%AE%97%E6%B3%95-algorithm-%E8%B7%9F-big-o-notation-%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E9%BA%BC-727cc1b0e3e1">00如是說</a></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="25c2">各行各業免不了都有一些「專有名詞」，而這些專有名詞總是讓第一次聽到的人倒退之三四五六七八九步。但真正理解之後就會發現很多專有名詞不過就是「把很長很長的解釋想一個名稱簡短化而已」，所以今天就來聊聊大家在說的「演算法」跟「Big O」到底是什麼。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p><em>對於專有名詞，除了簡短化的功能，還有增進專業度的功能。下面會示範給大家看一下?。</em></p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 id="b57c">演算法</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="4557">什麼是演算法？講白了就是「解決問題的方法」，舉個例子來看一下：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="0e51">版本 1</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="58ee">老闆：現在有很多大大小小的箱子要裝進貨車裡，請問要怎麼樣最大化地利用空間把全部東西裝進去？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="e2e7">司機：哦！那我們從大箱子開始裝，裝到滿為止，避免後面剩下一堆大箱子卻都沒有足夠的連續空間可以裝。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="13cf">老闆：是個不錯的方法！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="afd8">此時這位司機其實已經偷偷使用了演算法了。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="1890">版本 2</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="d600">老闆：現在有很多大大小小的箱子要裝進貨車裡，請問要怎麼樣最大化地利用空間把全部東西裝進去？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="9657">司機：哦！那我們可以使用『貪婪演算法』，從大箱子開始裝，裝到滿為止，避免後面剩下一堆大箱子卻都沒有足夠的連續空間可以裝。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="78ed">老闆：什麼！『貪婪演算法』！小伙子是個人才必須加薪才行！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="b0c4">嗯沒錯，兩個版本是一模一樣的東西，這也就是我說的專有名詞有「提高專業度之功效」。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="0c82">所以你說演算法有那麼可怕嗎？其實沒有對吧！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p><em>貪婪演算法：就是一種在每個步驟都採取最好或最佳狀態的選擇，像上述每次都從最大的開始選就是。</em></p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 id="1ce1">Big O</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="9759">有了上述的經驗後我們已經不害怕這些名詞了，所以我們接著了解一下所謂的「Big O」是什麼東西。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="e36c">Big O 說穿了就是拿來衡量演算法好壞的符號，但問題來了，為什麼需要使用這個符號呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="0841">說到演算法的好壞，第一個想到的應該就是「速度」了吧！而用來衡量速度的單位，通常也就是「時間」了。那這樣就很奇怪了，是什麼原因導致我們不直接用時間來衡量演算法就好，還要搞一個符號出來？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="9b4d">有兩個很重要的因素導致我們沒辦法用時間來判斷：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li>環境因素的不確定性</li>
<li>電腦的速度太快，樣本數太小分不出快慢</li>
</ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="9cca"><strong>環境因素的不確定性</strong></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="3766">以前在玩遊戲的時候常常會 Lag 一下對吧！在跑這些演算法的時候也不例外，有時可能是網路問題，也有可能是你電腦 CPU 突然卡住什麼的…種種因素造成每次執行結果都有一定的落差，差到兩倍以上的時間也都滿常見的：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"align":"center","id":19669,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image aligncenter size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/09/1-6.png" alt="" class="wp-image-19669"/></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>如果是有在刷 LeetCode 的人，就會知道每次送出正確解答的時候，它都會給你執行時間還有該算法快過多少 Percent 的人：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"align":"center","id":19670,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image aligncenter size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/09/2-4.png" alt="" class="wp-image-19670"/></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p id="8044">而因為剛剛說到的環境因素，很有可能第一次送出是「faster than 11.87%」，第二次就變成「faster than 87.87%」了。也不是說完全沒參考性，只是可能要多取一些樣本數的平均比較準確一點。如果是想滿足成就感如我，就會多按好幾次直到滿意為止，但如果按了五次還是很低就會承認自己廢，再想其他算法或是去看看別人的答案了?。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="b4f4">電腦的速度太快，樣本數太小分不出快慢</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="75c7">假設現在有一組陣列：[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="4878">必須從裡面找出 10，最直覺的方法是什麼？For loop。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="8ac7">如果從頭開始找要找幾次才會找到？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="f7c6">10 次</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="00ae">那如果想到一個超級無敵厲害的演算法，可以用最快的速度找到，是幾次？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="7f80">1 次</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2ac3">上面只是舉例，想表達的是假設現在電腦 1ms 可以處理 10 次運算，10 次 v.s 1 次，真的感受得出差別嗎？沒辦法對吧！人的反應還沒有那麼快。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="6dcd">而且上面第一種迴圈 Brute-force 解法也有可能很快啊！如果要找的數字不是 10 而是 1 呢？1 次就能找到了，沒有比這個更快的了。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="28eb">各種情況亂糟糟的一下快一下慢，那到底怎麼分辨演算法的好壞？因此「Big O」就誕生了。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="33d3">上面說到樣本數太小分不出快慢，但在實際工作案例上，有可能數據非常龐大，而數據龐大到十萬、百萬甚至千萬，演算法的好壞就會有很大的差別，尤其是你剛好碰到最差的情況，就像上面要找的數字在最後一個。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote">
<p><strong>因此 Big O 就是拿來衡量演算法「在龐大的數據中，最差情況下」的優劣。</strong></p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="3057">稍微深入了解一下 Big O</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="efb9">常見的 Big O 有以下幾種：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul>
<li>O(1)： Constant time</li>
<li>O(log N)： Iterated logarithmic time</li>
<li>O(N)： Linear time</li>
<li>O(N log N)： Linearithmic time</li>
<li>O(N²)： Quadratic time</li>
<li>O(2^n)： Exponential time</li>
<li>O(N!)： Factorial time</li>
</ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p id="4824">速度表示圖如下：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"align":"center","id":19671,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image aligncenter size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/09/3-3.png" alt="" class="wp-image-19671"/><figcaption>圖片來源：<a href="https://www.bigocheatsheet.com/" target="_blank" rel="noreferrer noopener">https://www.bigocheatsheet.com/</a></figcaption></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p id="4b84">以上面 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 為例，找每一個數字花的時間都不同，找 1 很快，找 10 很慢，但記住我們剛剛說的「最差情況」。所以我們假設最差狀況是找 10，必須要找 10 次，N 個數字找 N 次，因此我們可以說這種迴圈找法的時間複雜度為：O(N)。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="0a67">然後當你開始感興趣而去 Google 相關文章的時候可能會看到：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"align":"center","id":19672,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image aligncenter size-full"><img src="https://www.technice.com.tw/wp-content/uploads/2022/09/4-3.png" alt="" class="wp-image-19672"/><figcaption>圖片來源：<a href="https://iq.opengenus.org/time-and-space-complexity-of-quick-sort/" target="_blank" rel="noreferrer noopener">https://iq.opengenus.org/time-and-space-complexity-of-quick-sort/</a></figcaption></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p id="cda6">不是說只要「最差情況」嗎？這裡看來還有「平均」跟「最佳」耶！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2066">是的！通常我們考慮的都是最差的狀況，但有一些優秀的演算法只有在極端狀況比其他演算法慢，而極大部分狀況都很優秀，如果因此不使用不就太可惜了嗎？例如：快速排序法 Quicksort。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="e8ca">因此當一種演算法在不同情況有非常大的量級差距的時候，還是會考慮其他狀況的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="a1a1">像是剛剛說的 Quicksort，如果是針對一個已經排序好的陣列（無論升降序），而每次的 Pivot 都選擇第一個元素就會得到 Worst time complexity: O(N²)。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="6bf8">但上面的狀況是比較少見的，大部分情況都是 O(N log N)，因此這時就會參考 Average time complexity。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="60b1">Best time complexity 也是相同道理，甚至更少去參考。而大部分的演算法 「最佳」跟「平均」會是相同的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="2e00">常數項</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="cf11">看到這裡大家應該也發現了，常數呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="692c">由於常數的影響比較小，所以是會選擇忽略的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2e2e">假設我們令 N 為 100:<br />N v.s 2N = 100 v.s 200<br />N v.s N² = 100 v.s 10000</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="3719">可以看出常數帶來的影響是相對較小的，而且規範要普及化，標準化是必然的，如果把常數項帶進來就會無止盡地鑽牛角尖下去。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="560b">假設我們令 N 為 2:<br />100N v.s N² = 200 v.s 4</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="9946">變成 N² 比較小了，但 N 只要大於 100 就會是 N 更勝一籌，那如果常數項是 2、3、4…呢？又開始亂糟糟了，但我們一樣記住<strong>「在龐大的數據中，最差情況下」</strong>這個理念，O(N)絕大多數情況都比O(N²)還要好。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="bd22">因此統一都會把常數項給忽略掉。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="fe8f">同時出現兩種</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="1fbd">如果同時有多種 N 呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="c0c5">比如 Bubble sort，比的次數會是 (n - 1) + (n - 2) + (n - 3) +…+ 1 。<br />得出公式為：n(n - 1) / 2 = (n² - n) / 2<br />此時忽略常數項後還有 n² - n，一樣記住「最差情況」，因此我們這邊取比較糟糕的 n² 就好，所以 Bubble sort 的 Time complexity 為 O(N²)</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="91a6">以上就是針對演算法跟 Big O 粗略的解釋，希望可以幫助到想要踏入演算法世界的工程師，如果有任何說錯的地方再麻煩留言給我，謝謝！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="215b">參考資料</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="cda6">不是說只要「最差情況」嗎？這裡看來還有「平均」跟「最佳」耶！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2066">是的！通常我們考慮的都是最差的狀況，但有一些優秀的演算法只有在極端狀況比其他演算法慢，而極大部分狀況都很優秀，如果因此不使用不就太可惜了嗎？例如：快速排序法 Quicksort。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="e8ca">因此當一種演算法在不同情況有非常大的量級差距的時候，還是會考慮其他狀況的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="a1a1">像是剛剛說的 Quicksort，如果是針對一個已經排序好的陣列（無論升降序），而每次的 Pivot 都選擇第一個元素就會得到 Worst time complexity: O(N²)。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="6bf8">但上面的狀況是比較少見的，大部分情況都是 O(N log N)，因此這時就會參考 Average time complexity。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="60b1">Best time complexity 也是相同道理，甚至更少去參考。而大部分的演算法 「最佳」跟「平均」會是相同的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="2e00">常數項</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="cf11">看到這裡大家應該也發現了，常數呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="692c">由於常數的影響比較小，所以是會選擇忽略的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2e2e">假設我們令 N 為 100:<br />N v.s 2N = 100 v.s 200<br />N v.s N² = 100 v.s 10000</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="3719">可以看出常數帶來的影響是相對較小的，而且規範要普及化，標準化是必然的，如果把常數項帶進來就會無止盡地鑽牛角尖下去。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="560b">假設我們令 N 為 2:<br />100N v.s N² = 200 v.s 4</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="9946">變成 N² 比較小了，但 N 只要大於 100 就會是 N 更勝一籌，那如果常數項是 2、3、4…呢？又開始亂糟糟了，但我們一樣記住<strong>「在龐大的數據中，最差情況下」</strong>這個理念，O(N)絕大多數情況都比O(N²)還要好。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="bd22">因此統一都會把常數項給忽略掉。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="fe8f">同時出現兩種</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="1fbd">如果同時有多種 N 呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="c0c5">比如 Bubble sort，比的次數會是 (n - 1) + (n - 2) + (n - 3) +…+ 1 。<br />得出公式為：n(n - 1) / 2 = (n² - n) / 2<br />此時忽略常數項後還有 n² - n，一樣記住「最差情況」，因此我們這邊取比較糟糕的 n² 就好，所以 Bubble sort 的 Time complexity 為 O(N²)</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="91a6">以上就是針對演算法跟 Big O 粗略的解釋，希望可以幫助到想要踏入演算法世界的工程師，如果有任何說錯的地方再麻煩留言給我，謝謝！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="215b">參考資料</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="cda6">不是說只要「最差情況」嗎？這裡看來還有「平均」跟「最佳」耶！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2066">是的！通常我們考慮的都是最差的狀況，但有一些優秀的演算法只有在極端狀況比其他演算法慢，而極大部分狀況都很優秀，如果因此不使用不就太可惜了嗎？例如：快速排序法 Quicksort。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="e8ca">因此當一種演算法在不同情況有非常大的量級差距的時候，還是會考慮其他狀況的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="a1a1">像是剛剛說的 Quicksort，如果是針對一個已經排序好的陣列（無論升降序），而每次的 Pivot 都選擇第一個元素就會得到 Worst time complexity: O(N²)。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="6bf8">但上面的狀況是比較少見的，大部分情況都是 O(N log N)，因此這時就會參考 Average time complexity。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="60b1">Best time complexity 也是相同道理，甚至更少去參考。而大部分的演算法 「最佳」跟「平均」會是相同的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="2e00">常數項</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="cf11">看到這裡大家應該也發現了，常數呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="692c">由於常數的影響比較小，所以是會選擇忽略的。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="2e2e">假設我們令 N 為 100:<br />N v.s 2N = 100 v.s 200<br />N v.s N² = 100 v.s 10000</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="3719">可以看出常數帶來的影響是相對較小的，而且規範要普及化，標準化是必然的，如果把常數項帶進來就會無止盡地鑽牛角尖下去。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="560b">假設我們令 N 為 2:<br />100N v.s N² = 200 v.s 4</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="9946">變成 N² 比較小了，但 N 只要大於 100 就會是 N 更勝一籌，那如果常數項是 2、3、4…呢？又開始亂糟糟了，但我們一樣記住<strong>「在龐大的數據中，最差情況下」</strong>這個理念，O(N)絕大多數情況都比O(N²)還要好。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="bd22">因此統一都會把常數項給忽略掉。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 id="fe8f">同時出現兩種</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p id="1fbd">如果同時有多種 N 呢？</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p id="c0c5">比如 Bubble sort，比的次數會是 (n - 1) + (n - 2) + (n - 3) +…+ 1 。<br />得出公式為：n(n - 1) / 2 = (n² - n) / 2<br />此時忽略常數項後還有 n² - n，一樣記住「最差情況」，因此我們這邊取比較糟糕的 n² 就好，所以 Bubble sort 的 Time complexity 為 O(N²)</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p id="91a6">以上就是針對演算法跟 Big O 粗略的解釋，希望可以幫助到想要踏入演算法世界的工程師，如果有任何說錯的地方再麻煩留言給我，謝謝！</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 id="215b">參考資料</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul>
<li><a href="https://iq.opengenus.org/time-and-space-complexity-of-quick-sort/">Time and Space complexity of Quick Sort</a></li>
</ul>
<p><!-- /wp:list --></p>
<p><!-- wp:pullquote --></p>
<figure class="wp-block-pullquote">
<blockquote>
<p>本文由 <a href="https://00-talk.medium.com/">00如是說</a> 授權轉載，原文<a href="https://medium.com/frontend-fighter/%E9%82%A3%E4%BA%9B%E8%81%BD%E8%B5%B7%E4%BE%86%E5%BE%88%E5%B0%88%E6%A5%AD%E7%9A%84-%E6%BC%94%E7%AE%97%E6%B3%95-algorithm-%E8%B7%9F-big-o-notation-%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E9%BA%BC-727cc1b0e3e1">連結</a></p>
</blockquote>
</figure>
<p><!-- /wp:pullquote --></content></p>
<p>這篇文章 <a rel="nofollow" href="https://www.technice.com.tw/experience/19667/">那些聽起來很專業的「演算法 Algorithm」跟「Big O notation」到底是什麼？</a> 最早出現於 <a rel="nofollow" href="https://www.technice.com.tw">科技島-掌握科技新聞、科技職場最新資訊</a>。</p>
]]></description>
		
					<wfw:commentRss>https://www.technice.com.tw/experience/19667/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">19667</post-id>	</item>
	</channel>
</rss>
