操作系統
文件系統和數據庫系統的區別
文件系統把數據組織成相互獨立的數據文件,實現了記錄內的結構性,但整體無結構;而數據庫系統實現整體數據的結構化,這是數據庫的主要特徵之一,也是數據庫系統與文件系統的本質區別。
在文件系統中,數據冗餘度大,浪費存儲空間,容易造成數據的不一致;數據庫系統中,數據是面向整個系統,數據可以被多個用戶、多個應用共享使用,減少了數據冗餘。
文件系統中的文件是爲某一特定應用服務的,當要修改數據的邏輯結構時,必須修改應用程序,修改文件結構的定義,數據和程序之間缺乏獨立性;數據庫系統中,通過DBMS的兩級映象實現了數據的物理獨立性和邏輯獨立性,把數據的定義從程序中分離出去,減少了應用程序的維護和修改。
文件系統和數據庫系統均可以長期保存數據,由數據管理軟件管理數據,數據庫系統是在文件系統基礎上發展而來。
進程上下文切換的具體過程,是什麼實現的
CPU 寄存器和程序計數器就是 CPU 上下文,因爲它們都是 CPU 在運行任何任務前,必須的依賴環境。
上下文切換就是先把前一個任務的 CPU 上下文(也就是 CPU 寄存器和程序計數器)保存起來,然後加載新任務的上下文到這些寄存器和程序計數器,最後再跳轉到程序計數器所指的新位置,運行新任務。而這些保存下來的上下文,會存儲在系統內核中,並在任務重新調度執行時再次加載進來。這樣就能保證任務原來的狀態不受影響,讓任務看起來還是連續運行。
根據任務的不同,可以分爲以下三種類型
- 進程上下文切換
- 線程上下文切換
- 中斷上下文切換
一次系統調用的過程,其實是發生了兩次 CPU 上下文切換。(用戶態-內核態-用戶態)
系統調用過程中,並不會涉及到虛擬內存等進程用戶態的資源,也不會切換進程。這跟我們通常所說的進程上下文切換是不一樣的:進程上下文切換,是指從一個進程切換到另一個進程運行;而系統調用過程中一直是同一個進程在運行。所以,系統調用過程通常稱爲特權模式切換,而不是上下文切換。系統調用屬於同進程內的 CPU 上下文切換。
上下文切換與模式切換:上下文切換隻能發生在內核態中。用戶態和內核態的切換叫做模式切換而不是上下文切換,因爲沒有改變當前的進程。
上下文切換對系統來說意味着消耗大量的 CPU 時間,事實上,可能是操作系統中時間消耗最大的操作。Linux相比與其他操作系統(包括其他類 Unix 系統)有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。
BIOS,操作系統開機過程
“啓動"用英語是boot。這裏的boot是bootstrap(鞋帶)的縮寫,它來自一句諺語:“pull oneself up by one’s bootstraps”,字面意思是"拽着鞋帶把自己拉起來”,這當然是不可能的事情。最早的時候,工程師們用它來比喻,計算機啓動是一個很矛盾的過程:必須先運行程序,然後計算機才能啓動,但是計算機不啓動就無法運行程序!
早期真的是這樣,必須想盡各種辦法,把一小段程序裝進內存,然後計算機才能正常運行。所以,工程師們把這個過程叫做"拉鞋帶",久而久之就簡稱爲boot了。
- 第一階段:BIOS
上個世紀70年代初,“只讀內存”(read-only memory,縮寫爲ROM)發明,開機程序被刷入ROM芯片,計算機通電後,第一件事就是讀取它。這塊芯片裏的程序叫做"基本輸入輸出系統"(Basic Input/Output System),簡稱爲BIOS。
- 硬件自檢:BIOS程序首先檢查,計算機硬件能否滿足運行的基本條件。(Power-On Self-Test),縮寫爲POST。
- 啓動順序:硬件自檢完成後,BIOS把控制權轉交給下一階段的啓動程序。這時,BIOS需要知道,“下一階段的啓動程序"具體存放在哪一個設備。也就是說,BIOS需要有一個外部儲存設備的排序,排在前面的設備就是優先轉交控制權的設備。這種排序叫做"啓動順序”(Boot Sequence)。
- 第二階段:主引導記錄
BIOS按照"啓動順序",把控制權轉交給排在第一位的儲存設備。
這時,計算機讀取該設備的第一個扇區,也就是讀取最前面的512個字節。如果這512個字節的最後兩個字節是0x55和0xAA,表明這個設備可以用於啓動;如果不是,表明設備不能用於啓動,控制權於是被轉交給"啓動順序"中的下一個設備。
這最前面的512個字節,就叫做"主引導記錄"(Master boot record,縮寫爲MBR)。
- 第三階段:硬盤啓動
這時,計算機的控制權就要轉交給硬盤的某個分區了。
- 第四階段:操作系統
控制權轉交給操作系統後,操作系統的內核首先被載入內存。
以Linux系統爲例,先載入/boot目錄下面的kernel。內核加載成功後,第一個運行的程序是/sbin/init。它根據配置文件產生init進程。這是Linux啓動後的第一個進程,pid進程編號爲1,其他進程都是它的後代。
然後,init線程加載系統的各個模塊,比如窗口程序和網絡程序,直至執行/bin/login程序,跳出登錄界面,等待用戶輸入用戶名和密碼。
操作系統的四個特徵:併發、共享、虛擬、異步
併發:是指兩個或多個事件在同一時間間隔內發生。操作系統的併發性是指計算機系統中同時存在多個運行着的程序,因此它應該具有處理和調度多個程序同時執行的能力。
在這種多道程序環境下,一段時間內,宏觀上有多個程序在同時運行,而每一時刻,單處理器環境下實際僅能有一道程序執行,故微觀上這些程序還是在分時地交替執行。操作系統的併發性是通過分時得以實現的。
注意:並行性是指計算機系統具有可以同時進行運算或操作的特性,在同一時間完成兩種或兩種以上的工作。並行性需要有相關硬件的支持,如多流水線或多處理器硬件環境。
共享:是指系統中的資源(硬件資源和信息資源)可以被多個併發執行的程序共同使用,而不是被其中一個獨佔。資源共享有兩種方式:互斥訪問和同時訪問。
併發和共享是操作系統的最基本特徵,互爲依存。併發執行的要求引出了資源的共享;而資源共享的管理又直接影響到程序的併發執行。
異步:在多道程序環境下,允許多個程序併發執行,但由於資源有限,進程的執行不是一貫到底。而是走走停停,以不可預知的速度向前推進,這就是進程的異步性。異步性使得操作系統運行在一種隨機的環境下,可能導致進程產生與時間有關的錯誤。但是隻要運行環境相同,操作系統必須保證多次運行程序,都獲得相同的結果。
虛擬:虛擬性是一種管理技術,把物理上的一個實體變成邏輯上的多個對應物,或把物理上的多個實體變成邏輯上的一個對應物的技術。採用虛擬技術的目的是爲用戶提供易於使用、方便高效的操作環境。
操作系統的功能包括處理器管理、存儲器管理、文件管理、設備管理。
操作系統的組成部分
Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件並使用系統。
系統調用和庫函數的區別
- 系統調用
系統調用提供的函數如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write爲例:其函數原型爲 size_t write(int fd, const void *buf, size_t nbytes),其操作對象爲文件描述符或文件句柄fd(file descriptor),要想寫一個文件,必須先以可寫權限用open系統調用打開一個文件,獲得所打開文件的fd,例如 fd=open("/dev/video", O_RDWR)。fd是一個整型值,每新打開一個文件,所獲得的fd爲當前最大fd加1。Linux系統默認分配了3個文件描述符值:0-standard input,1-standard output,2-standard error。
系統調用通常用於底層文件訪問(low-level file access),例如在驅動程序中對設備文件的直接訪問。
系統調用是操作系統相關的,因此一般沒有跨操作系統的可移植性。
系統調用發生在內核空間,因此如果在用戶空間的一般應用程序中使用系統調用來進行文件操作,會有用戶空間到內核空間切換的開銷。事實上,即使在用戶空間使用庫函數來對文件進行操作,因爲文件總是存在於存儲介質上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統調用。也就是說,庫函數對文件的操作實際上是通過系統調用來實現的。例如C庫函數fwrite()就是通過write()系統調用來實現的。
這樣的話,使用庫函數也有系統調用的開銷,爲什麼不直接使用系統調用呢?這是因爲,讀寫文件通常是大量的數據(這種大量是相對於底層驅動的系統調用所實現的數據操作單位而言),這時,使用庫函數就可以大大減少系統調用的次數。這一結果又緣於緩衝區技術。在用戶空間和內核空間,對文件操作都使用了緩衝區,例如用fwrite寫文件,都是先將內容寫到用戶空間緩衝區,當用戶空間緩衝區滿或者寫操作結束時,纔將用戶緩衝區的內容寫到內核緩衝區,同樣的道理,當內核緩衝區滿或寫結束時纔將內核緩衝區內容寫到文件對應的硬件媒介。
- 庫函數調用
標準C庫函數提供的文件操作函數如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。以fwrite爲例,其函數原型爲size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對象爲文件指針FILE *pf,要想寫一個文件,必須先以可寫權限用fopen函數打開一個文件,獲得所打開文件的FILE結構指針pf,例如pf=fopen("~/proj/filename", “w”)。實際上,由於庫函數對文件的操作最終是通過系統調用實現的,因此,每打開一個文件所獲得的FILE結構指針都有一個內核空間的文件描述符fd與之對應。同樣有相應的預定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。
庫函數調用通常用於應用程序中對一般文件的訪問。
庫函數調用是系統無關的,因此可移植性好。
由於庫函數調用是基於C庫的,因此也就不可能用於內核空間的驅動程序中對設備的操作。
計算機網絡
五層協議棧
- 物理層:比特流,bit
物理層解決如何在物理介質上傳輸bit的問題。
調製/解調:載波就是一正弦波,調製的過程就是把01“寫入”到載波中。
解調就是依據協議來提取出01信息,接收方遇到振幅大就知道是1,小就是0
工作在這一層的設備有中繼器,其作用是放大信號來擴大傳輸距離、對信號進行整形來抵抗信號的衰減、變形等。
- 數據鏈路層:數據幀,Frame
幀就是一塊有相應格式的數據,通常可分爲三部分:頭部、數據部、尾部。受最大傳輸單元MTU的限制,鏈路層能傳輸的一個幀有長度限制。
最最最常見即以太網,以太網的幀也叫以太幀。以太網是局域網的一種實現,通信採用CSMA/CD的多點接入協議。
MAC層,Media Access Control,媒體接入控制,簡單來說就是解決如何標識每一臺主機的問題。mac地址,全球唯一的網卡地址,完美解決主機的標識問題。
工作在這一層的設備有網橋、交換機,它們可以識別幀並進行轉發。(不同的協議有不同的幀格式,所以要能識別出來必須配置相應的協議)
- 網絡層:數據包,Datagram
異構網絡與IP地址
網絡層解決的是異構網絡的通信問題。異構網絡就是鏈路層有很多很多種不同的實現(也大致可以等同於局域網也不僅僅有以太網),各種不同的網絡之間用來通信的幀格式不同,又如何能通信呢?於是IP地址就出現了,網絡層採用IP地址來標識每一個主機(更具體的說是每一個網絡連接點)。
IP地址與MAC地址轉換:ARP協議(局域網內)
路由器:局域網間
- 傳輸層:數據段,Segment
端口概念:實際上的網絡通信的兩個主機之間的應用(進程)之間的通信,端口用來區分同一主機上的不同應用,簡單的理解就是一個進程佔用一個端口號。
UDP協議:
- 面向無連接:不需要對方主機在線,當然只有在線才能收到
- 面向報文:一次發送一段數據
- 不可靠:發出去就不管了(不管能不能到,不管能不能有序到達)
TCP協議:
- 面向連接:需要對方主機在線,並建立連接
- 面向字節流:你給我一堆字節的數據,我給你發過去,但一次發多少我說了算
- 可靠:我有機制可以保證你的數據一定會有序的到達對方主機
- 應用層
- FTP
- SMTP
- DNS
- HTTP
分組的生命週期
分組的洪泛(flooding)會降低網絡運行性能;解決方案:
- 控制測量週期;
- 爲測量分組設置生命週期並依時間遞減,當分組生命週期爲0時會被路由器丟棄。
DNS 的工作過程
- 檢查本地hosts文件
- 查找本地DNS緩存
- 首選DNS服務器
- 查找緩存:
- 緩存命中
- 轉發模式
- 根提示
點擊一個鏈接的網絡過程
- 瀏覽器解析URL或超鏈接
- 發送DNS請求,獲得IP地址
- 請求IP地址,建立TCP鏈接
- 向WEB服務器發送請求,GET或POST
- 處理請求完畢,釋放TCP鏈接
TPC三次握手,四次揮手
三次握手:
- SYN=1,Seq=X ->
- SYN=1,ACK=X+1,Seq=Y <-
- ACK=Y+1,Seq=Z ->
四次揮手:
- Fin=1,Ack=Y,Seq=X ->
- Ack=X+1,Seq=Y <-
- Fin=1,Ack=X+1,Seq=Y+1 <-
- Ack=Y+2,Seq=X+1 ->
數據庫
數據庫的完整性
- 實體完整性:每個關係有一個主碼,每個主碼唯一確定該元組。
- 參照完整性
- 域約束
- 關係約束:分爲靜態約束和動態約束;靜態約束時規定關係各個屬性值之間應該滿足的約束關係。動態約束是指修改元組的值時需要滿足的約束條件。
數據庫如何保證數據的一致性
ACID:原子性,一致性,隔離性,持久性。
關係數據庫的定義
關係數據庫(英語:Relational database),是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。現實世界中的各種實體以及實體之間的各種聯繫均用關係模型來表示。
關係模型由關係數據結構、關係操作集合、關係完整性約束三部分組成。
數據庫範式
第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列
第二範式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。 [在1NF基礎上消除部分依賴]。
第三範式(3NF):在1NF基礎上,任何非主屬性不依賴於其它非主屬性。[在2NF基礎上消除傳遞依賴]。
BCNF是3NF的改進形式:BCNF意味着在關係模式中每一個決定因素都包含候選鍵,也就是說,只要屬性或屬性組A能夠決定任何一個屬性B,則A的子集中必須有候選鍵。BCNF範式排除了任何屬性(不光是非主屬性,2NF和3NF所限制的都是非主屬性)對候選鍵的傳遞依賴與部分依賴。
什麼是事務處理
事務(Transaction)是併發控制的基本單位。所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。例如,銀行轉帳工作:從一個帳號扣款並使另一個帳號增款,這兩個操作要麼都執行,要麼都不執行。所以,應該把他們看成一個事務。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。
在SQL Server中,對事務的管理包含三個方面:
- 事務控制語句:它使程序員能指明把一系列操作(Transact - SQL命令)作爲一個工作單位來處理。
- 鎖機制(Locking):封鎖正被一個事務修改的數據,防止其他用戶訪問到“不一致”的數據。
- 事務日誌(Transaction Log):使事務具有可恢復性。
數據庫隔離級別
- RU:髒讀
- RC:不可重複讀
- RR:歡讀
- Serializable:可序列化
計算機組成原理
馮諾依曼系統結構
- 採用存儲程序方式,指令和數據不加區別混合存儲在同一個存儲器中,數據和程序在內存中是沒有區別的,它們都是內存中的數據。
- 存儲器是按地址訪問的線性編址的一維結構,每個單元的位數是固定的。
- 指令由操作碼和地址組成。操作碼指明本指令的操作類型,地址碼指明操作數和地址。操作數本身無數據類型的標誌,它的數據類型由操作碼確定。
- 通過執行指令直接發出控制信號控制計算機的操作。指令在存儲器中按其執行順序存放,由指令計數器指明要執行的指令所在的單元地址。指令計數器只有一個,一般按順序遞增,但執行順序可按運算結果或當時的外界條件而改變。
- 以運算器爲中心,I/O設備與存儲器間的數據傳送都要經過運算器。
- 數據以二進制表示。
馮諾依曼機的存儲思想
馮.諾依曼計算機的核心思想是存儲程序。
馮·諾依曼計算機主要由運算器、控制器、存儲器和輸入輸出設備組成,它的的特點是:程序以二進制代碼的形式存放在存儲器中;所有的指令都是由操作碼和地址碼組成;指令在其存儲過程中按照執行的順序;以運算器和控制器作爲計算機結構的中心等。馮諾依曼計算機廣泛應用於數據的處理和控制方面,但是存在一些侷限性。
程序和數據怎麼分別存儲
CPU通過寄存器區分指令和數據。
這與CPU中的cs:ip有關,當你定義了哪段內存爲cs,則這段就爲代碼段。如果定義了ds,哪麼這段就爲數據段。一段內存,可以既是代碼的存儲空間,又是數據的存儲空間,除些之外,還可以是棧空間,也可以什麼也不是。關鍵是CPU中寄存器的設置,即cs,ip,ss,sp,ds的指向。
編程語言
靜態聯編,動態聯編,靜態類型,動態類型
多態:
- 靜態多態:
- 函數重載
- 泛型編程
- 動態多態:
- 虛函數
聯編的作用是:程序調用函數,編譯器決定使用哪個可執行代碼塊。
靜態聯編其實就是類似上面我們提到的,函數重載和運算符重載,它是在編譯過程彙總進行的聯編,又稱早期聯編。而動態聯編是在程序運行過程中才動態的確定操作對象。
實際上一個非指針非引用的變量,在聲明時已經確定了它自己的類型,不會再後面改變。而指針或引用可以進行類型轉換。
虛函數和純虛函數
定義一個函數爲虛函數,不代表函數爲不被實現的函數。
定義他爲虛函數是爲了允許用基類的指針來調用子類的這個函數。
定義一個函數爲純虛函數,才代表函數沒有被實現。
- 定義純虛函數的目的在於,使派生類僅僅只是繼承函數的接口。
- 虛函數的目的在於實現多態。
編譯原理
詞法分析和語法分析
詞法分析:詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字符一個字符地讀入源程序,即對構成源程序的字符流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。
語法分析:語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達式”等等。語法分析程序判斷源程序在結構上是否正確,源程序的結構由上下文無關文法描述。
文法
0型文法
1型文法:上下文有關文法
2型文法:上下文無關文法
3型文法:正則文法
數據結構與算法
快速排序,堆排序,插入排序
堆排序的過程中,需要有效的隨機存取。比較父節點和字節點的值大小的時候,雖然計算下標會很快完成,但是在大規模的數據中對數組指針尋址也需要一定的時間。而快速排序只需要將數組指針移動到相鄰的區域即可。在堆排序中,會大量的隨機存取數據;而在快速排序中,只會大量的順序存取數據。隨着數據規模的擴大,這方面的差距會明顯增大。在這方面的時間開銷來說,快速排序只會線性增長,而堆排序增加幅度很大,會遠遠大於線性。
標準庫中的sort,是通過 先快排,遞歸深度超過一個閥值就改成堆排,然後對最後的幾個進行插入排序來實現的。
排序算法穩定性
穩定排序:基數排序,冒泡排序,直接插入排序,歸併排序
不穩定排序:堆排序,快速排序,希爾排序,直接選擇排序
數據結構的作用
數據結構可以說是編程的靈魂,它不是一門語言所以沒有關鍵字。它只是給程序開發人員一個開發思路而已,講的主要是已經成熟的編程思想和算法,而且幾乎適用於所有開發語言。
離散數學中的圖論與數據結構中的圖論有什麼區別
圖論出自數學,目前算是組合數學分支下的東西(離散數學) 被應用到計算機科學中來儲存數據就成了數據結構。
數據結構的側重點在於算法設計,而離散數學在於技巧。
堆和棧
- 棧區(stack)–由編譯器自動分配和釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
- 堆區(heap)–一般由程序員分配和釋放,若程序員不釋放,程序結束時可能由OS回收,注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
遞歸轉非遞歸
- 遞歸轉循環
- 使用棧保存中間結果
堆溢出和棧溢出
- 堆溢出:不斷的new 一個對象,一直創建新的對象。
- 棧溢出:死循環或者是遞歸太深,遞歸的原因,可能太大,也可能沒有終止。
Dijkstra算法
算法思想:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組爲已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部頂點都加入到S中,算法就結束了),第二組爲其餘未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點爲中間頂點的當前最短路徑長度。
B+樹和B樹的區別
- B+樹中只有葉子節點會帶有指向記錄的指針(ROWID),而B樹則所有節點都帶有,在內部節點出現的索引項不會再出現在葉子節點中。
- B+樹中所有葉子節點都是通過指針連接在一起,而B樹不會。
B+樹的優點:
- 非葉子節點不會帶上ROWID,這樣,一個塊中可以容納更多的索引項,一是可以降低樹的高度。二是一個內部節點可以定位更多的葉子節點。
- 葉子節點之間通過指針來連接,範圍掃描將十分簡單,而對於B樹來說,則需要在葉子節點和內部節點不停的往返移動。
B樹的優點:
- 對於在內部節點的數據,可直接得到,不必根據葉子節點來定位。
樹和圖的區別
樹是圖的子集。樹是沒有環的圖(在圖裏面,環的路線是開始和結束都是一樣的點),一個子節點只有一個父節點。
基礎數學與離散數學
極限與趨近
極限可以用來描述一個序列的指標愈來愈大時,序列中元素的性質變化的趨勢。 極限也可以描述函數的自變量接近某一個值的時候,相對應的函數值變化的趨勢。
趨近是指無限接近又不彼此重合。
泰特級數
使用多項式表達式估計(近似)f(x)在 x=a 附近的值。
數據和信息的區別
- 數據是指某一目標定性、定量描述的原始資料,包括數字、文字、符號、圖形、圖像以及它們能夠
轉換成的數據等形式。 - 信息是向人們或機器提供關於現實世界新的事實的知識,是數據中所包含的意義。(信息熵)
全概率,條件概率和貝葉斯公式
全概率公式:如果事件B1、B2、B3…Bn 構成一個完備事件組,即它們兩兩互不相容,其和爲全集;並且P(Bi)大於0,則對任一事件A有 P(A)=P(A|B1)P(B1) + P(A|B2)P(B2) + … + P(A|Bn)P(Bn)。
條件概率公式:P(AB)=P(A)P(B|A)=P(B)P(A|B)
貝葉斯公式:P(Bi|A)=P(A|Bi)P(Bi) / (P(A|B1)P(B1)+P(A|B2)P(B2)+…P(A|Bn)P(Bn));常常把P(Bi|A)稱作後驗概率,而P(A|Bn)P(Bn)爲先驗概率。而P(Bi)又叫做基礎概率。
數理邏輯的定義
數理邏輯是數學的一個分支,其研究對象是對證明和計算這兩個直觀概念進行符號化以後的形式系統。
離散數學包含哪些部分
數理邏輯,集合論,信息論,數論,組合數學,圖論。
集合的勢和無限集合
集合的勢就是集合的大小。
無限集合的的大小比較是不顯然的。
- 在基數意義下:通過建立一一對應的關係,證明了偶數和整數在基數意義下一樣多。
- 在密度意義下:對於 N->oo,偶數集的大小是自然集的一半。
偏序和全序
偏序的定義:
設R是集合A上的一個二元關係,若R滿足:
- 自反性:對任意x∈A,有xRx;
- 反對稱性(即反對稱關係):對任意x,y∈A,若xRy,且yRx,則x=y;
- 傳遞性:對任意x, y,z∈A,若xRy,且yRz,則xRz。
全序的定義:
設集合X上有一全序關係,如果我們把這種關係用 ≤ 表述,則下列陳述對於 X 中的所有 a, b 和 c 成立:
- 如果 a ≤ b 且 b ≤ a 則 a = b (反對稱性)
- 如果 a ≤ b 且 b ≤ c 則 a ≤ c (傳遞性)
- a ≤ b 或 b ≤ a (完全性)
複數集中並不是所有的數都可以比較大小,那麼“大小”就是複數集的一個偏序關係。
歐拉圖和哈密頓圖
歐拉回路是指不重複地走過所有路徑的迴路,而哈密頓迴路是指不重複地走過所有的點並且最後還能回到起點的迴路。具有歐拉回路的圖是歐拉圖,具有哈密頓迴路的圖是哈密頓圖。顯然歐拉圖不含有奇點。
什麼是羣
在數學中,羣表示一個擁有滿足封閉性、結合律、有單位元、有逆元的二元運算的代數結構。
謂詞邏輯和命題邏輯
命題是具有真假意義的語句。無法表達結構和邏輯關係。謂詞邏輯就是加了"量詞運用規則"的命題邏輯。
等價關係
等價關係定義爲:設R是非空集合A上的二元關係,若R是自反的、對稱的、傳遞的,則稱R是A上的等價關係。
設 R 是集合 A 上的一個二元關係,若R滿足:
- 自反性:∀ a ∈ A, => (a, a) ∈ R
- 對稱性:(a, b) ∈ R ∧ a ≠ b => (b, a)∈ R
- 傳遞性:(a, b) ∈ R,(b, c) ∈ R =>(a, c)∈ R
則稱R是定義在A上的一個等價關係。
等價關係其實就是發現了事物A和事物B具有一致性。而這種一致性,只可以重現的(反身性),是便捷而符合直覺的(對稱性),以及可推廣的,具有應用價值的(傳遞性)。
最熟悉的等價關係:等於。
合取範式與析取範式
合取:∧
析取:∨
- 由有限個簡單合取式構成的析取式稱爲析取範式。
- 由有限個簡單析取式構成的合取式稱爲合取範式。
二元關係
- 恆等關係
- 自反關係
- 反自反關係
- 對稱關係
- 反對稱關係
- 傳遞關係
計算機圖形學和計算機視覺
圖形和圖像
- 圖形graphic是基於矢量的,所謂矢量,比如線段,形狀等,都是可以用一組數據加公式計算出來的。
- 圖像image是基於點陣的,是用數學公式算不來的,他的表示依賴於像素。
座標系,空間
- 物體座標系(本地座標系)Local Space 或 Model Space
- 世界座標系 World Space
- 觀察者座標系(攝像機座標系) View Space
- 裁剪空間 Clipping Space
- 屏幕空間 Screen Space
空間變換矩陣
- Model matrix 模型矩陣。進行物體座標系到世界座標系的轉換。
- View matrix 觀察矩陣。將世界座標系變換到觀察者座標系。
- Projection matrix 投影矩陣。將觀察者座標系轉換到裁剪座標系。
光柵化
光柵化(Rasterize/rasteriztion)。就是把矢量圖形轉化成像素點兒的過程。我們屏幕上顯示的畫面都是由像素組成,而三維物體都是點線面構成的。要讓點線面,變成能在屏幕上顯示的像素,就需要Rasterize這個過程。就是從矢量的點線面的描述,變成像素的描述。
Cyrus-Beck裁剪算法
我們把定義向量c = (C - A),而線段AC是射線A + ct的一部分。那麼t取0和1就是線段AC。我們將射線與多邊形的每條邊求出相交時的t。取tin = max(0, tin),tout = max(tout, 1)。最終會獲得一個區間[tin,tout]就是經多邊形裁剪後的線段。通過A+ct即可還原出裁剪後的線段。