計算機程式設計藝術 第I卷

2021-03-31 08:56:30 字數 3138 閱讀 9157

(本文未完待續)

目錄第1章 基本概念

1.1 演算法

1.2 數學準備

1.2.1 數學歸納法

1.2.2 數、冪和對數

1.2.3 和與積

1.2.4 整數函式和初等數論

1.2.5 排列和階乘

1.2.6 二項式係數

1.2.7 調和數

1.2.8 斐波那契數

1.2.9 生成函式

1.2.10 乙個演算法的分析

*1.2.11 漸近表示

*1.2.11.1 ○記號

*1.2.11.2 尤拉求和公式

*1.2.11.3 一些漸近計算

1.3 mix

1.3.1 mix的描述

1.3.2 mix組合語言

1.3.3 對排列的應用

1.4 某些基本的程式設計技術

1.4.1 子程式

1.4.2 共行程式

1.4.3 解釋性程式

1.4.3.1 mix模擬程式

*1.4.3.2 跟蹤程式

1.4.4 輸入和輸出

1.4.5 歷史和參考文獻

第2章 資訊結構

2.1 引論

2.2 線性表

2.2.1 堆疊、排隊和雙排隊

2.2.2 順序分配

2.2.3 鏈結分配

2.2.4 迴圈表

2.2.5 雙重鏈結表

2.2.6 陣列和正交表

2.3 樹

2.3.1 遍歷二叉樹

2.3.2 樹的二叉樹表示

2.3.3 樹的其它表示

2.3.4 樹的基本數學性質

2.3.4.1 自由樹

*2.3.4.2 有向樹

*2.3.4.3 「無限性引理」

*2.3.4.4 樹的列舉

2.3.4.5 通路長度

*2.3.4.6 歷史和參考文獻

2.3.5 列表和廢料收集

2.4 多重鏈結結構

2.5 動態儲存分配

2.6 歷史和參考文獻

習題答案

附錄a 記號索引

附錄b 數值數量**

1. 基本常數(10進的)

2. 基本常數(8進的)

3. 調和數,貝努里數,斐波那契數

名詞和姓名中英對照表

第1章 基本概念

1.1 演算法

對於所有的計算機程式設計說來,演算法的概念總是基本的,所以我們應當首先細心地分析這一概念。

「演算法」(algorithm)一詞本身就是十分有趣的。初看起來,這詞好像是某人打算要寫的「對數」(logarithm)一詞但卻把頭四個字母寫得前後顛倒了。這個詞直到2023年之前在《韋氏新世界詞典》(webster's new world dictionary)中還未出現,我們只能找到帶有它的古代含意的較老形式的「算術」(algori**),指的是用阿拉伯數字進行算術運算的過程。在中世紀時,珠算家用算盤進行計算,而算術家用算術進行計算。中世紀之後,對這個詞的起源已經拿不準了,早期的語言學家試圖推斷它的來歷,認為它是從把algiros〔費力的〕+arithmos〔數字〕組合起來派生而成的,但另一些人則不同意這種說法,認為這個詞是從「喀斯迪耳國王algor」派生而來的。最後,數學史學者發現了算術「algori**」一詞的真實起源:它**於有名的《波斯教科書》(persian textbook)的作者的名字阿布·賈法·穆哈默德·伊本·穆薩·阿科瓦里茨公尺(abu ja'far mohammed ibn musa alkhowarizml)(約公元825年)—從字面上看,是「ja,far的父親,mohammed,moses的兒子,khowarizm的士人」。khowarizm是今天蘇聯基發(хива)市的小城鎮。alkhowarizml寫了著名的書《復原和化簡的規則》(kitab al jabr w'al-muqabala);另乙個詞,「algebra」(代數),是從他的書的標題引出來的,儘管這本書實際上根本不是講代數的。

逐漸地,「algori**」的形式和意義就變得面目全非了。如牛津英語詞典所說明的,這個詞是由於同arithmetic(算術)相混淆而形成的錯誤的造作。由algori**又變成algorithm。只要了解人們已經忘記了這個詞原來派生的實況,就不難理解這種變化。一本早期的德文數學詞典《大全數學辭典》(vollstandiges mathematisches lexicon萊比錫,1747),給出了algorithmus(演算法)一詞的如下的定義:「在這個名稱之下,組合了四種型別的算術計算的概念,即是,加法,減法,乘法和除法」。拉丁短語algorithmus infinitesimalis(無限小演算法),在當時就用來表示「萊布尼茲(leibnitz)所發明的以無限小量進行計算的方法」。

2023年左右,algorithm一詞經常地同歐幾里得演算法「euclid's algorithm」聯絡在一起。這演算法就是在歐幾里得的《幾何原本》(euclid's elements,第vii卷,命題i和ii)中所闡述的求兩個數的最大公因子的過程。在這裡給出歐幾里得演算法來,也將是有益的:

