有趣的演算法世界---什麼是演算法 (轉)
什麼是演算法?
如果您想進入這個世界的話,您就不應該不知道,這個美麗的世界,她究竟是什麼?
什麼是演算法?是呀,這是個問題。它的意義,可比於那個“To be,or not to be”,如果我們也如哈姆雷特般的徘徊起來:)……
我們不妨先回顧上次的一個問題,SAT問題。
當然,考慮問題總應從最簡單處入手啦。看下面簡單的例子,10個邏輯變數的:
C0 : -x0 V -x3 V x5
C1 : -x1 V -x6 V x7
C2 : -x5 V x8 V x9
這個子句集合可以都為真嗎?呵呵,要解決它,我們是有辦法的,要不就這樣,10個邏輯變數,我們給出一組賦值:
TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE
去測試C0、C1和C2,如果子句都是取值為真,則這組賦值滿足要求,返回它,結束。否則,我們試下一組:
TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE
……
如果搜尋所有的賦值後,沒有使這個集合的所有子句都為真的賦值,則輸出此集合不可滿足。
這是我們的一個思路。當然,我們可以寫出一個“描述精確步驟的字元文字”,它表示了我們一步一步解決問題的辦法。我們加以歸納,這就是演算法的定義,即一步一步求解問題的方法,它有如下的特徵:
(1)必為一有限文字的表示;
(2)每一步必有可能在有限的時間內機械的完成。
這個描述,固然很好理解,但作為基本的概念,演算法可有形式化的定義?我們知道,如果是有窮自動機,它的演算法是有形式化定義的,而一般意義的演算法,我還未見到。自己也想應如何定義,卻不知所終。
但對於演算法之內涵,還是有可討論的地方。我先來問您:
演算法可否可以無窮?
“哈哈,我寫了一個‘演算法’,執行到世界末日也不會結束……”,這是個演算法嗎?是嗎?不是嗎?呵呵,您是如何想的,不妨說說看。我的看法,當然是;演算法當然可以無窮執行。(這裡我們講演化計算的康老師有個例子:你寫個鐘錶的演算法,它永不停息的走下去……不也是個演算法嗎?)
那麼,我來問第二個問題:
是什麼使某些問題很難解決,而又使另一些問題很容易解決?
舉例來說,上次的例子,求自然數前n項和,比如n=1000,這個問題計算機可在一瞬間計算出來,而1000個變數的SAT問題,計算機只怕有些難以計算了。為什麼?是什麼因素起了決定作用,使的我們的演算法如此的不同?我們可充分的理解了它的實質嗎?毫無疑問目前還沒有,幾十年來的研究成果就是,我們有了一個標準,把問題劃分為幾類,我們知道什麼是難題。僅知道它是難題。
問題遠不止這些。但我們不會畏懼未知!
事實上,就是因為這些困難的存在,就是因為有無限的荒原,有戈壁,有沙灘,我們的這個世界才有了她獨特的魅力……我相信無數的人希望在這裡開拓出一片綠色的原野,希望在這裡勞作,冒險,品嚐爭取、擁有或失敗的歡樂!
呵呵,您準備好了嗎?是否有充分的信心,隨我進入這個世界?如果是的話,我再給您說說我眼中的這個世界,她的獨特,優美,搖曳多姿……
這個世界,與她的兄弟姐妹有著千絲萬縷的關係。
首先,演算法的世界,因數學模型的不同會有大不同。
我們來看這個例子,不要說它簡單哦:):
e.g.1 求方程的根: ax+b=0 (a!=0)
問問自己,您會如何解決?使用計算機,我想您肯定會這樣想:
存在x1,使得 a*x1+b<0, 存在x2,使得 a*x2+b>0,那麼,在區間[x1,x2]內使用折半法迭代搜尋!
如果您這樣解決,我一點都不奇怪。事實上,我的第一反應,也是這樣的解法。這個演算法的數學背景是,誤差控制內的數值方法。
當然,非常優秀的演算法。也適合本題。
但是,如果您把它留給任何一個學過簡易方程的小學生的話,我想他(她)的解法毫無疑問是這樣的:
ax+b=0
ax=-b
x=-b/a (a!=0)
呵呵,怎麼樣?您或許會說,“哦……是呀,如果手算(換句話,人算:),我當然也這樣解決。可是,用計算機呀……”。
用計算機就不可以了嗎?
您注意到,人解決問題的方式是邏輯思維,不是按步長搜尋或迭代的。如果我們一開始考慮的數學模型是另外一個樣子的話,我們的演算法將是完全不一樣的:
定義:
個體域: 實數集R
函詞: add(a,b): a+b
mul(a,b): a*b
謂詞: Equal(a,b): a==b
規則: Any x,y in R, Equal(add(x,y),0)->Equal(x,add(0,-y))
Any x,y,z in R, Equal(mul(x,y),z) and ┐(Equal(y,0))->Equal(x,mul(z,1/y))
規則集中給出的是最重要的兩個,其他的就沒有加進來;但已經可以討論問題了。我們依據這個邏輯,使用類似與機器證明的演算法,完全可以推出方程的解。
您認為怎麼樣?或許,對於方程您還不在意數學模型的問題,但是,做一個大型的專家系統,您必須來細緻的考慮這個問題了。
後注:這個問題我的本意不是讓您定義一個f,引數為a,b,返回 -b/a :)。呵呵,或許例子過於簡單了。可我需要您著重體現出“計算”的過程。
其次,演算法的世界因計算機體系結構的不同而大不同。
我們仍然考慮上次的一個簡單的問題,求和:)。現在為:
e.g.2 有n個資料,求和
您如何來解決?呵呵,是不是我問的很傻?或者,您怪我把您看的太傻?哈哈,沒有沒有,如果您問多數的員(包括在校學生的準程式設計師),多半人會說:
一個迴圈: sum=0;
For i=0 To n-1 Do
sum+=a[i];
其中a[]存放資料。如果他又是個細心的人,他會考慮sum會不會資料,這樣他或許會考慮一個資料結構來存放結果。
沒有問題的演算法,一定程度上滿足了題目的要求。但是,您的演算法是基於單處理機的!這個工作,如果您的公司裡有一個機群,您或許不應該使用這個演算法了,您需要一個並行演算法。那麼,您需要把問題分割,並考慮通訊的開銷。演算法就會完全改變了!
最後,一個淺顯的特點,演算法的世界因問題的規模不同而大不同。
一開始就分析的SAT問題是個很好的例子。10個邏輯變數我們或許可以窮舉,但窮舉絕對不是本問題的可採取的演算法!否則它的時間開銷將是按指數級增長的!
兼於我做了個這個問題的專案,演化計算來解決的,我後面還將更全面的分析這個問題。包括爬山法,A演算法,A*演算法,當然還有最後的解決方案,演化計算。
總而言之,演算法世界可謂多姿又多采。因為我對於她的熱愛,所以我自願來做嚮導,雖然這個嚮導不好,但仍然盼望您不要因此拒絕風景的美麗哦!
下次將討論數學,演算法的淵源。
本帖的題目:
國王的城堡(percy lee提出:):
有個國王,他的領土內有n個城堡。國王疑心很重,他認為敵人有可能偷襲並佔領任何一個城堡。因此他給他的將軍和財政大臣發了一道旨意,命令他們共同完成一項工程,在這n個城堡間修建大道,以保證任何k個城堡被敵軍佔領後,我方的城堡仍然可以透過大道相互支援。將軍毫無疑問要不惜一切代價完成使命,而財政大臣的任務就是使所有的花費盡可能低。這項工程應該如何完成?(假設花費只和道路的長度有關)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-956686/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 有趣的演算法世界---附錄(2) (轉)演算法
- 什麼是演算法演算法
- 什麼是 LRU 演算法?演算法
- 什麼是 LFU 演算法?演算法
- 有趣的演算法演算法
- 什麼是遞迴演算法遞迴演算法
- 什麼是演算法?一切皆演算法演算法
- 漫畫演算法:輾轉相除法是什麼鬼?演算法
- 什麼是演算法?如何學習演算法?演算法入門演算法
- 漫畫:什麼是LRU演算法?演算法
- 什麼是 JavaScript 世界的 UMDJavaScript
- 漫畫演算法:什麼是 B 樹?演算法
- 【轉】什麼是一致性hash演算法?(詳解)演算法
- 解讀:什麼是Java的遞迴演算法?Java遞迴演算法
- 【簡單演算法】什麼是複雜度?演算法複雜度
- TF-IDF演算法是什麼呢?演算法
- 漫畫演算法:什麼是跳躍表?演算法
- 常規加密演算法是什麼?原理是怎麼樣?有哪些?加密演算法
- 轉:統治世界的十大演算法演算法
- 什麼是一致性Hash演算法?演算法
- 七分鐘理解什麼是 KMP 演算法KMP演算法
- 什麼是安全雜湊演算法SHA256?演算法
- 全世界最強的演算法平臺codeforces究竟有什麼魅力?演算法
- 加密演算法是什麼?有哪幾種型別?有什麼用?加密演算法型別
- 位元組跳動的演算法面試題是什麼難度?演算法面試題
- RSA演算法中,為什麼需要的是兩個素數?演算法
- 從巨集觀角度講述什麼是加密演算法加密演算法
- 什麼是Python演算法?分為哪幾類?Python演算法
- 什麼BRIEF演算法?BRIEF演算法詳解演算法
- 演算法科普:有趣的霍夫曼編碼演算法
- 各種機器學習演算法的應用場景分別是什麼?機器學習演算法
- 演算法是個“坑”為什麼反感網際網路企業演算法誘導?演算法
- 與ChatGPT的有趣對話|Adobe是什麼軟體?ChatGPT
- 5個有趣的演算法、邏輯面試題演算法面試題
- 問答丨演算法工程師具體是做什麼的? 需要什麼樣的條件?演算法工程師
- 什麼是加密世界中的Token經濟學?加密
- 什麼是JAVA ? (轉)Java
- Java是什麼 (轉)Java