<資料結構與演算法分析>讀書筆記--模型
為了在正式的構架中分析演算法,我們需要一個計算模型。我們的模型基本上是一臺標準的計算機,在機器中指令被順序地執行。該模型有一個標準的簡單指令系統,如加法、乘法、比較和賦值等。但不同於實際計算機情況的是,模型機做任一簡單的工作都恰好花費一個時間單位。為了合理起見,我們將假設模型像一臺現代計算機那樣固定大小的整數並且不存在如矩陣求逆或排序這種想象的操作,它們顯然不能在一個時間單位內完成。我們還假設模型機有無線的記憶體。
顯然,這個模型有些缺點。很明顯,在現實生活中不是所有的運算都恰好花費相同的時間。特別在我們的模型中,一次磁碟讀入按一次加法計時,雖然加法一般要快幾個數量級。還有,由於假設有無線記憶體,我們再不擔心缺頁中斷,而它可能是個實際問題,特別是對一些高效的演算法。
從上面這段話中,我們或許會提出一個問題,什麼是計算模型?
我百度找了下,想找一個官方的說辭,但是大多顯示出來的結果是分散式計算模型、平行計算模型。
於是我認為,計算即處理,可以將計算模型理解為處理模型,所謂的計算模型本質上還是對資料進行處理,比如假定記憶體有限的情況下,而資料大量,這個資料是可以通過演算法進行優化的,於是我們可以以某種模型來對待資料,然後編寫對應的演算法處理,模型可以理解為是模式。
相關推薦
<資料結構與演算法分析>讀書筆記--模型
為了在正式的構架中分析演算法,我們需要一個計算模型。我們的模型基本上是一臺標準的計算機,在機器中指令被順序地執行。該模型有一個標準的簡單指令系統,如加法、乘法、比較和賦值等。但不同於實際計算機情況的是,模型機做任一簡單的工作都恰好花費一個時間單位。為了合理起見,我們將假設模型像一臺現代計算機那樣固定大小的整數
<資料結構與演算法分析>讀書筆記--實現泛型構件pre-Java5
面向物件的一個重要目標是對程式碼重用的支援。支援這個目標的一個重要的機制就是泛型機制:如果除去物件的基本型別外,實現的方法是相同的,那麼我們就可以用泛型實現來描述這種基本的功能。 1.使用Object表示泛型 Java中的基本思想就是可以通過使用像Objec
<資料結構與演算法分析>讀書筆記--函式物件
關於函式物件,百度百科對它是這樣定義的: 過載函式呼叫操作符的類,其物件常稱為函式物件(function object),即它們是行為類似函式的物件。又稱仿函式。 聽起來確實很難懂,通過搜尋我找到一篇部落格,作者對其是這樣的描述: 如果把物件理解成指標的話,也就是說,函式物件其實就是函式
<資料結構與演算法分析>讀書筆記--數學知識複習
數學知識複習是《資料結構與演算法分析》的第一章引論的第二小節,之所以放在後面,是因為我對數學確實有些恐懼感。不過再怎麼恐懼也是要面對的。 一、指數 基本公式: 二、對數 在電腦科學中除非有特別的宣告,否則所有的對數都是以2為底的。 定義:XA=B 當且
<資料結構與演算法分析>讀書筆記--要分析的問題
通常,要分析的最重要的資源就是執行時間。有幾個因素影響著程式的執行時間。有些因素(如使用編譯器和計算機)顯然超出了任何理論模型的範疇,因此,雖然它們是重要的,但是我們在這裡還是不能考慮它們。剩下的主要因素是所使用的演算法以及對該演算法的輸入。 典型的情形是,輸入的大小是主要的考慮方面。我們定義兩個函式Tav
<資料結構與演算法分析>讀書筆記--執行時間計算
有幾種方法估計一個程式的執行時間。前面的表是憑經驗得到的(可以參考:<資料結構與演算法分析>讀書筆記--要分析的問題) 如果認為兩個程式花費大致相同的時間,要確定哪個程式更快的最好方法很可能將它們編碼並執行。 一般地,存在幾種演算法思想,而我們總願意儘早除去那些不好的演算法思想,因此,通常需要
<資料結構與演算法分析>讀書筆記--執行時間中的對數及其分析結果的準確性
分析演算法最混亂的方面大概集中在對數上面。我們已經看到,某些分治演算法將以O(N log N)時間執行。此外,對數最常出現的規律可概括為下列一般法則: 如果一個演算法用常數時間(O(1))將問題的大小削減為其一部分(通常是1/2),那麼該演算法就是O(logN)。另一方面,如果使用常數時間只是把問題減少一個
資料結構與演算法JavaScript描述讀書筆記(js實現樹)
js定義二叉查詢樹 //建立建構函式建立節點 function Node(data){ this.data = data; this.left = null; this.right = null; } function tree(){ this.root = nu
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-迴圈連結串列)
迴圈連結串列 迴圈連結串列同單鏈表,只需設定head.next = head就可以實現迴圈連結串列 其它方法不變,但是遍歷方法需要改一下 function display() { var cur = this.head; var str = ''; //如果不設定
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-雙向連結串列)
雙向連結串列 雙向連結串列的 remove() 方法比單向連結串列的效率更高,因為不需要再查詢前驅節點了 //建立建構函式建立節點 function Node(element){ this.element = element; this.next = null; th
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-單鏈表)
單鏈表 //建立建構函式建立節點 function Node(element){ this.element = element; this.next = null; } //連結串列的建構函式 function LList(){ this.head = new Node
資料結構與演算法JavaScript描述讀書筆記3(檢索演算法)
列表中查詢資料有兩種方法:順序查詢和二分查詢。順序查詢使用於元素隨機排列的列表;二分查詢適用於元素已排序的列表。二分查詢效率高,但是必須花費額外時間將列表中的元素排序 順序查詢 時間複雜度:O(n) function seqSearch(arr,data){ for(var i=
資料結構與演算法JavaScript描述讀書筆記(高階排序演算法)
希爾排序 在插入排序的基礎上,只不過比較的步長不一樣,插入排序比較步長一直是1(即一個一個的比較)。希爾排序的步長第一次一般設定為gap=Math.floor(arr.length/2),之後依次將步長設定為gap/2,直到步長變為1,這個時候徹底轉化成插入排 測試時間普通排序演算法1
資料結構與演算法JavaScript描述讀書筆記(基本排序演算法)
前提準備 //自動生成陣列的函式,n:整數個數,數字在l-r之間 function setData(n,l,r){ var dataStore = []; for(var i=0;i<n;i++){ dataStore[i] = Math.floor(
《資料結構與演算法分析》學習筆記-第一章-引論
自述 自從工作之後,就沒有再寫部落格了,一方面是因為自己初入職場還不能很好的適應職場生活。另一方面也是對前途有些不知所措。現在工作已經快三年了,我慢慢找到了自己的節奏,也許還是有很多不成熟的地方,但是我已經想開啦。做自己真正喜歡的事就好了,遵循自己的內心。在職場的這些年我寫了很多筆記,但是沒有時間整理出來,後
《資料結構與演算法分析》學習筆記-第二章-演算法分析
演算法分析 如果解決一個問題的演算法被確定下來,並用某種證明方法證明其是正確的,那麼接下來就要判斷該演算法的執行時間,以及執行時佔用的空間。這一章主要討論 估算程式執行時間 降低程式的執行時間 遞迴的風險 將一個數自乘得到其冪以及計算兩個數的最大公因數的有效演算法 2.1 數學基礎 如果存在正常數c和n
《資料結構與演算法分析》學習筆記-第三章-表、棧和佇列
[toc] *** ## Fork me on Github 我自己實現了一個雙向迴圈連結串列,釋出在Github上。 叫**QuickList**,包含完整的連結串列模組原始碼和測試用例。==遵循GPL V2.0協議==。 大家可以去github上獲取,如果覺得好用請幫我點個star,謝謝啦嘿嘿~ [Qu
《資料結構與演算法分析》學習筆記-第四章-樹
[toc] *** ## 4.1 預備知識 - 對於大量的輸入資料,連結串列的執行緒訪問時間太慢,不宜使用。**二叉查詢樹**大部分操作的執行時間平均為**O(logN)**。 - 樹可以用幾種方式定義,定義樹的一種自然的方式是遞迴的方法。一棵樹是一些節點的集合。這個集合可以是空集。若非空,則==一棵樹由稱
《資料結構與演算法分析》學習筆記-第五章-雜湊
[toc] *** 散列表只支援二叉查詢樹所允許的一部分操作。雜湊是一種用於以常數平均時間執行插入、刪除和查詢的技術。但是,那些需要元素間任何排序資訊的操作將不會得到有效的支援,例如FindMin、FindMax以及以線性時間將排過序的整個表進行列印的操作都是雜湊所不支援的 ## 5.2 雜湊函式 1.
《資料結構與演算法分析》學習筆記-第六章-優先佇列
[toc] *** 佇列中的某些成員有更高的優先順序,需要優先執行或者儘快執行完畢 ## 6.1 模型 優先佇列允許至少有兩種操作的資料結構: 1. Insert: 插入元素,相當於入隊 2. DeleteMin: 找出、返回和刪除優先佇列中最小的元素,相當於出隊 ## 6.2 簡單實現 1. 連結串列