剛開始接觸編程課的時候,老師就會詳細介紹各種查找、排序,到遞歸、貪心等算法。但是在人腦面前,就計算機的算法總是很“笨拙”,為何計算機的算法不能更直觀一些呢?那是因為計算機的算法就是反人性的,從本質上來說,這是計算機的思維方式和人腦思維方式的區别而造成的。
人腦思維的機制至今沒有一個确定的理論,暫時認為是化學物質和電信号的作用。雖然沒有科學的解釋,但是我們每個人都有一顆大腦,我們每個人都可以感受到自己的思維方式。而計算機則是人類創造的,從設計之初它便不是以模拟人腦為目的,因此它有其獨特的工作方式,隻有理解了計算機的工作方式,才可以學會以它的方式去思考, 才可以寫出最适合計算機運行的程序代碼。
1、在排序數組中尋找特定數字
我們通過一個具體的例子,來說明人腦和計算機的思維方式不同,假設我們想要從一個已經排好序的數組中找出一個特定的數字。已知排序好的數組是1 2 3 5 7 13 34 67 90 127 308,我們希望找到是否13這個數在數組内。
人腦:人腦處理這樣的問題幾乎是“作弊”的,我們可以一目十行,我們在眼鏡一掃視的情況下就發現了13,所以如果我問自己我是如何找到13的,我隻能說我“看見”了。
計算機:計算機需要從數組的第一個元素開始,一個一個的去查當前的數組的元素,和13相比,看看是不是相等。為了找出13這個數,計算機要做6次循環操作,而人幾乎是瞬間就看到了答案。
2、在排序數組中尋找特定數字plus
計算機在上一輪和人腦的PK中敗下陣來,然而這并不是很公平,因為數組的數量隻有短短的幾個,而計算機可以存儲的上限遠不止于如此。于是我們開始第二次的比拼。這次我們将輸入擴大1 2 3 5 7 13 34 67 90 127 308 502 ... 2341245 ... (100萬個查找的數變成了2341245。
對于一個普通人,我們假設這100萬個數字是打印在一本字典裡的,那麼他如何找出100萬個有序數組中的某個數字呢?這時人類引以自豪的“一目十行”的能力已經微乎其微,當數字的位數增大時,我們隻能老老實實的去從頭到尾比較數字,一頁一頁的翻開,去看當前的頁中有沒有數字,沒有的話就去翻下一頁。
這個思路是不是很熟悉?沒錯,這就是計算機的思維,和我們上一節中所描述的計算機編碼幾乎是一樣的,除了人可以一眼多看幾個數據外。然而,人類在比較大數是否相等的速度,以及翻字典的速度可遠遠比不上計算機去讀完這100萬個數的速度,同樣是“笨鳥”,計算機每秒百萬次的運算能力幾乎可以在瞬間就完成這樣的任務。也就是說,在大規模輸入的情況下,人腦的思維方式“退化”成和計算機近似,但是被計算機壓倒性的性能優勢給擊敗。
3、在排序數組中尋找特定數字final
在第二輪中,人腦敗給了計算機,但這樣的比拼無疑于兩隻笨鳥比誰更快。有沒有聰明一些的方法呢?沒錯,我們學過二分查找(Binary Search)的算法可以派上用場了。
步驟一:有這麼有一本打印了100萬個數字的字典擺在我們的面前,我們不知道要找的數字會在哪裡,那麼我們先折半打開字典(不用那麼精确也沒關系),看當前頁的第一個數字和最後一個數字,我們要找的數字是否在這個範圍内,如果在那麼我們可以繼續在當前頁找這個數字。
步驟二:如果當前頁的第一個數字還是比我們要找的數字大,那麼我們可以将字典的後半部分撕了(因為我們要找的數字不可能在後半部分了),繼續上面的步驟。
步驟三:如果當前頁的最後一個數字比我們要找的數字小,那麼我們可以将字典的前半部分撕了(理由同上),繼續步驟一。
這樣我們會講這本字典越撕越薄,最壞的情況下我們會撕到最後一頁,這一頁要麼有這個數字,要麼沒有這個數字,但是我們保證按照上面的步驟進行我們不會錯過任何可能含有這個數字一頁。
這個邏輯和計算機算法中的二分查找原理是一樣的,我們來看看實際的算法代碼是如何實現的:我們可以看出,和人類的思維方式比,計算機不會翻“一頁”,它隻會翻看一個數字,但是其他的思維方式是一模一樣的。利用這樣的算法,人類雖然從結果上還是比計算機要慢,但是雙方都找到了最适合的方法,達到自我效率的最大提升。
通過以上的例子,我們可以看到,計算機的算法反人性,是因為計算機不是一個“正常人”,它有自己的缺陷,也有自己的長處。很多時候我們覺的算法不直觀,不是因為我們的思維能力比計算機差,而恰恰是因為作為人類我們同時接觸的信息太多,所會的東西也太多而阻塞了我們的思維。那麼這種時候,不妨将自己“堕落”成一台“鼠目寸光”和“所知甚少”的計算機,這時可能會有更清晰的思路。
那麼為何計算機解決問題的方式這麼“笨拙”呢?
1.CPU的工作方式
CPU作為計算機的最核心的部件,也是算法的主要運載體。CPU并不會像人一樣思考,它隻懂得一些基本的指令。每一個CPU都有其指令集,指令集是存儲在CPU内部,對CPU運算進行指導和優化的硬程序。通俗一點說,指令集就是CPU的所有思維方式。而人腦相對于CPU,有強大的記憶和聯想能力,比如你看到1 1,就想到2,看到紅燈,就會想到停下來,看到門,就知道去開門把手,這些都是你不假思索可以立刻反映出來的東西。計算機卻不行,他隻能進行自己被設定好的指令。
所以,CPU會的東西(指令)比人少多了,那CPU豈不是很笨?沒錯,CPU就是很笨,但是CPU的優點也是人腦所無法比拟的。雖然CPU隻會幹簡單的事情(幾百種指令),但是它可以在固定的時間(指令執行時間)内保證正确的運算出正确的結果。而人腦不可能保證在固定的時間内一定産生“同樣”的思維結果。
2.計算機存儲
計算機的常見存儲有寄存器、高速緩存、内存、硬盤等。寄存器就相當于人腦中立刻可以想起來的東西,CPU所做的一切運算都是針對于在寄存器中的數據進行的。寄存器存儲了計算機當前要做什麼計算(指令寄存器),要計算的數據(數據寄存器),計算到哪一步了(段寄存器)等信息。無論是最早的有寄存器的CPU還是最新最強的的CPU,它們的寄存器數量最多也隻有幾十個(特殊情況有幾百個),也就是說CPU同一時刻能夠立刻使用過的信息也就是這幾十個數字。
内存則是計算機的主力存儲設施,它可以存儲運行中的程序的信息,内存相當于圖書館的書架,CPU需要用某一段内存中的數據是,需要通過LOAD指令,同時附上一個書架編号(内存地址),然後内存控制器可以将對應的地址的數據通過總線傳輸給CPU,CPU則将載入的結果放入寄存器中使用。内存存取的速度遠小于寄存器,但是訪問分布在内存各個區間的數據的速度基本是相等的。
由于大部分時候CPU需要讀取連續的一段内存來進行運算,因此通常CPU會有高速緩存将最近使用過的内存整塊緩存起來,而使得CPU不必每執行一步就需要去讀一次内存。高速緩存的速度介于寄存器和内存之間,但遠高于内存。高速緩存的大小一般在幾兆到十幾兆之間。
硬盤屬于外部存儲,老式的機械硬盤中會有一個可轉的磁頭,在讀取磁盤文件的時候需要将磁頭轉到對應的位置,磁盤的速度遠低于内存,并且如果磁盤的磁頭如果停留在某個位置時,随機磁盤上不同位置的信息,會受到磁頭運動的物理速度限制而出現速度不均等的情況。新式的固态硬盤采用了和内存相似的存儲介質,在随機訪問的性能上提升很大。
綜上所述,計算機有一顆隻能記得一點點事情的小腦袋(寄存器),但是能夠擁有相對較大的快速記憶(緩存),擁有遠超過人類的知識儲備(内存),并且還随身攜帶了巨大的移動圖書館(硬盤),所以從存儲上來看,計算機像是一個有先天缺陷的人,也就是說計算機本身很“笨拙”但它很“勤奮”。
比計算機都“聰明”得多的你沒有理由會“差”,太原錦華辦學十六年,不忘初心,始終如一,誠信辦學、誠信教學、真正肩負起為民族存續菁華、奉獻人才之重任,将不負衆望,承擔責任,以誠信辦學回報社會!開設十五大王牌專業,獨創3C教學法(案例教學,互動教學,模拟教學),學員遍布國内十七個省市,培養數萬名優秀IT人才,連續十五年連獲優秀學校,幫助數千名貧困學子成才成功!十六年專注IT教育,配置高端設備,建立實訓基地,王牌專業不斷叠代更新,積累了豐富的辦學經驗,形成了鮮明的辦學特色,成為最受歡迎的IT教育!選擇錦華,助你走向成功,實現人生價值!!!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!