索引化記憶(概述)

2021-04-13 06:37:11 字數 2320 閱讀 3243

索引這種東西,作為一種儲存、檢索資訊的輔助手段,在人類社會恐怕已有不下千年的歷史。索引的最簡單的一種實現莫過於書籍,一般來說,一本書(特別是技術性的)的構成主要有三部分:目錄、主體(包含附錄)、索引。索引的作用是讓你在最短的時間內找到你最關心的主體內容。對於書籍來說,索引的主要構成元素是關鍵字和頁碼,其排列方式又主要有音序、筆順序、相關性序等。目錄其實也是一種索引的特殊形式,只不過它的排列方式是「頁碼式」,說地廣義一點,是「位址式」。

在電腦科學領域,索引技術可謂無所不在,甚至可以說一句妄語:沒有索引技術,就沒有電腦科學。最簡單的兩個例子:磁碟檔案系統和資料庫管理系統。對於磁碟檔案系統,我們可以簡單地理解為檔案的全路徑就是索引的「關鍵字」,檔案在屋裡磁碟上的首位址就是索引的「頁碼」,所以作業系統核心就可以通過檔案的全路徑快速地定位到檔案所在的位置,而不需要遍歷整個磁碟上的所有檔案。如果說作為乙個一般的軟體開發人員我們一般不會去關注磁碟檔案系統的索引機制,那麼資料庫管理系統的索引則是我們每天都要接觸到的。我們可能都遇到過在一張100萬數量級的大表裡面檢索資料這樣的場景,如果該錶沒有建立合適的索引,恐怕乙個小時都未能成功,但是如果建立了合適的索引的話,耗時可能會縮短到0.1秒,索引的重要性,可見一斑。

而本文提出的「索引化記憶」所關心的事情是:把索引技術運用到人類的記憶活動上。多年的軟體開發實踐活動促成我去思考這個問題。很多和我差不多的程式設計師都抱怨過,這是乙個折磨人的行業,我們要掌握特別是要記住太多太多的東西,種種原理、種種api、種種錯誤現象及描述等。但是後來有三種東西讓我擺脫了這種痛苦,msdn、搜尋引擎,以及咱們正在**的「索引化記憶」。

msdn是乙個例子,指的是msdn本身以及和它類似的各種開發者文件,大家都知道msdn幾乎涵蓋了ms系列技術開發的一切所需的資訊,其包含的資訊量在使用chm技術壓縮之後尚有2gbyte之巨(以msdn2003為例),如果要讓乙個開發人員把整套msdn背下來,那麼顯然是不可能的,而且沒有任何意義,所以我們就要考慮怎樣去利用這樣的乙個資訊寶庫。

搜尋引擎是另乙個絕佳的資訊寶藏,全球主流的搜尋引擎所涵蓋的資訊量已經是天文數字,可以說搜尋引擎是人類智慧型的庫管員。搜尋引擎能幫助我們輕而易舉地找到許多我們關心的資訊而不需要付出敲敲鍵盤之外的任何代價。

不討論msdn和搜尋引擎之所以能讓我們快速找到我們想要的資訊索引技術就作主了主要的貢獻,我們這裡想要**的是索引技術的另乙個層面--把索引的索引--放到腦海裡面。首先不管是從msdn還是從搜尋引擎裡面查詢資訊,我們都需要依賴一種東西,那就作為索引的組成部分的關鍵字,所謂「索引的索引」,前乙個索引就指的是需要「告訴」msdn或搜尋引擎的關鍵字,而後乙個索引則是將儲存在我們的腦海裡,並且借之能推導出前乙個索引所需的關鍵字的東西。也就是說,索引的索引的組成部分也有兩個,前者就是剛剛討論但尚未定義的「這種東西」,後者就是對於計算機系統所適合的關鍵字(就是你在google的搜尋欄裡面要填入的文字)。

「這種東西」適合儲存在大腦裡,目前也只有大腦能做到儲存它。因為它可能非常複雜,它既可能是簡簡單單的適合計算機系統直接識別的關鍵字本身,又可能是一段故事、也可以是某個場景、甚至可以是童年時期的乙個夢魘,總而言之它是一種記憶,或記憶的片段。通過這樣的乙個有機的記憶的片段,我們可以總結、歸納、或聯想、推導出乙個或一組適合計算機系統識別的關鍵字,然後借之查詢到我們所需的資訊主體。舉個例子,我們辛辛苦苦開發的乙個程式執行起來出錯了,它向我們報告了一些錯誤資訊,同時我們知道這起出錯「事故」關係到了那些原理、api,對於計算機來說,「種種原理、種種api、種種錯誤現象及描述」等是各自為政的東西,他們是陌路人,但是我們的大腦能把它們關聯起來--這就構成了乙個場景,我們輕而易舉地記住了這個場景,以後出現同樣或類似錯誤的時候我們的腦海裡就會快速地「泛起」這個場景的「漣漪」,然後迅速地推導出一些關鍵字,通過搜尋引擎找到我們的解決方案--而我們實現並不需要將那個解決方案背誦下來。

「這種東西」也可以簡單地理解為一種大腦能儲存並加工處理的複雜的索引,和計算機不一樣,計算機只能處理簡單的索引,當索引過於複雜的時候,就失去了其作用及意義,但是大腦不一樣,大腦恰好適合處理這種「複雜的索引」,這是大腦的好處。但是,我們知道大腦除了會記憶,同時更善於遺忘--這個特性似乎常常讓我們感到沮喪,但是不要緊,有另一種東西能幫助我們實現精準而且持久的「記憶」,那就是剛剛提到的不能處理複雜索引的有點笨的計算機。所謂「索引化記憶」,到了這裡就可以初步地給出乙個定義,就是利用大腦和計算機各自對於資訊儲存、處理的特性,取長補短,顯式地使用一種索引化技術,來達到隨時隨地獲取海量資訊的目的。

像剛才提到的,所謂索引的索引,既可能是乙個直接的適合計算機處理的可以借之找到資訊主體所依賴的key(關鍵字),也可能是乙個能借之推導出合適的關鍵字的場景。在網路日益普及計算機裝置日益小型化便攜化的今天,如果我們能主動地使用索引化記憶的技巧,那麼一切資訊都唾手可得,「資訊**」的論調將成為過去,面對天文數字的資訊,我們將不再恐懼,不再望而卻步,轉而將主要精力從死記硬背中轉移到記憶、篩選關鍵字方面去,進而做到在這個資訊時代如魚得水游刃有餘。

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

記憶化搜尋 演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,以後再次遇到這個狀態的時候,就不必重新求解了。例1.題目描述 給從左至右排好隊的小朋友們分糖果,要求 1.每個小朋友都...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...