大忙人系列-程序猿在想什么 (一上) 禁止套娃

突然收到小破站的專欄爆肝邀請,想著好玩就寫點什么東西吧。不過強調(diào)日更而不是字數(shù),那就別怪人斷章狗了。
一. 套娃?
看到套娃,估計很多人會想到循環(huán)或者遞歸吧。雖然這些破玩意兒之后估計會寫,不過這一次和這倆玩意兒并沒有太大的關(guān)系。這一次的主題是——
計算機中的計算機
二. 從人力資源機器說起

大家好,我是狗蛋,今天來到了一家號稱提高效率、人人都有用的公司。工作的內(nèi)容很簡單,只需要按照墻上貼的指令一個一個執(zhí)行就可以了。如果一整年都能順利完成任務(wù),那么第二年就可以坐電梯上到上一層,執(zhí)行更難的任務(wù)。只是,有的時候墻上貼的指令會有錯,照做后會被旁邊這一層的小老板怒斥一頓;有的時候明明搬運的結(jié)果沒有錯,小老板卻還是很生氣,并且專門調(diào)了一匹會出錯的數(shù)據(jù)過來。
總而言之,雖然很忙碌,但是可以放空腦袋。這公司里的人各個都是人才,說話如亂碼,手指只有3根,老板還沒有嘴,也不知道他是用什么說的話??偠灾彝ο矚g這里的。只是,當(dāng)我完成了萬里挑一的人才能辦成的排序題以后,公司告訴我被解雇了,還沒有賠償金。當(dāng)我坐電梯下樓的時候,看到每一層早已由機器接管。而公司外面,也早已物是人非,開始了人機大戰(zhàn)。
三排序或許麻煩,斐波那契或許惱人,質(zhì)數(shù)或許令人發(fā)狂,但是最能詮釋本質(zhì)的,或許是拾荒者鏈條和最后一關(guān)的排序了吧。
何為鏈表?
鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的指針域。 相比于線性表順序結(jié)構(gòu),操作復(fù)雜。由于不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個節(jié)點或者訪問特定編號的節(jié)點則需要O(n)的時間,而線性表和順序表相應(yīng)的時間復(fù)雜度分別是O(logn)和O(1)。
使用鏈表結(jié)構(gòu)可以克服數(shù)組鏈表需要預(yù)先知道數(shù)據(jù)大小的缺點,鏈表結(jié)構(gòu)可以充分利用計算機內(nèi)存空間,實現(xiàn)靈活的內(nèi)存動態(tài)管理。但是鏈表失去了數(shù)組隨機讀取的優(yōu)點,同時鏈表由于增加了結(jié)點的指針域,空間開銷比較大。鏈表最明顯的好處就是,常規(guī)數(shù)組排列關(guān)聯(lián)項目的方式可能不同于這些數(shù)據(jù)項目在記憶體或磁盤上順序,數(shù)據(jù)的存取往往要在不同的排列順序中轉(zhuǎn)換。鏈表允許插入和移除表上任意位置上的節(jié)點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環(huán)鏈表。鏈表可以在多種編程語言中實現(xiàn)。像Lisp和Scheme這樣的語言的內(nèi)建數(shù)據(jù)類型中就包含了鏈表的存取和操作。程序語言或面向?qū)ο笳Z言,如C,C++和Java依靠易變工具來生成鏈表。
?——百度百科
果然是寫給看得懂的人看的。
說到鏈表,不得不提的肯定是指針,或者索引,自然而然的就需要數(shù)組(廣義)了。每次這樣提到數(shù)組,都會自然而然地聯(lián)想到圖靈完備。
玩過游戲的人自然知道,即使就那么幾個簡單的指令,但是卻已經(jīng)能實現(xiàn)游戲里所有提出的問題了。實際上,游戲內(nèi)的虛擬機已經(jīng)是圖靈完備的,也就是說你電腦上能做的任何東西上面的狗蛋都做的到(前提是你hack了游戲給了無限的內(nèi)存空間并且你等得起)。講圖靈完備的各種貼子、資料也不少這里就不扯了。
圖靈完備的東西不少,除了人力資源機器外,像什么brainf**k啊紅石啊生命游戲啊蘭頓螞蟻啊都是完備的。這些就留得以后說了。唯一看起來好像很厲害卻不完備的也有,比如某cmd,其實核心也就是在“訪存”這一點上。
那么,這些東西是如何對應(yīng)的就是另一個話題了。想起之前作死,在最后一關(guān)使用了基于鏈表的插入排序,最后內(nèi)存大小還剛好夠用,也是奇跡。要是內(nèi)存再多一點,老子還可以上**!.jpg
如果有足夠的空間,我可以在內(nèi)存里開辟一塊棧,從小到大從大到小皆可,這樣,就有局部變量可以存在里面了。
如果有棧,我可以在里面存若干個標(biāo)簽,只要實現(xiàn)一個簡單(但是如老太婆裹腳布一樣)的switch,就能任意跳轉(zhuǎn),也就實現(xiàn)了函數(shù)的功能。
如果有了函數(shù)的功能,那么面向?qū)ο筮€會遠嗎?
Jump If Negative真是一個好東西.jpg!!!
有的人嘲諷,恁們程序猿一個二個,上班時間寫代碼,下班時間還寫代碼哈。
但是這些人并不知道,用這些東西瞎整電腦是多么的爽。只是,頭有點涼。
<= To be continued