演算法是什麼?第一次接觸到這個概念是10年前上大一的時候,《資料結構》這門課程首先遇到的。書上說,演算法是乙個用來解決乙個良定義計算問題的工具。那麼經歷了這麼多年程式設計師的生活,回頭再想一想,演算法到底是什麼呢?
首先,演算法是用來解決問題的,所以,我們要仔細思考一下什麼是問題?個人的一點遇見認為,問題來自各個領域。農民有種地的問題,工人有領工資的問題,那麼計算機演算法研究的問題,主要是計算機領域要碰到的問題。所以,這個問題就離不開「馮.諾依曼」體系。這個體系將計算系統分定義成了計算-控制-儲存-輸入/輸出,那麼演算法要解決的問題,就是整個體系中輸入和輸出之間的關係。
這個說法太抽象,就像我們物件導向技術中類的概念,如果不將他例項化,那麼這個抽象的概念就會一無是處,所以我們還是舉乙個例子來說明吧。若干年前,我曾經碰到乙個專案,領導要求我實現該專案《需求說明書》中的排序演算法,即將登記公司發布的各家上市公司資產負債表中若干個表項進行排序並列印在介面上。那麼這就是問題了,因為需求說明書中定義了乙個輸入和輸出之間的關係,輸入若干上市公司的若干資產負債表,輸入表項。這個關係就是按指定金額排好序。
這就是乙個問題,乙個需要用演算法來解決的問題。至於演算法到底是什麼,走到這一步,就很好解釋了,演算法就是給出乙個可以獲得該輸入輸出關係的計算過程。對於前面的那個例子來說,就是我給出乙個解決方案來對這個金額進行排序。
綜上所述,我們研究乙個演算法最重要的是什麼?不是演算法本身,而是問題!是需求!所以,在研究乙個演算法的時候,你連問題都沒搞清楚,就匆忙下結論,甚至寫**,後果可想而知。特別是在做專案的時候,對乙個問題產生的誤解,從而在**中就會把這個問題給放大。整個軟體產品上線後,也許這個演算法會導致災難性的後果。所以我們研究演算法,首先得研究問題,把乙個問題弄清楚、弄透!
描述問題的方法很多,也需要大家在實際生活中不斷總結,這裡介紹乙個最基本、最實用的方法 —— 建模
計算機世界跟現實世界差別很大,所以,分析乙個待計算機處理的問題,必須要使用乙個模型將計算機與現實世界聯絡起來。在設計大型軟體的架構架構時,我們知道,現在有種非常通用的建模語言——uml,通過各種用例圖、靜態圖、時序圖、部署圖等,將乙個非常複雜的問題分解成各個模組,然後使用乙個成熟的框架或者設計模式來實現這些模組。
同樣,解決乙個演算法對應的小問題時,也需要建模。描述乙個演算法問題時,不管這個問題有多複雜,總是能夠通過數學模型來描述他的。所以請大家養成習慣,見到乙個問題,別立即去寫**,而是用資料結構圖和流程圖把這個問題模擬一遍,也就是建立靜態模型和動態模型來弄透這個問題的本質。如果整個流程你都走不通,你放心,寫出的**也會跑不通的。至於如何建模,這也是我們以後討論的重點。
演算法的相關概念
1 演算法 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作 2 演算法具有五個基本特性 1.輸入 演算法具有零個或多個輸入 2.輸出 至少有乙個或多個輸出 3.有窮性 指演算法在執行有限的步驟之後,自動結束而不會出現無線迴圈,並且每乙個步驟在可接受...
PR GOOGLE演算法概念
pr值,即pagerank,網頁的級別技術。取自google的創始人larry page,它是google排名運算法則 排名公式 的一部分,用來標識網頁的等級 重要性。級別從1到10級,10級為滿分。pr值越高說明該網頁越受歡迎 越重要 例如 乙個pr值為1的 表明這個 不太具有流行度,而pr值為7...
演算法概念 P NP NPC
這類問題是最簡單的一類問題,即所有這類問題都可以用乙個確定性演算法在多項式時間內求出解。此類問題的複雜度是此類問題的乙個例項的規模n的多項式函式。比如排序問題,求最短路徑問題等。簡單來說,p就是能在多項式時間內解決的問題 有些問題很難找到多項式時間的解法 也許根本就不存在 但是如果給出了該問題的乙個...