算法執行時間。
算法效率是通過在計算機上運行基于該算法的程序所花費的時間來衡量的。
算法效率是一個組合概念,算法+效率。 算法是解決問題的一系列明確的指令,對于一定的標準化輸入,能夠在有限的時間內獲得所需的輸出。
算法是一個重要的概念。 我們今天使用的任何軟件背后都有一系列算法。 智能時代,算法是我們需要了解的基本概念,后面會詳細闡述。
就今天的入門來說,重點不是介紹算法,而是給出算法中排序算法的一個例子,讓讀者對算法有一個感性的認識。 同時,更重要的是在工作效率的基礎上豐富對效率的認識。
2、衡量算法效率應該有詳細的標準。
效率比較的前提是確定公平的比較標準和測試方法。
如上所述,算法執行時間是用來衡量算法效率的。 這是正確的方向,但是用多少數據來測試算法速度是一個問題。
原因是,當使用不同數據量進行測試時,兩種算法的相對性能可能完全不同。
例如,使用10000條數據進行測試,算法A的運行時間為2毫秒,算法B需要運行10毫秒。 使用100萬條數據測試,算法A運行8000毫秒,算法B運行4000毫秒。
當數據量較小時,算法A耗時較少,效果較好; 當數據量較大時,算法B耗時較少,效果較好。
為此,計算機科學家、算法分析之父高德納(Knuth)開發了一種普遍認可的算法效率評估方法。 高德納的思想主要包括3個部分:
首先,在比較算法的速度時,需要考慮數據量特別大,幾乎無窮大的情況。 原因是計算機的發明主要是為了處理大量數據。
其次是比較算法的速度。 只要評估隨數量變化的因素,
白色的。
決定算法速度的因素有很多,但可以分為兩類:第一類是不隨數據量變化的因素,第二類是隨數據量變化的因素。 當數據量趨于無窮大時,第一類因素的影響很小,可以忽略不計; 因此,只需評估第二類因素。
第三,如果兩種算法的執行時間處于同一數量級,則認為算法效率同樣好。 換句話說,計算機科學家關注的是至少10倍的差異,而不關心幾倍的差異。
以上體現了科學研究的方法,就像做思想實驗一樣,忽略和避免次要因素的干擾,聚焦主要因素,從而實現理論突破。 在實際工程層面,通常考慮次要因素,甚至1%的效率差異也可能需要重點關注。
Q2:如何理解算法效率? A:1.了解傳統排序算法的效率。
排序是我們在工作和生活中經常遇到的事情。 例如,在學校,學生按成績排序; 例如,在一家公司中,產品按銷量排序。
排序之后,就可以進行一些有針對性的處理。 例如,針對不同年級的學生安排不同的輔導策略; 針對不同的銷售產品采取不同的促銷策略。
在這個過程中,排序是前提工作,否則后續的安排就無從下手。
要手動對分數進行排序,我們很容易想到兩種方法:
方法一:從成績單中篩選,第一次挑選分數最高的學生,第二次挑選分數第二高的學生,直至篩選完畢,對學生進行排序。
方法二:首先將成績單上第一個學生的姓名和年級寫在他旁邊一張白紙的中央。 如果第二個同學的成績比他高,就寫在第一個同學的上面。 如果比他低,就寫在第一個學生的上方。 寫在下面。
看到第三個學生的成績后,根據他的成績與前兩個學生的成績的比較,將其插入到相應的位置。例如,如果他的成績在兩個同學之間正好,則在他旁邊的排序試卷上,在前兩個人之間插入他的名字。
之間。
通過將這兩種手動方法遷移到計算機上,您可以編寫算法并讓計算機自動執行它們。
第一種方法在計算機算法中稱為冒泡排序。
原因是每次都會選擇剩下的最高的,就像水里冒出的氣泡一樣。
第二種方法稱為插入排序。 原因是你每次都必須找到正確的位置插入它。
2.了解快速排序算法的效率。
通過分析冒泡排序和插入排序過程,我們可以知道它們為什么慢。
例如,冒泡排序很慢,因為每次選擇最大的數字時,都必須將其與所有其他數字進行比較。 如果能做減法,減少相互比較的次數,就能提高排序速度。
基于這個思想,就產生了歸并排序算法,其過程大致如下:
以年級排名為例,如果將所有學生分成兩組,然后分別進行冒泡排序,那么通過在每組中挑選最大的一組,可以節省一半的相互比較的時間。
將兩組分別排序后,然后將它們合并在一起形成有序序列。 這就是合并排序算法名稱的由來。
由于合并不需要太多時間,這樣可以節省大約1/2的時間。 但如上所述,在科學理論層面效率可以說快嗎,僅僅節省一半的時間是不夠的。
為了進一步提高算法的效率,可以將兩個獨立的組分成兩組,總共4組。 重復以上過程,這樣可以節省3/4的時間。
如此下去,可以將4組分成8組,可以節省7/8的時間; 8組可分為16組,可以節省越來越多的時間。 分組結束時,每組只剩下兩人時,無需排序,只需比較一次大小即可。
以排序為例。 如果一個程序員只知道傳統的冒泡和插入排序算法,而不掌握合并排序算法,那么最終寫出的程序的運行時間可能會相差一百萬倍。
這是一個非常顯著的差異。 讀者不難理解,一流程序員和普通程序員的成就相比,可能存在天壤之別。 那么,如果一流程序員的工資是普通程序員的100倍,就不難理解了。
從另一個角度來看,當今世界各行各業都在經歷互聯網+,這意味著越來越多的工作環節正在軟件化。 一個懂得如何提高軟件執行質量和算法效率的人會比不懂的人有價值得多。 這也是該行業工資高的原因之一。
算法的效率與一個人的數學能力有很大關系。 這也是數學好的人如何賺更多錢的例子。
當然,并不是每個人都需要掌握編程,但是擁有一定水平的數學思維是必要的,并且可以在很多領域發揮作用。
回到今天入門的主題效率可以說快嗎,像合并排序算法這樣的快速排序算法并不只有一種。 例如,現在常用的排序算法是由英國計算機科學家托尼開發的。 Hall提出的快速排序算法。 其原理是:
首先,對于大量無序數,從其中隨機選擇一個,比如50。這個隨機選擇的數稱為主元值。
接下來,將所有待排序的數字分為兩部分,第一部分大于或等于主元值50,第二部分小于主元值50。
第二步是找到上述兩組數字的樞軸值。 例如大于50的組可以選擇70; 小于50的組可以選擇30。接下來,可以根據新的主元值將每組數字分為兩組,總共4組。
第三步,參照上面的方法,4組變成8組,8組變成16組,直到最后排列完畢。
一般情況下,快速排序算法的時間復雜度也是o(N*log(N)),但比前面提到的歸并排序算法要快。
2次,因此實際中更常用。