演算法e(歐幾里得演算法)。給定兩個正整數m和n,求它們的最大公因子,即能夠同時整除m和n的最大的正整數。

e1.〔求餘數〕以n除m並令r為所得餘數(我們將有0≤r<n)。

e2.〔餘數為0?〕若r=0,演算法結束;n即為答案。

e3.〔互換〕置m←n,n←r,並返回步驟e1。■

當然,歐幾里得並非就是以這樣的方式來給出他的演算法的。上面的格式充分演示了在給出本書中所有的演算法時貫穿全書的風格。

我們對所討論的每乙個演算法,都給出了乙個標識的字母(例如上邊演算法中的e),並且用這個字母後面接上數字(例如e1,e2等等)來標識這個演算法的步驟。書中各章分為編了號的節,在一節之內的演算法僅用字母來標識;但當在其它節中引用這些演算法時,則附以相應的節號。例如,我們現在是在第1.1節;在這一節中,歐幾里得演算法叫做演算法e,而在後邊的節引用它時,就記作演算法1.1e。

乙個演算法的每一步(例如上邊的步驟e1)以乙個方括號中的乙個短句開始,它盡可能簡短地概括這一步的主要內容。這一短句通常也出現在乙個與這個演算法相對應的框圖(例如圖1)中。借助於框圖,讀者將有可能更直觀地看出這個演算法的流程。

圖1 演算法e的框圖

在概括性的短句之後,是有待執行的某個動作或有待作出的某個判斷的文字元號的敘述。偶而也有帶圓括號的注釋(例如,步驟e1的第二句),它是關於這一步的說明性資訊,通常指出變數的某些特徵或這一步的當前目標,等等;帶圓括號的注釋並不影響屬於這一演算法的動作,而只是為了便於幫助讀者理解。

(未完待續)

計算機程式設計藝術 第I卷 續1

步驟e3中的箭頭 是最重要的替代運算 有時叫做賦值或代換 m n 意思是變數m的值代之以變數n的當前值。當演算法e開始時,m和n的值是原來給出的數 但當它結束時,一般說來,這些變數將有不同的值。箭號用來把替代運算同相等關係加以區別 我們將不說 置m n 但也許我們將要問 是否m n?號標記乙個可被測...

計算機程式設計藝術 第I卷 續2

3 輸入 乙個演算法有0個或多個的輸入。它即是,在演算法開始之前,對演算法最初給出的量。這些輸入取自於特定的物件集合。例如,在演算法e中,有兩個輸入,即m和n,它們都取自於正整數集合。4 輸出 乙個演算法有乙個或多個的輸出。它即是,同輸入有某個特定關係的量。演算法e有乙個輸出,即是步驟e2中的n,它...

《計算機程式設計藝術》學習筆記(一)

一,mix 儘管knuth 對於mix 不満,在第 3版和他本人的主頁上宣告即將更換為 mmix 但對於初學者如我而言,結全本書先學學 mix似乎更為方便,為了學習 tacop 後面的內容,了解一下 mix看來是必須的步驟。命令格式一般為 op address,i f op為命令關鍵字,addres...