【软考】软件设计师知识点整理(待更新)
【軟考】軟件設(shè)計師知識點整理(待更新)
Note:以希賽網(wǎng),信管網(wǎng)的題目為導(dǎo)向而整理的知識點
文章目錄
- 【軟考】軟件設(shè)計師知識點整理(待更新)
- 一、計算機組成與體系結(jié)構(gòu)
- 二、操作系統(tǒng)
- 三、數(shù)據(jù)庫系統(tǒng)
- 四、計算機網(wǎng)絡(luò)
- 五、信息安全
- 六、軟件工程
- 七、面向?qū)ο?/li>
- 八、數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)
- 九、程序設(shè)計語言
- 十、多媒體基礎(chǔ)
- 十一、知識產(chǎn)權(quán)標準化
- 十二、案例分析
- 1、結(jié)構(gòu)化分析
- 2、數(shù)據(jù)庫設(shè)計
- 3、統(tǒng)一建模語言UML
- 4、設(shè)計模式
一、計算機組成與體系結(jié)構(gòu)
-
【計組】時鐘周期、機器周期、指令周期、總線周期、存儲周期(指令周期 > 機器周期 > 時鐘周期)
Note:- 時鐘周期:計算機中最小的時間單位,等于cpu主頻的倒數(shù)。
- 機器周期(cpu周期):計算機中為了方便管理,常把一條指令 的執(zhí)行過程劃分為若干個階段(如取指、間址、執(zhí)行、中斷等)每一階段完成一個基本操作。
- 指令周期:從取指開始到執(zhí)行完成該指令所需要的全部時間。指令周期包含若干機器周期。
- 總線周期:存儲器和I/O端口是掛接在總線上的,CPU對存儲器和I/O接口的訪問通過總線實現(xiàn)。把CPU通過總線對微處理器外部(存儲器或I/O接口)進行一次訪問所需時間稱為一個總線周期。
采用DMA方式傳送數(shù)據(jù)時,每傳送一個數(shù)據(jù)都需要占用一個總線周期。 - 存儲周期:存儲周期包含存取時間和恢復(fù)時間。指兩次獨立訪問存儲器操作之間的最小間隔。
-
原碼、反碼、補碼詳解
-
浮點數(shù)加減法運算(對階(階碼小向階碼大看齊)、尾數(shù)求和、規(guī)格化、舍入、溢出判斷)
Note:- 浮點數(shù)能表示的數(shù)的范圍由 階碼 的位數(shù)決定,精度 由 尾數(shù) 的位數(shù)決定。
-
定點數(shù)的移位、加法與減法運算
Note:- 符號數(shù)算術(shù)運算的溢出可根據(jù)運算結(jié)果的符號位 和 進位標志判別。該方法適用于兩同號數(shù)求和或兩異號數(shù)求差時判別溢出。溢出的邏輯表達式為:VF=SF?\bigoplus?CF即利用符號位和進位標志相異或,當異或結(jié)果為1時(兩符號位不同)表示發(fā)生溢出,當異或結(jié)果為0時,則表示沒有溢出。
- 換句話說:兩個符號位相同的補碼相加,如果和的符號位與加數(shù)的符號相反,則表明運算結(jié)果溢出;
兩個符號位相反的補碼相減,如果差的符號位與被減數(shù)的符號位相反,則表明運算結(jié)果溢出。
-
計算機的內(nèi)部存儲(緩存cache、內(nèi)存main memory),解釋概念:內(nèi)存 = 主存 + cache、外存 = 輔存、閃存、RAM、SRAM、DRAM、ROM、PROM、EPROM、EEPROM
-
cache-主存的三種映射方式(cache比主存快,用于平衡CPU和主存的速率,兩者的地址映射需要專門的硬件自動完成)
-
相聯(lián)存儲器的工作原理(按內(nèi)容訪存,cache、快表中應(yīng)用),相聯(lián)存儲器(Cache,快表是一種相聯(lián)存儲器,按內(nèi)容訪問,而不是按地址訪問)
Note:- 從訪問速度上看,寄存器 > 緩存 > 內(nèi)存 > 閃存 > 磁盤
- 高速緩沖存儲器(緩存)一般使用是存儲速度更快的 SRAM(靜態(tài)隨機訪問存儲器),成本比DRAM(動態(tài)隨機訪問存儲器)高,為了擴大緩存容量,使用SRAM作為一級緩存,使用DRAM作為二級緩存。CPU訪問數(shù)據(jù)先是在一級緩存中找,找不到再到二級緩存中找,再沒有就去內(nèi)存中找。
- ROM不能隨意更改。ROM主要用于檢查計算機系統(tǒng)的配置情況并提供最基本的輸入輸出(I/O)程序,如存儲BIOS參數(shù)的CMOS芯片。ROM的特點是計算機斷電后存儲器中的數(shù)據(jù)仍然存在。
- 主存儲器就是我們常說的(狹義的)“內(nèi)存” ,使用的是DRAM。它之所以叫動態(tài),是因為將數(shù)據(jù)寫入DRAM后,一段時間過后數(shù)據(jù)會丟失,需要一個額外的電路不斷對其進行刷新操作才行。因為DRAM儲存數(shù)據(jù)利用的是電容中是否有電荷,有代表1,無代表0。但是電容會放電或吸電,刷新操作會對其進行檢查。如果電量大于滿電量的1/2,則將電充滿,否則將電全部放掉。
SRAM雖然不需要刷新操作,但是斷電后仍會丟失數(shù)據(jù)。 所以 RAM都要在有電源時工作。 - 內(nèi)存和緩存在廣義上整體被稱為內(nèi)存儲器(簡稱內(nèi)存)或主存儲器,而其他外部不依賴電存儲數(shù)據(jù)的設(shè)備(如磁盤、光盤等)統(tǒng)稱外存儲器或輔助存儲器。
- 緩存 ?\notin∈/ 內(nèi)存,緩存是CPU的一部分,內(nèi)存中被CPU訪問最頻繁的數(shù)據(jù)和指令被復(fù)制到CPU中的緩存中。
- 快閃存儲器(閃存)是一種外部存儲器,多用于照相機、音樂播放器、手機等設(shè)備(如SD卡,Secure Digital Memory Card)。現(xiàn)在的游戲卡一般都是閃存,U盤用的也是快閃技術(shù)。另外,快閃存儲器也在作為磁盤存儲器的替代品越來越多地被使用,即所謂的”固態(tài)硬盤(ssd,solid state disk)“。
閃存在進行數(shù)據(jù)刪除時不是以單個的字節(jié)為單位而是以固定的區(qū)塊為單位,區(qū)塊大小一般為256KB到20MB。閃存是電子可擦除只讀存儲器(EEPROM)的變種,EEPROM與閃存不同的是,它能在字節(jié)水平上進行刪除和重寫而不是整個芯片擦寫,這樣閃存就比EEPROM的更新速度快。由于其斷電時仍能保存數(shù)據(jù),閃存通常被用來保存設(shè)置信息。
閃存不像RAM(隨機存取存儲器)一樣以字節(jié)為單位改寫數(shù)據(jù),因此不能取代RAM,也不能替換主存(RAM)。但是在嵌入式中,可以用閃存代替ROM存儲器。(2021上午4) - 在進行主存地址容量計算時,DFFFFH - A0000H = E0000H - A0000H = (5?1)×164(5 - 1) \times 16^4(5?1)×164
- CPU設(shè)置高速緩存的目的:用來解決CPU與內(nèi)存之間速度、容量不匹配的問題,與外存無關(guān),無法提高外存儲器的訪問速度,可以提高CPU訪問主存數(shù)據(jù)或指令的效率。
-
計算機指令流水線時間計算,計算機指令-流水線和吞吐率,流水線吞吐率的計算
Note:- 由歸納法可知,指令流水線的總執(zhí)行時間 = 單條指令執(zhí)行時間 +(指令條數(shù)-1)* 最長的子過程時長
-
總線復(fù)用的概念及目的
Note:- 總線復(fù)用常見有:時分多路復(fù)用、頻分多路復(fù)用和碼分多路復(fù)用,目的是減少總線中信號線的數(shù)量。
-
擴展操作碼技術(shù) & 單雙操作數(shù)
-
指令的尋址方式
Note:- 尋址是指尋找操作數(shù)的地址或下一條將要執(zhí)行的指令地址。確定指令存放位置的過程稱為指令尋址,確定操作數(shù)存放位置的過程稱為數(shù)據(jù)尋址。
- 常見的數(shù)據(jù)尋址方式包括:立即尋址(該數(shù)是操作數(shù)),直接尋址(地址碼字段給出操作數(shù)的主存地址),隱含尋址,間接尋址,寄存器尋址(地址碼字段給出操作數(shù)的寄存器地址),基址尋址,變址尋址等。
其中按速度快慢排序:立即尋址 > 寄存器尋址 > 直接尋址 - 指令系統(tǒng)中采用不同尋址方式目的是擴大尋址空間并提高編程靈活性。
- 計算機內(nèi)存一般分為靜態(tài)數(shù)據(jù)區(qū)、代碼區(qū)、棧區(qū)和堆區(qū),若某指令的操作數(shù)之一采用立即數(shù)尋址方式,則該操作數(shù)位于代碼區(qū)。
- 程序運行時,需要將程序代碼(機器指令序列)和代碼所操作的數(shù)據(jù)加載至內(nèi)存,指令代碼加載至代碼區(qū),數(shù)據(jù)則根據(jù)綁定關(guān)系可能位于靜態(tài)數(shù)據(jù)區(qū)、棧或堆區(qū)。
舉一反三:直接尋址方式、間接尋址方式、寄存器尋址方式 和 寄存器間接尋址的指令操作數(shù)都位于代碼區(qū)
-
虛擬存儲器
-
中斷方式DMA方式的區(qū)別 - (DMA獲得總線控制權(quán),CPU無需調(diào)用中斷程序處理IO,共同點就是CPU和IO外設(shè)可以實現(xiàn)并行工作),查詢 / 中斷 / DMA / 通道
-
CPU寄存器是否對用戶可見
-
計算機組成之總線結(jié)構(gòu)(單總線/多總線,總線結(jié)構(gòu)可以減少信息傳輸線的數(shù)量),計算機總線結(jié)構(gòu)詳解
-
計算機中三大總線:地址總線、數(shù)據(jù)總線、控制總線,CPU數(shù)據(jù)總線和地址總線 內(nèi)存和外存
Note:- CPU通過地址總線尋址,然后通過數(shù)據(jù)總線與外部設(shè)備互換信息(即通過地址總線確定要訪問的內(nèi)存地址,再由數(shù)據(jù)總線傳輸數(shù)據(jù))。若內(nèi)存容量為4GB,字長為32,則地址總線寬度為32(232=4?210?210?210=4G2^{32} = 4* 2^{10} * 2^{10} * 2^{10}=4G232=4?210?210?210=4G),數(shù)據(jù)總線長度為32(字長32)
- 地址總線的位數(shù)(寬度)決定CPU的尋址范圍;數(shù)據(jù)總線的位數(shù)(寬度)決定CPU單次通信能交換的信息數(shù)量,即CPU與其他元器件一次最大傳送的數(shù)據(jù)量。
- 總線寬度為32bit,時鐘頻率為200MHz,若總線上每5個時鐘周期傳送一個32bit的字,則該總線的帶寬為:一個T為1/(2?108)1/(2 * 10^8)1/(2?108) s,1s內(nèi)共2?1082 * 10^82?108個周期,傳輸了2?108/52 * 10^8 / 52?108/5個32bit字,共160MB/S(注意字節(jié)和比特的換算:1B = 8bit)。
-
Flynn分類法(根據(jù)指令流和數(shù)據(jù)流,對計算機體系結(jié)構(gòu)分類:SISD/SIMD/MISD/MIMD)
-
CPU的RISC和CISC架構(gòu)的區(qū)別
Note:- RISC在設(shè)計時要遵循的基本原則:
1)指令條數(shù)少,一般為幾十條指令。
2)尋址方式盡可能少。
3)采用等長指令,不管功能復(fù)雜的指令還是簡單的指令,均用同一長度.
4)設(shè)計盡可能多的通用寄存器。 - CISC的指令豐富的優(yōu)勢,使得它的編譯器可以少做很多事情,編譯器的設(shè)計更簡單.而RISC在實現(xiàn)一個功能的時候,需要的指令條目數(shù)會更多一些,程序也會更大。
- CISC vs RISC
指令系統(tǒng)類型指令尋址方式實現(xiàn)方式其它 CISC 數(shù)量多,使用頻率差別大,可變長格式 支持多種 微程序控制技術(shù)(微碼) 研制周期長 RISC 數(shù)量少,使用頻率接近,定長格式,大部分為單周期指令,操作寄存器,只有Load/Store操作 支持方式少 增加了通用寄存器,硬布線控制邏輯為主,適合采用流水線 優(yōu)化編譯,有效支持高級語言
- RISC在設(shè)計時要遵循的基本原則:
-
中央處理器—CPU的功能和基本結(jié)構(gòu)
Note:- 在編碼時,每一種二進制代碼,都賦予了特定的含義,即都表示了一個確定的信號或者對象。而譯碼就是編碼的逆過程。CPU中的譯碼器的主要作用是對指令進行譯碼。
-
計組中CPI和MIPS怎么算, 及其之間的換算關(guān)系
Note:- 假如CPU主頻為2.8GHz,平均CPI為3.5,MIPS=f/(CPI×106)=2.8×109Hz/(3.5×106)=800MIPS = f / (CPI \times 10^6) = 2.8 \times 10^9Hz / (3.5 \times 10^6) = 800MIPS=f/(CPI×106)=2.8×109Hz/(3.5×106)=800
-
奇偶校驗碼、海明碼、CRC碼
Note:- 在奇偶校驗碼中
- 若有奇數(shù)個數(shù)據(jù)位出錯,則可以檢測出該錯誤但無法糾正錯誤
- 若有偶數(shù)個數(shù)據(jù)位出錯,則無法檢測出該錯誤
- CRC冗余校驗碼的計算
-
例1:設(shè)生成多項式G(x)=X3+X2+1G(x)=X^3+X^2+1G(x)=X3+X2+1 ,數(shù)據(jù)序列為101001 ,求對應(yīng)的CRC碼?參考CRC碼
解析:通過多項式,得到除數(shù)為1101,數(shù)據(jù)序列需要左移3位(除數(shù)位-1),得到101001000,接著使用如下方法進行計算(異或運算,相同取0,不同取1) :
得到最終的余數(shù)001拼接在原數(shù)據(jù)序列101001 后面,得到CRC冗余校驗碼(101001 001)。
-
例2:設(shè)生成多項式P(x)=x4+x+1P(x)=x^4+x+1P(x)=x4+x+1 ,信息碼為 101011 ,求對應(yīng)的CRC碼?參考CRC循環(huán)冗余校驗(計算機網(wǎng)絡(luò))
解析:通過多項式,得到除數(shù)為10011,數(shù)據(jù)序列需要左移4位(除數(shù)位-1),得到1010110000,接著使用如下方法進行計算(異或運算,相同取0,不同取1) :
-
CRC冗余校驗碼如何檢錯和糾正錯誤:
用生成的CRC碼除以生成多項式G(x)所對應(yīng)的的二進制數(shù)碼,若余數(shù)為0,則信息碼在傳輸過程中沒有產(chǎn)生錯誤,數(shù)據(jù)正確。
-
- 在奇偶校驗碼中
-
吞吐量(數(shù))和網(wǎng)絡(luò)負載(百分比)的區(qū)別,jmeter之吞吐量 / 吞吐率 / TPS / 帶寬及壓力測試和負載測試及其區(qū)別
Note:- 流水線的吞吐率是指單位時間內(nèi)流水線處理機輸出的結(jié)果的數(shù)目,因此流水線的吞吐率為一個流水級時間的倒數(shù),即最長流水級時間的倒數(shù)。
二、操作系統(tǒng)
-
字符、字、字長、字節(jié)、比特、位
-
操作系統(tǒng)中調(diào)度算法(FCFS、RR、SPN、SRT、HRRN)
-
頁面變換表
-
位示圖的概念
Note:- 位示圖是利用二進制的一位(eg: 1bit)來表示磁盤中的一個盤塊(eg:4MB)的使用情況。
-
位示圖的計算、頁式存儲、磁盤管理
-
進程資源圖,化簡,阻塞(非阻塞),死鎖(死鎖并不一定會發(fā)生,死鎖的四個必要條件)
-
什么是死鎖?死鎖發(fā)生的四個必要條件是什么?如何避免和預(yù)防死鎖產(chǎn)生?
-
嵌入式系統(tǒng)初始化過程
Note:嵌入式操作系統(tǒng)的特點:- 1)微型化:從性能和成本角度考慮,希望占用的資源和系統(tǒng)代碼量少;
- 2)可定制:從減少成本和縮短研發(fā)周期考慮,要求嵌入式操作系統(tǒng)能運行在不同的微處理器平臺上,能針對硬件變化進行結(jié)構(gòu)與功能上的配置,以滿足不同應(yīng)用的需求;
- 3)實時性:嵌入式操作系統(tǒng)主要應(yīng)用于過程控制、數(shù)據(jù)采集、傳輸通信、多媒體信息及關(guān)鍵要害領(lǐng)域需要迅速響應(yīng)的場合,所以對實時性要求較高;
- 4)可靠性:系統(tǒng)構(gòu)件、模塊和體系結(jié)構(gòu)必須達到應(yīng)有的可靠性,對關(guān)鍵要害應(yīng)用還要提供容錯和防故障措施;
- 5)易移植性:為了提高系統(tǒng)的易移植性,通常采用硬件抽象層和板級支撐包的底層設(shè)計技術(shù)。
-
存儲管理之頁式、段式、段頁式存儲 以及 優(yōu)缺點,頁式存儲、段式存儲、段頁式存儲
Note:- 頁式管理:
- 優(yōu)點:沒有外碎片,每個內(nèi)碎片不超過頁的大小。
- 缺點:程序全部裝入內(nèi)存,要求有相應(yīng)的硬件支持,如地址變換機構(gòu)缺頁中斷的產(chǎn)生和選擇淘汰頁面等都要求有相應(yīng)的硬件支持。增加了機器成本和系統(tǒng)開銷。
- 段式管理:
- 優(yōu)點:可以分別編寫和編譯,可以針對不同類型的段采取不同的保護,可以按段為單位來進行共享,包括通過動態(tài)鏈接進行代碼共享。
- 缺點:會產(chǎn)生碎片。
- 段頁式管理:
- 優(yōu)點:段頁式管理是段式管理和頁式管理相結(jié)合而成,具有兩者的優(yōu)點。
- 缺點:由于管理軟件的增加,復(fù)雜性和開銷也增加。另外需要的硬件以及占用的內(nèi)存也有所增加,使得執(zhí)行速度下降。
- 頁式管理:
-
文件管理-索引文件結(jié)構(gòu)
Note:
假設(shè)在采用索引節(jié)點管理的某文件系統(tǒng)中,磁盤索引塊和磁盤數(shù)據(jù)塊大小均為1KB,每個文件索引節(jié)點有8個地址項:iaddr[0]~iaddr[7],每個地址項為4B,其中- iaddr[0]~iaddr[4]為直接地址索引,每個直接索引地址指向一個磁盤數(shù)據(jù)塊,共5個磁盤索引塊;
- iaddr[5]~iaddr[6]為一級間接地址(的起始)索引,即每個一級間接地址索引指向一個磁盤索引塊,該磁盤索引塊可以劃分成1024/4=256個間接索引地址,每個間接索引地址指向1個磁盤數(shù)據(jù)塊,因此兩個一級間接地址索引實際上間接指向了2 * 256 = 512個磁盤索引塊;
- iaddr[7]為二級間接地址(的起始)索引(指向一級間接地址索引),即每個一級間接地址索引指向一個磁盤索引塊,每個磁盤索引塊又分成256個一級間接地址,存放著二級間接地址索引,每個二級間接地址索引指向一個磁盤索引塊,每個磁盤索引塊又分成256個二級間接地址,每個二級間接地址指向1個磁盤數(shù)據(jù)塊,因此對于該文件的地址項iaddr[7],最多可以指向256 * 256 = 65535個磁盤數(shù)據(jù)塊。
由于每個磁盤數(shù)據(jù)塊大小均為1KB,因此該文件的最大長度是(5 + 512 + 65535)* 1KB
-
磁盤尋道調(diào)度算法(FCFS, SSTF, SCAN, CSCAN)
Note:- 文件的存取時間 = 尋道時間 + 等待時間,尋道時間是指磁頭移動到磁道所需的時間;等待時間為等待讀寫的扇區(qū)轉(zhuǎn)到磁頭下方所用的旋轉(zhuǎn)延遲時間。
三、數(shù)據(jù)庫系統(tǒng)
-
笛卡爾積(非等值連接,左表一條元組拼接右表所有元組),等值連接,自連接,非等值連接,外連接的原理
-
自然連接(兩表相同列名自然等值拼接) & 等值連接
-
內(nèi)連接(有條件)、自然連接(無條件)、外連接的區(qū)別
-
一文搞懂候選碼、主碼、全碼、外碼、主屬性、主鍵、主關(guān)鍵字、非主屬性清晰總結(jié)(候選碼(畫圖后)可以遍歷所有屬性), 數(shù)據(jù)庫的規(guī)范理論
-
SQL 形式化語言——關(guān)系代數(shù)(?為自然連接,σ為選擇(select),Π為投影(where))
-
數(shù)據(jù)庫范式 & 模式分解 詳細介紹(1NF,2NF,3NF,BCNF,4NF), 數(shù)據(jù)庫的規(guī)范理論
Note:- 函數(shù)依賴:
- 如果碼為(A,B),A,B →\rightarrow→ 非主屬性E,則非主屬性E完全函數(shù)依賴于(A,B)
- 如果碼為(A,B),B →\rightarrow→ 非主屬性C,D,則非主屬性C,D部分函數(shù)依賴于(A,B)
- 如果碼為A,存在A->BC,B->D,A->D,則非主屬性D傳遞函數(shù)依賴于A
- 數(shù)據(jù)庫范式:
舉個例子,假設(shè)已知表SLC為(Sno - 學生號, Sdept - 部門, Sloc - 學生住處, Cno - 課程編號, Grade - 學生成績)- 1NF:如果一個關(guān)系模式R的所有屬性都是不可分的基本數(shù)據(jù)項,則R∈1NFR \in1NFR∈1NF;
第一范式是對關(guān)系模式的最起碼的要求,不滿足第一范式的數(shù)據(jù)庫模式不能稱為關(guān)系數(shù)據(jù)庫。
上圖中SLC符合1F,原因是 S-L-C的碼為(Sno,Cno),其中:- (Sno,Cno) →\rightarrow→ 決定 →\rightarrow→Grade,則非主屬性Grade完全函數(shù)依賴于(Sno,Cno)
- Sno →\rightarrow→ 決定 →\rightarrow→Sdept和Sloc,則非主屬性Sdept和Sloc部分函數(shù)依賴于(Sno,Cno)
- 2NF的定義為:滿足1NF,非主屬性 完全函數(shù)依賴 于候選碼;
如果去除掉1F圖中的部分函數(shù)依賴,則變成如下:
上圖中SLC符合2F,原因是 S-L-C的碼為(Sno,Cno),其中:- 非主屬性Grade完全函數(shù)依賴于(Sno,Cno)
- 非主屬性Sdept和Sloc部分函數(shù)依賴于(Sno)
- 在S-L中,Sno →\rightarrow→ 決定 →\rightarrow→ Sdept和Sloc,非主屬性Sdept →\rightarrow→ 決定 →\rightarrow→ Sloc,因此存在Sno →\rightarrow→ Sdept,Sdept →\rightarrow→ Sloc,則非主屬性Sloc傳遞函數(shù)依賴于Sno
- 3NF的定義為:符合2NF,并且消除了非主屬性對于候選碼的 傳遞函數(shù)依賴。
如果去除掉2F圖中S-L的傳遞函數(shù)依賴,則變成如下:
將一個2NF關(guān)系分解為多個3NF的關(guān)系后,仍然不能完全消除關(guān)系模式中的各種異常情況和數(shù)據(jù)冗余。
- 1NF:如果一個關(guān)系模式R的所有屬性都是不可分的基本數(shù)據(jù)項,則R∈1NFR \in1NFR∈1NF;
- 關(guān)系模式規(guī)范化的基本步驟:
- 目的:盡量消除插入、刪除異常,修改復(fù)雜,數(shù)據(jù)冗余;
- 基本思想:逐步消除數(shù)據(jù)依賴中不合適的部分
- 實質(zhì):概念的單一化
- 函數(shù)依賴:
-
關(guān)系模式的范式(帶例題詳細解析):非主屬性和主碼之間是否存在依賴傳遞
-
什么是事務(wù)和事務(wù)回滾?
-
數(shù)據(jù)庫設(shè)計過程(需求階段形成的數(shù)據(jù)字典,數(shù)據(jù)流圖和需求說明文檔是邏輯結(jié)構(gòu)設(shè)計的依據(jù)),數(shù)據(jù)庫設(shè)計的主要步驟
-
三種數(shù)據(jù)模型—層次模型、網(wǎng)狀模型以及關(guān)系模型
Note:- 不同的數(shù)據(jù)模型具有不同的數(shù)據(jù)結(jié)構(gòu)形式。目前最常用的數(shù)據(jù)結(jié)構(gòu)模型有層次模型(hierarchical model)、網(wǎng)狀模型(network model)、關(guān)系模型(relational Model)和面向?qū)ο髷?shù)據(jù)模型(object oriented model)。
- 其中層次模型和網(wǎng)狀模型統(tǒng)稱為非關(guān)系模型(Nosql)。層次數(shù)據(jù)模型只能表示實體之間的1:n的關(guān)系,不能表示m:n的復(fù)雜關(guān)系。而網(wǎng)狀模型結(jié)構(gòu)復(fù)雜,使用不易,隨著應(yīng)用環(huán)境的擴大,數(shù)據(jù)結(jié)構(gòu)越來越復(fù)雜,數(shù)據(jù)的插入、刪除牽動的相關(guān)數(shù)據(jù)太多,不利于數(shù)據(jù)庫的維護和重建。
非關(guān)系模型的數(shù)據(jù)庫系統(tǒng)在20世紀70年代非常流行,在數(shù)據(jù)庫系統(tǒng)產(chǎn)品中占據(jù)了主導(dǎo)地位。到了20年紀80年代,逐漸被關(guān)系模型的數(shù)據(jù)庫系統(tǒng)取代,但某些地方,由于歷史的原因,目前層次和網(wǎng)狀數(shù)據(jù)庫系統(tǒng)仍在使用。 - 關(guān)系模型(sql)是目前最常用的數(shù)據(jù)模型之一。關(guān)系數(shù)據(jù)庫系統(tǒng)采用關(guān)系模型作為數(shù)據(jù)的組織方式,在關(guān)系模型中用二維表格結(jié)構(gòu)表達實體集以及實體集之間的聯(lián)系,其最大特色是描述的一致性。
-
詳解MySQL事務(wù)(超詳細),Mysql的四個隔離級別是如何實現(xiàn)的
Note:- 4大屬性:原子性/一致性/隔離性/持久性;
- 隔離性:當多個事務(wù)并發(fā)執(zhí)行時,任一事務(wù)的更新操作直到其成功提交的整個過程,對其他事務(wù)都是不可見的。
- 不同隔離級別產(chǎn)生的問題:臟讀/不可重復(fù)讀/幻讀
- 臟讀:
對于兩個事務(wù) T1和T2, T1 讀取了已經(jīng)被 T2 更新(update) 但還沒有被提交(commit)的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的( T2 update →\rightarrow→ T1 read →\rightarrow→ T2 rollback ). - 不可重復(fù)讀: 讀兩次前后數(shù)據(jù)變了
對于兩個事務(wù)T1和T2,T1 讀取了一個字段, 然后 T2 更新(update)了該字段之后, T1再次讀取同一個字段, 值就不同了(T1 read →\rightarrow→ T2 update →\rightarrow→ T1 read). - 幻讀: 讀兩次行數(shù)變了
對于兩個事務(wù)T1和T2, T1 從一個表中讀取了一個字段, 然后 T2 在該表中插入了一些新的行之后, 如果 T1 再次讀取同一個表, 就會多出幾行(T1 read →\rightarrow→ T2 insert →\rightarrow→ T1 read)
- 臟讀:
- 4大隔離級別 及 如何實現(xiàn):
- 讀未提交(RU):三個問題都不可以解決
- 所有的讀不加鎖,讀到的數(shù)據(jù)都是最新的數(shù)據(jù),性能最好。
- 所有的寫加行級鎖,寫完釋放。
- 讀已提交(RC使用MVVC技術(shù)實現(xiàn)):可以解決臟讀;
- 寫操作:加行級鎖。事務(wù)開始后,會在UNDO日志中寫入修改記錄,數(shù)據(jù)行中的隱藏列DATA_POLL_PTR存儲指向該行的UNDO記錄的指針。
- 讀操作:不加鎖。在讀取時,如果該行被其它事務(wù)鎖定,則順著隱藏列DATA_POLL_PTR指針,找到上一個有效的歷史記錄(有效的記錄:該記錄對當前事務(wù)可見,且DELETE_BIT=0)。
- 可重復(fù)讀(RR):可以解決臟讀和可重復(fù)讀;
- 寫操作:加行級鎖;讀操作:不加鎖;
- RR讀寫操作和加鎖邏輯和RC相同,都是使用MVVC(多版本并發(fā)控制)技術(shù)實現(xiàn)
- 不同點在于:行記錄對于當前事務(wù)的可見性(可見性:即哪個版本的行記錄對這個事務(wù)是可見的)。RC級別對數(shù)據(jù)的可見性是該數(shù)據(jù)的最新記錄,RR級別對數(shù)據(jù)的可見性是事務(wù)開始時,該數(shù)據(jù)的記錄。
- 串行化:可以解決幻讀(設(shè)置讀鎖(共享鎖)和寫鎖);
- 讀未提交(RU):三個問題都不可以解決
- mysql鎖的分類:
- 按照鎖的粒度可以把鎖分為表級鎖和行級鎖:
- 表級鎖:Mysql中粒度最大的一種鎖,會鎖住當前操作的整張表,并發(fā)性能低,但表鎖的實現(xiàn)簡單,耗費資源少,加鎖快,不會出現(xiàn)死鎖。
- 行級鎖:Mysql中粒度最小的一種鎖,只會鎖住當前操作的數(shù)據(jù)行。行鎖極大地提高了Mysql的并發(fā)性能,但行鎖的開銷較大,速度較慢,會出現(xiàn)死鎖。
- 按照鎖的性質(zhì)可以把鎖分為共享鎖和排它鎖:
- 共享鎖(S鎖):又稱讀鎖,若事務(wù)T對數(shù)據(jù)對象A加上S鎖,其他事務(wù)只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖;其他事務(wù)可以讀取被共享鎖鎖住的數(shù)據(jù)行,不能修改該數(shù)據(jù)行。
- 排他鎖(X鎖):又稱寫鎖。若事務(wù)T對數(shù)據(jù)對象A加上X鎖,該事務(wù)可以讀取和修改該數(shù)據(jù)行,其他事務(wù)不能再對A加任何鎖,直到T釋放A上的鎖。
- 按照鎖的粒度可以把鎖分為表級鎖和行級鎖:
- 4大屬性:原子性/一致性/隔離性/持久性;
四、計算機網(wǎng)絡(luò)
- 傳輸層TCP / UDP知識點總結(jié)
Note:- 傳輸控制協(xié)議(TCP)是面向連接的,提供可靠交付,有流量控制,擁塞控制,提供全雙工通信,面向字節(jié)流,每一條 TCP 連接只能是點對點的(一對一,單播)的傳輸層通信協(xié)議。TCP將用戶數(shù)據(jù)打包成報文段,它發(fā)送后會啟動一個定時器。
- 用戶數(shù)據(jù)報協(xié)議(UDP)是一種不可靠的、無連接的協(xié)議,沒有連接管理能力,不負責重新發(fā)送丟失或出錯的數(shù)據(jù)消息,也沒有流量控制,擁塞控制的功能。它面向報文,支持單播、多播、廣播的交互通信。
- TCP使用的流量控制協(xié)議是 可變大小的滑動窗口協(xié)議。
- URL地址的兩種格式(傳統(tǒng)/Restful),URL的地址格式(Restful 統(tǒng)一了資源接口)
Note:- 一個標準的URL格式如下:協(xié)議://主機名.域名.域名后綴或IP地址(:端口號)/目錄/文件名。
比如http://www.dailynews.com.cn/channel/welcome.htm中,www為主機名,dailynews為本地域名,com為組織域名,cn為最高層域名(表示中國) - RESTful架構(gòu)遵循統(tǒng)一接口原則,不論什么樣的資源,都是通過使用相同的接口進行資源的訪問。接口應(yīng)該使用標準的HTTP方法如GET,PUT和POST。
- 一個標準的URL格式如下:協(xié)議://主機名.域名.域名后綴或IP地址(:端口號)/目錄/文件名。
- 網(wǎng)絡(luò)基礎(chǔ)之沖突域和廣播域,沖突域和廣播域隔離設(shè)備
Note:- 第一層設(shè)備(中繼器,集線器)無法隔離沖突域和廣播域,第二層設(shè)備(網(wǎng)橋,交換機)只能隔離沖突域,第三層設(shè)備(路由器)才能隔離廣播域。
- 交換機能隔離沖突域,交換機的每一個端口就是一個沖突域
- 路由器既能隔離沖突域,又能隔離廣播域。只有路由器能隔離廣播域,因此三個端口對應(yīng)三個廣播域。
- 廣播域可以跨網(wǎng)段,而沖突域只是發(fā)生在同一個網(wǎng)段的。沖突域是基于第一層(物理層),而廣播域是基于第二層(數(shù)據(jù)鏈路層)
- ftp 20 和 21端口,常見的網(wǎng)絡(luò)端口及對應(yīng)服務(wù)
- IP地址的分類 & 子網(wǎng)劃分 & 私有地址
- IPv4到IPv6的過渡方案和機制,從IPv4 到 IPv6 的過渡技術(shù)
Note:- 如果一臺主機同時支持IPv6和IPv4兩種協(xié)議,那么該主機既能與支持IPv4協(xié)議的主機通信,又能與支持IPv6協(xié)議的主機通信,則IPv6和IPv4節(jié)點可以通過雙協(xié)議棧技術(shù)實現(xiàn)通信。
- 局部的IPv6網(wǎng)絡(luò)通過IPv4骨干網(wǎng)絡(luò)相連,如果要讓 IPv6節(jié)點和IPv4網(wǎng)絡(luò) 進行通信,必須使用隧道技術(shù)。
- IPv6節(jié)點與IPv4節(jié)點的通信時需借助于中間的協(xié)議轉(zhuǎn)換服務(wù)器(翻譯技術(shù)),此協(xié)議轉(zhuǎn)換服務(wù)器的主要功能是把網(wǎng)絡(luò)層協(xié)議頭進行IPv6/IPv4間的轉(zhuǎn)換,以適應(yīng)對端的協(xié)議類型。
- IPV6(21282^{128}2128)的地址空間是IPV4(2322^{32}232)的2962^{96}296倍
- 常見網(wǎng)絡(luò)協(xié)議
- 網(wǎng)絡(luò)協(xié)議知識點匯總
- 默認路由,主機路由,網(wǎng)絡(luò)路由
- 網(wǎng)關(guān)、默認路由、特定選擇路由
- MAC地址的分類(單播,組播,廣播)
- 路由和交換機的區(qū)別
Note:- 交換機通過MAC表,進行局域網(wǎng)內(nèi)網(wǎng)數(shù)據(jù)的轉(zhuǎn)發(fā)和過濾;路由器用于連接局域網(wǎng)和外網(wǎng),通過路由表尋址和轉(zhuǎn)發(fā)。
- 路由器內(nèi)集成了交換機的功能(路由器可以用來搭建WLAN),但不足之處是可擴展的接口不如交換機多,而且交換機通常由硬件加速轉(zhuǎn)發(fā),路由器主要靠軟件尋址,速度慢。
- VLAN的概述與優(yōu)勢
Note:- VLAN允許邏輯地劃分網(wǎng)段
- 控制網(wǎng)絡(luò)的廣播風暴(并不是減少廣播域的數(shù)量)
- 確保網(wǎng)絡(luò)安全
- 簡化網(wǎng)絡(luò)管理
- WLAN的優(yōu)勢和缺點
- 無線局域網(wǎng)技術(shù)概述(Wireless LANs)——802.11協(xié)議
- CSMA/CD協(xié)議詳解,CSMA/CD協(xié)議詳解1
- CSMA/CA協(xié)議詳解,CSMA/CD與CSMA/CA比較
- 子網(wǎng)劃分
- 子網(wǎng)劃分詳解與子網(wǎng)劃分實例精析
- Nat網(wǎng)絡(luò)地址轉(zhuǎn)換,NAT百科
- ARP 協(xié)議工作原理(request時發(fā)送廣播幀,response時發(fā)送單播幀,如果存在環(huán)路,會出現(xiàn)廣播風暴)
- 簡單網(wǎng)絡(luò)管理協(xié)議SNMP(SNMP是TCP/IP協(xié)議簇中的應(yīng)用層協(xié)議,采用UDP封裝報文段)
- 綜合布線系統(tǒng)基礎(chǔ),綜合布線系統(tǒng)
Note:- 綜合布線系統(tǒng)由六個子系統(tǒng)組成,分別是:工作區(qū)子系統(tǒng)、水平子系統(tǒng)、管理間子系統(tǒng)、垂直子系統(tǒng)、設(shè)備間子系統(tǒng)、建筑群子系統(tǒng)(園區(qū)子系統(tǒng))。
- CRC(循環(huán)冗余校驗),CRC校驗原理及步驟
- 域名解析全過程
Note:
域名解析過程:(假設(shè)域名為www.baidu.com)- 先在HOSTS表或者本地主存中的DNS緩存中查詢
- 如果沒有,再通過遞歸查詢查找本地DNS服務(wù)器
- 如果還沒找到,本地DNS服務(wù)器通過迭代查詢查找根域名服務(wù)器,根域名服務(wù)器返回.com域的頂級域名服務(wù)器;
接著本地域名服務(wù)器向.com的頂級域名服務(wù)器發(fā)出請求,返回baidu.com權(quán)限域名服務(wù)器;
本地域名服務(wù)器向baidu.com權(quán)限域名服務(wù)器發(fā)送請求,得到了www.baidu.com的IP地址。
五、信息安全
-
淺談常見的七種加密算法及實現(xiàn),參考加密,簽名,token解釋及場景分析,摘要算法和加密算法區(qū)別
Note:-
摘要算法和加密算法是不同的:
- 摘要算法:用于生成簽名,而簽名主要用于身份驗證。簽名的生成方式通過密鑰 + 時間 +消息內(nèi)容 + 自定義算法(比如抽取消息內(nèi)容中截取一些字符)來生成。
摘要算法只能用于對數(shù)據(jù)的單項運算,無法還原被摘要源數(shù)據(jù),其特點為定長輸出、雪崩效應(yīng)(少量消息位的變化會引起信息摘要的許多位變化)。摘要算法有三個特性,一是不可逆,即無法從摘要算法的輸出推出輸入;二是唯一,即在同一種摘要算法下,不同的輸入一定會產(chǎn)生不同的輸出;三是輸出結(jié)果長度固定。基于以上特性,摘要算法通常用來判斷某個消息在傳輸過程中是否被改變,這里的改變包括惡意篡改和噪聲。
簡單理解,配合密鑰的摘要算法(參考token驗證過程)將明文處理成密文,密文作為簽名用于比較驗證,無法處理成明文。 - 加密算法:加密是對數(shù)據(jù)進行機密性保護,過程是發(fā)送者對明文進行加密,接收者對密文進行解密的過程。
- 摘要算法:用于生成簽名,而簽名主要用于身份驗證。簽名的生成方式通過密鑰 + 時間 +消息內(nèi)容 + 自定義算法(比如抽取消息內(nèi)容中截取一些字符)來生成。
-
Token也是基于簽名的,是在服務(wù)器端和客戶端進行發(fā)送的,比如說服務(wù)器用HMAC-SHA256算法(信息摘要算法),加上一個密鑰(加密算法), 對用戶名的數(shù)據(jù)(通常對userId)做一個簽名,并將“數(shù)據(jù) + 簽名”作為token保存在客戶端的cookies中。
在驗證的時候,客戶端通過cookies向服務(wù)端發(fā)送token,服務(wù)端會使用私鑰對數(shù)據(jù)部分進行解密得到新的簽名,并與原token中的簽名進行比較,如果相等則驗證通過,如果不等說明數(shù)據(jù)已被篡改。參考加密,簽名,token解釋及場景分析,cookie、session與token的真正區(qū)別
-
RSA是非對稱加密算法;SHA-1與MD5屬于信息摘要算法(不屬于加密算法);RC-5屬于對稱加密算法。
-
這些算法中SHA-1與MD5是不能用來加密數(shù)據(jù)的,而RSA由于效率問題,一般不直接用于大量的明文加密,適合明文加密的,也就只有RC-5了。
-
-
對稱加密、非對稱加密、摘要算法介紹
Note:- 公開密鑰加密(public-key cryptography),也稱為非對稱加密(asymmetric cryptography),一種密碼學算類型,在這種密碼學方法中,需要一對密鑰,一個是私人密鑰,另一個則是公開密鑰。
常見的公鑰加密算法有:RSA、EIGamal、背包算法、Rabin(RSA的特例)、迪菲-赫爾曼密鑰交換協(xié)議中的公鑰加密算法、橢圓曲線加密算法(Elliptic Curve Cryptography,ECC);
DSA數(shù)字簽名(又稱公鑰數(shù)字簽名), 將摘要信息用發(fā)送者的私鑰加密,接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,也是屬于公開密鑰加密算法。 - DES是典型的私鑰加密體制,屬于對稱加密,不屬于公開秘鑰加密,所以本題選擇D選項。
- 公開密鑰加密(public-key cryptography),也稱為非對稱加密(asymmetric cryptography),一種密碼學算類型,在這種密碼學方法中,需要一對密鑰,一個是私人密鑰,另一個則是公開密鑰。
-
什么是數(shù)字簽名?(數(shù)字簽名又稱公鑰數(shù)字簽名)
Note:- 數(shù)字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。數(shù)字簽名用到了非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)。
- IDEA,DES和RC4算法都是對稱加密算法(私鑰加密體制),只能用來進行數(shù)據(jù)加密。
- MD5算法是消息摘要算法,只能用來生成消息摘要,無法進行數(shù)字簽名。
- RSA算法是典型的非對稱加密算法,主要具有數(shù)字簽名和驗證的功能。
-
數(shù)字證書及CA詳解
Note:- 某電子商務(wù)網(wǎng)站向CA申請了數(shù)字證書,用戶可以通過使用 CA的公鑰 驗證 CA的簽名 的真?zhèn)蝸泶_定該網(wǎng)站的合法性。
- 1)網(wǎng)站向機構(gòu)發(fā)送公鑰;
2)機構(gòu)對網(wǎng)站發(fā)過來的公鑰用私鑰對其加上數(shù)字簽名(即數(shù)字證書 = 網(wǎng)站公鑰 + 機構(gòu)在網(wǎng)站公鑰上做的數(shù)字簽名);
3)接著用戶獲得了網(wǎng)站的數(shù)字簽名證書和網(wǎng)站的公鑰,利用機構(gòu)提供的公鑰對數(shù)字簽名進行解密,將解密后的結(jié)果與數(shù)字證書中網(wǎng)站所提供的原始公鑰進行匹配,驗證網(wǎng)站的公鑰的合法性。
4)用戶先使用網(wǎng)站提供的公鑰對消息進行加密,再向網(wǎng)站發(fā)送消息。
5)網(wǎng)站收到用戶發(fā)過來的密文之后,使用私鑰進行解密。 - 數(shù)字簽名中應(yīng)該沒用到摘要算法,否則用戶無法使用CA的公鑰對CA密鑰加密后的數(shù)字簽名進行解密。
- 某電子商務(wù)網(wǎng)站向CA申請了數(shù)字證書,用戶可以通過使用 CA的公鑰 驗證 CA的簽名 的真?zhèn)蝸泶_定該網(wǎng)站的合法性。
-
PPP與PPPoe
Note:- PPP的簡介:
1、PPP的NCP可以承載多種協(xié)議的三層數(shù)據(jù)包。
2、PPP使用LCP控制多種鏈路的參數(shù)(建立、認證、壓縮、回撥) - PPP的認證類型
1、PPP的pap認證是通過二次握手建立認證(明文不加密)
2、PPP的chap質(zhì)詢握手認證協(xié)議,通過三次握手建立認證(密文采用MD5加密)
3、PPP的雙向驗證,采用的是chap的主驗證風格
4、PPP的加固驗證,采用的是兩種(pap,chap)驗證同時使用
- PPP的簡介:
-
公開密鑰 和 共享密鑰
-
防火墻技術(shù) - 百度百科
-
防火墻技術(shù)(包過濾)
Note:- 防火墻是位于兩個(或多個)網(wǎng)絡(luò)間,實施網(wǎng)絡(luò)間訪問控制的一組組件的集合,它是一套建立在內(nèi)外網(wǎng)絡(luò)邊界上的過濾封鎖機制。防火墻的主要功能有:過濾掉不安全服務(wù)和非法用戶;控制對特殊站點的訪問;提供了監(jiān)視Internet安全和預(yù)警的方便端點。
- 漏洞掃描系統(tǒng)通常是指基于漏洞數(shù)據(jù)庫,通過掃描等手段,對指定的遠程或者本地計算機系統(tǒng)的安全脆弱性進行檢測,發(fā)現(xiàn)可利用的漏洞的,利用漏洞掃描系統(tǒng)可以獲取某FTP服務(wù)器中是否存在可寫目錄的信息。
- 入侵檢測是防火墻的合理補充,幫助系統(tǒng)對付網(wǎng)絡(luò)攻擊,擴展了系統(tǒng)管理員的安全管理能力(包括安全審計、監(jiān)視、進攻識別和響應(yīng)),提高了信息安全基礎(chǔ)結(jié)構(gòu)的完整性。它從計算機網(wǎng)絡(luò)系統(tǒng)中的若干關(guān)鍵點收集信息,并分析這些信息,看網(wǎng)絡(luò)中是否有違反安全策略的行為和遭到襲擊的跡象。入侵檢測被認為是防火墻之后的第二道安全閘門,在不影響網(wǎng)絡(luò)性能的情況下能對網(wǎng)絡(luò)進行監(jiān)測,從而提供對內(nèi)部攻擊、外部攻擊和誤操作的實時保護。
- 病毒防御系統(tǒng)是一個用來防止黑客、病毒、木馬的防御系統(tǒng)。
-
計算機病毒的6大特征
Note:- 病毒的特性:計算機病毒的特性包括隱蔽性、傳染性、潛伏性、觸發(fā)性和破壞性等
- 感染特洛伊木馬后的典型現(xiàn)象是有未知程序試圖建立網(wǎng)絡(luò)連接。
-
計算機病毒分類
Note:- 引導(dǎo)區(qū)病毒:破壞引導(dǎo)盤和文件目錄。
- 宏病毒:宏病毒感染的對象是使用某些程序創(chuàng)建的文本文檔、數(shù)據(jù)庫、電子表格等文件,比如破壞office相關(guān)文件,一般感染以doc為后綴名的文件。
- 特洛伊木馬病毒:特洛伊木馬是一種秘密潛伏且能夠通過遠程網(wǎng)絡(luò)進行控制的惡意程序。控制者可以控制被秘密植入木馬的計算機的一切動作和資源,是惡意攻擊者竊取信息的工具。比如X臥底,冰河。
- 蠕蟲病毒:蠕蟲程序駐于一臺或多臺機器中,它會掃描其他機器是否有感染同種計算機蠕蟲,如果沒有,就會通過其內(nèi)建的傳播手段進行感染,以達到使計算機癱瘓的目的。比如紅色代碼、愛蟲病毒、熊貓燒香、Nimda病毒、愛麗茲病毒、震網(wǎng)病毒,歡樂時光等。
-
DDOS - 分布式拒絕服務(wù)攻擊
Note:- 拒絕服務(wù)(DOS): 對信息或其它資源的合法訪問被無條件地阻止。
- 會話攔截:未授權(quán)使用一個已經(jīng)建立的會話。
- 修改數(shù)據(jù)命令:截獲并修改網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)命令。
- 系統(tǒng)干涉:指的是攻擊者獲取系統(tǒng)訪問權(quán),從而干涉系統(tǒng)的正常運行,一般可以歸于被動攻擊。
拒絕服務(wù),會話攔截和修改數(shù)據(jù)命令為主動攻擊,系統(tǒng)干涉為被動攻擊。
-
網(wǎng)絡(luò)安全管理(如何進行內(nèi)防內(nèi)控,強化訪問控制策略:訪問控制策略,網(wǎng)絡(luò)權(quán)限控制策略等)
Note:- 加強內(nèi)防內(nèi)控主要通過訪問授權(quán)、安全策略、安全檢查與行為審計等多種安全手段的綜合應(yīng)用來實現(xiàn)。
- 終端接入的數(shù)量影響的是網(wǎng)絡(luò)的規(guī)模、數(shù)據(jù)交換的性能,不是內(nèi)防內(nèi)控關(guān)注的重點。
六、軟件工程
- 軟件開發(fā)過程模型——噴泉模型
- 軟件工程五大模型(瀑布 / 原型 / 漸增 / 螺旋 / 噴泉)
Note:- 螺旋模型考慮風險因素
- 敏捷開發(fā)方法 水晶法/Scrum/ASD(方法論和思想)
Note:- 極限編程是一種輕量級的開發(fā)方法,它提出了四大價值觀:溝通、簡單、反饋、勇氣。五大原則:快速反饋、簡單性假設(shè)、逐步修改、提倡更改、優(yōu)質(zhì)工作。“Extreme”(極限) 是指,對比傳統(tǒng)的項目開發(fā)方式,XP強調(diào)把它列出的每個方法和思想做到極限、做到最好;其它XP所不提倡的,則一概忽略(如開發(fā)前期的整體設(shè)計等)。一個嚴格實施XP的項目,其開發(fā)過程應(yīng)該是平穩(wěn)的、高效的和快速的,能夠做到一周40小時工作制而不拖延項目進度。
- 水晶法強調(diào)經(jīng)常交付,認為每一種不同的項目都需要一套不同的策略、約定和方法論。水晶方法相較于XP,紀律性較弱,但其管理運作與團隊產(chǎn)出相協(xié)調(diào)。
- 并列爭球法(SCRUM)的核心是迭代、增量交付,按照30天進行迭代開發(fā)交付可實際運行的軟件。Scrum開發(fā)流程中的三大角色分別為產(chǎn)品負責人,流程管理員和開發(fā)團隊,開發(fā)方式包括站立會議,任務(wù)看板,計劃紙牌。
- 自適應(yīng)軟件開發(fā)的核心是三個非線性的,重迭的開發(fā)階段:猜測、合作、學習。
- 敏捷開發(fā)方法XP的12個最佳實踐
- 數(shù)據(jù)流圖DFD(數(shù)據(jù)字典,結(jié)構(gòu)化分析),軟件工程 – 數(shù)據(jù)流圖的畫法,軟件工程:數(shù)據(jù)流圖和結(jié)構(gòu)圖怎么畫?
Note:- 數(shù)據(jù)流圖概念:
- 數(shù)據(jù)流圖是結(jié)構(gòu)化分析的工具,結(jié)構(gòu)化方法就是采用自頂向下逐層分解的思想進行分析建模的。隨著分解層次的增加,抽象的級別也越來越低,即越來越接近問題的解。
數(shù)據(jù)流圖建模應(yīng)遵循:自頂向下、從抽象到具體的原則。 - 數(shù)據(jù)流圖中的基本圖形元素包括數(shù)據(jù)流、加工、數(shù)據(jù)存儲和外部實體。其中,數(shù)據(jù)流、加工和數(shù)據(jù)存儲用于構(gòu)建軟件系統(tǒng)內(nèi)部的數(shù)據(jù)處理模型,而外部實體表示存在于系統(tǒng)之外的對象,用來幫助用戶理解系統(tǒng)數(shù)據(jù)的來源和去向。
外部實體包括:人/物、外部系統(tǒng)、組織機構(gòu)等。 - 數(shù)據(jù)源的起點和終點(外部實體)用矩形框表示,數(shù)據(jù)處理用圓角框表示,數(shù)據(jù)存儲用棧/隊列表示,數(shù)據(jù)流用箭頭表示。
- 數(shù)據(jù)流圖中的元素在數(shù)據(jù)字典中進行定義。
- 在繪制數(shù)據(jù)流圖時,應(yīng)遵循父圖與子圖平衡的原則,所謂平衡是指父圖的輸入/輸出數(shù)據(jù)流與子圖的輸入/輸出數(shù)據(jù)流一致,有時看起來不一致,但是經(jīng)過查數(shù)據(jù)字典可能發(fā)現(xiàn)是一致的。
- 數(shù)據(jù)流圖是結(jié)構(gòu)化分析的工具,結(jié)構(gòu)化方法就是采用自頂向下逐層分解的思想進行分析建模的。隨著分解層次的增加,抽象的級別也越來越低,即越來越接近問題的解。
- 結(jié)構(gòu)圖概念:
- 結(jié)構(gòu)化設(shè)計方法中使用結(jié)構(gòu)圖來描述軟件系統(tǒng)的體系結(jié)構(gòu),指出一個軟件系統(tǒng)由哪些模塊組成,以及模塊之間的調(diào)用關(guān)系。
- 通常先根據(jù)軟件的功能需求繪制數(shù)據(jù)流圖,在繪制好數(shù)據(jù)流圖之后,分級繪制結(jié)構(gòu)圖。 結(jié)構(gòu)圖的基本成分包括模塊、調(diào)用和數(shù)據(jù)。
- 模塊是指具有一定功能并可以用模塊名調(diào)用的一組程序語句,如函數(shù)、子程序等,它們是組成程序的基本單元。
- 調(diào)用表示模塊之間的關(guān)系,用從一個模塊指向另一個模塊的箭頭來表示,其含義是前者調(diào)用了后者。
- 數(shù)據(jù)是指模塊調(diào)用過程中來回傳遞的信息,用帶注釋的短箭頭表示。
- 數(shù)據(jù)流圖概念:
- 集成測試 - 自頂向下 & 自底向上(樁函數(shù)模擬未開發(fā)的函數(shù))
- 樁程序
- 軟件測試—白盒測試(先畫流程圖,再考慮路徑覆蓋還是語句覆蓋),參考語句覆蓋、條件覆蓋(分支覆蓋)、判定覆蓋、條件-判定覆蓋、組合覆蓋、路徑覆蓋 的區(qū)別
Note:- 路徑覆蓋:覆蓋被測試程序中所有可能的路徑。
- 條件覆蓋:每一個判定語句中每個邏輯條件的各種可能的取值至少滿足一次(條件語句覆蓋,每個判定中包含多個條件,eg: a > 0 && b > 0)。
- 分支覆蓋:又叫做判定覆蓋,被測程序每個判定表達式至少獲得一次“真”值和“假”值。
- 語句覆蓋:被測試程序中的每條語句至少執(zhí)行一次。
- 模塊的作用范圍與控制范圍
- McCabe度量法
Note:- 在2017年上半年軟件設(shè)計師上午試卷36題中,對于路徑個數(shù)的計算,即計算從開始節(jié)點出發(fā)到結(jié)束節(jié)點的路徑個數(shù)(這里計算共4條),而MaCabe度量法計算環(huán)路復(fù)雜度時,開始和結(jié)束節(jié)點納入節(jié)點個數(shù)的計算中(即13 - 11 + 2 = 4)。
- 如果題目只提供代碼,不要忘了將每一個語句看成是一個節(jié)點,并補充畫上“開始”和“結(jié)束”節(jié)點。
- 軟件工程中的所有耦合類型,軟件設(shè)計模塊之間7種耦合關(guān)系,7大內(nèi)聚類型(模塊的聯(lián)系程度)
Note:- 7大內(nèi)聚類型:
- 1)功能內(nèi)聚:完成一個單一功能,各個部分協(xié)同工作,缺一不可。
- 2)順序內(nèi)聚:處理元素相關(guān),而且必須順序執(zhí)行
- 3)通信內(nèi)聚:所有處理元素集中在一個數(shù)據(jù)結(jié)構(gòu)的區(qū)域上
- 4)過程內(nèi)聚:處理元素相關(guān),而且必須按特定的次序執(zhí)行
- 5)瞬時內(nèi)聚(時間內(nèi)聚):所包含的任務(wù)必須在同一時間間隔內(nèi)執(zhí)行。
- 6)邏輯內(nèi)聚:完成邏輯上相關(guān)的一組任務(wù)。
- 7)偶然內(nèi)聚(巧合內(nèi)聚):完成一組沒有關(guān)系或松散關(guān)系的任務(wù)(不是內(nèi)容內(nèi)聚)
- 7大耦合類型(傳參3,直接訪問3):
根據(jù)耦合性從低到高為:非直接耦合、數(shù)據(jù)耦合、標記耦合、控制耦合、外部耦合、公共耦合和內(nèi)容耦合。- 1)非直接耦合:彼此間沒有直接關(guān)系,而是通過主模塊調(diào)用來建立兩模塊間的聯(lián)系;
- 2)數(shù)據(jù)耦合:彼此間通過參數(shù)傳遞進行信息交換;
- 3)標記耦合:彼此間通過 參數(shù)表(數(shù)據(jù)結(jié)構(gòu)) 傳遞進行信息交換
- 4)控制耦合:模塊A通過傳遞標志變量參數(shù)(flag,或者叫做控制變量),來控制模塊B執(zhí)行某一個功能。
- 5)外部耦合:一組模塊訪問同一個全局變量(非全局數(shù)據(jù)結(jié)構(gòu))
- 6)公共耦合:一組模塊訪問同一個公共數(shù)據(jù)環(huán)境(全局數(shù)據(jù)結(jié)構(gòu),共享通信區(qū)等)
- 7)內(nèi)容耦合:模塊A 直接訪問模塊B的內(nèi)部數(shù)據(jù);一個模塊不通過正常入口轉(zhuǎn)到另一個模塊內(nèi)部;兩個模塊有一部分程序代碼重疊;一個模塊有多個入口。
- 軟件設(shè)計原則始終強調(diào)高內(nèi)聚、低耦合的設(shè)計原則,具體包括:
1)保持模塊的大小適中
2)盡可能減少調(diào)用的深度
3)多扇入,少扇出:
扇入是指該模塊被多少個上級模塊給調(diào)用,扇入大表示模塊的復(fù)用程度高。
扇出是指該模塊直接調(diào)用的下級模塊的個數(shù),扇出大表示模塊的復(fù)雜度高,需要控制和協(xié)調(diào)過多的下級模塊。參考什么是扇入和扇出?
4)單入口,單出口:
單入口單出口指為了保證開發(fā)程序的質(zhì)量,要求過程中的數(shù)據(jù)流控制是必須在固定的程序段入口進入, 固定的出口返回,不允許在編程中隨意使用數(shù)據(jù)。參考什么是單入口單出口
5)模塊的作用域應(yīng)該在模塊之內(nèi)
6)功能應(yīng)該是可以被預(yù)測的。 - 耦合性也叫塊間聯(lián)系,指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量。
模塊間耦合的高低取決于模塊間接口的復(fù)雜性,調(diào)用的方式以及傳遞的信息(模塊被調(diào)用的次數(shù)),并不取決模塊的功能數(shù)。
- 7大內(nèi)聚類型:
- 軟件容錯技術(shù)(恢復(fù)能力) - (實現(xiàn)容錯的主要手段是冗余)
- 冗余技術(shù) - 結(jié)構(gòu) / 時間 /信息冗余
- 軟件調(diào)試的具體方法(演繹法,歸納法等)
- CMM(軟件能力成熟度模型)
Note:- 初始級(無管理,無定義):
- 對于軟件的管理制度較為缺乏,過程缺乏定義。
- 可重復(fù)級(有管理制度):
- 管理制度化,建立了基本的管理制度以及規(guī)程,管理工作有章可循。
- 已定義級(有評審制度):
- 在開發(fā)的過程中,技術(shù)工作以及管理工作開始文檔化和標準化。采用了評審的制度保證了軟件質(zhì)量(關(guān)注過程的組織標準化和部署)。
- 已管理級(有數(shù)據(jù)分析,產(chǎn)品質(zhì)量監(jiān)控過程):
- 能夠制訂效率目標并且收集和測試,可以利用統(tǒng)計數(shù)據(jù)進行相應(yīng)的改進,對于軟件進程以及產(chǎn)品質(zhì)量有定量的理解和控制(過程制度化)。
- 優(yōu)化級(過程優(yōu)化):
持續(xù)改進軟件的過程,效率以及質(zhì)量都穩(wěn)步提升。
- 初始級(無管理,無定義):
- 模型驅(qū)動技術(shù)
- 軟件維護類型
Note:- 改正性維護是指改正在系統(tǒng)開發(fā)階段已發(fā)生而系統(tǒng)測試階段尚未發(fā)現(xiàn)的錯誤(維護工作量的17%~21%)。
- 適應(yīng)性維護是指使用軟件適應(yīng)信息技術(shù)變化和管理需求變化而進行的修改(維護工作量的18%~25%)。
- 完善性維護是為擴充功能和改善性能而進行的修改,主要是指對已有的軟件系統(tǒng)增加一些在系統(tǒng)分析和設(shè)計階段中沒有規(guī)定的功能與性能特征(維護工作量的50%~60%)。
- 預(yù)防性維護為了改進應(yīng)用軟件的可靠性和可維護性,為了適應(yīng)未來的軟硬件環(huán)境的變化,應(yīng)主動增加預(yù)防性的新的功能,以使應(yīng)用系統(tǒng)適應(yīng)各類變化而不被淘汰(維護工作量的4%)。
- 軟件維護工具(版本控制/文檔分析/開發(fā)信息庫/逆向工程/再工程,不包括配置管理)
- 軟件可靠性和可用性的區(qū)別(可靠性強調(diào)在時間間隔內(nèi)有效,可用性強調(diào)在某時刻有效)
Note:- 軟件產(chǎn)品的可靠性指的是:軟件產(chǎn)品與在規(guī)定的一段時間內(nèi)和規(guī)定的條件下維持其性能水平有關(guān)的能力,是一個系統(tǒng)對于給定時間間隔內(nèi)、在給定條件下無失效運作的概率。它的子特性包括:成熟性、容錯性、易恢復(fù)性
- 對于軟件可靠性與軟件潛在錯誤的數(shù)量、位置有關(guān),并且與軟件產(chǎn)品的使用方式有關(guān),對于軟件產(chǎn)品的開發(fā)方式并不能決定軟件產(chǎn)品的可靠性。
- 若MTTF和MTTR分別表示平均無故障時間和平均修復(fù)時間,則可用公式MTTF / (1 + MTTF)計算軟件可靠性;MTBF/(1+MTBF)可以用來度量可用性;1/(1+MTTR)可以用來度量可維護性。參考MTTR、MTTF、MTBF詳解
- 計算機系統(tǒng)是一個復(fù)雜的系統(tǒng),而且影響其可靠性的因素也非常繁復(fù),很難直接對其進行可靠性分析。參考預(yù)測可靠性模型公式_《可靠性設(shè)計》—可靠性預(yù)計與分配
- 若采用串聯(lián)方式,則系統(tǒng)可靠性為每個部件的乘積 R=R1×R2×R3×...×RnR=R_1 \times R_2 \times R_3 \times...\times R_nR=R1?×R2?×R3?×...×Rn?;
- 若采用并聯(lián)方式,則系統(tǒng)的可靠性為R=1?(1?R1)×(1?R2)×(1?R3)×...×(1?Rn)R=1-(1- R_1)\times(1-R_2)\times(1-R_3)\times...\times(1-R_n)R=1?(1?R1?)×(1?R2?)×(1?R3?)×...×(1?Rn?)。
- 若采用串并聯(lián)方式(假設(shè)兩個并聯(lián)1個串聯(lián)),則系統(tǒng)可靠性為(1?(1?R)2)×R×(1?(1?R)2)(1 - (1 - R)^2) \times R \times(1 - (1 - R)^2)(1?(1?R)2)×R×(1?(1?R)2)
- 軟件相關(guān)文檔匯總
Note:- 概要設(shè)計說明書:主要說明系統(tǒng)的功能分配、模塊劃分、程序的總體結(jié)構(gòu)、I/O及接口設(shè)計、運行設(shè)計、數(shù)據(jù)結(jié)構(gòu)設(shè)計,數(shù)據(jù)庫設(shè)計和錯誤處理設(shè)計等內(nèi)容;(結(jié)構(gòu)圖)
- 詳細設(shè)計說明書:著重描述每個模塊是如何實現(xiàn)的,對模塊內(nèi)的數(shù)據(jù)結(jié)構(gòu)進行設(shè)計,對數(shù)據(jù)庫進行物理設(shè)計,對每個模塊進行詳細的算法設(shè)計,代碼設(shè)計、輸入輸出設(shè)計、用戶界面設(shè)計等其他設(shè)計;
- 用戶手冊:幫助用戶了解軟件的使用,需要描述軟件的功能、性能和用戶界面;
- 用戶需求說明書:是開發(fā)人員和用戶經(jīng)過充分溝通后對軟件需求的共同理解,主要說明軟件的功能、性能和運行環(huán)境等內(nèi)容。
- 軟件評審(管理評審,技術(shù)評審,文檔評審和過程評審)
Note:- 技術(shù)評審的輸入內(nèi)容包括需求文檔、源代碼、測試用例等,技術(shù)評審的輸出是技術(shù)評審報告。
- 正式的技術(shù)評審FTR(Formal Technical Review)是軟件工程師組織的軟件質(zhì)量保證活動,技術(shù)評審的指導(dǎo)原則是
- 評審軟件產(chǎn)品,不要涉及對軟件生產(chǎn)者能力的評價;
- 評審前要制定嚴格的評審計劃,并嚴格遵守預(yù)計的日程安排;
- 對評審中出現(xiàn)的問題要記錄在案,不要過多地討論解決方案,把問題留給軟件生產(chǎn)者來解決:
- 要限制參與者人數(shù),并要求參加評審的人員在評審會之前仔細閱讀文檔,做好充分的準備。
- 軟件設(shè)計的質(zhì)量評審包括(不包括功能與模塊之間的對應(yīng)關(guān)系):
- 評價軟件的規(guī)格說明是否合乎用戶的要求,即總體設(shè)計思想和設(shè)計方針是否正確。
- 評審可靠性,即是否能避免輸入異常(錯誤或超載等)、硬件失效及軟件失效所產(chǎn)生的失效,一旦發(fā)生應(yīng)能及時采取代替手段或恢復(fù)手段。
- 評審保密措施實現(xiàn)情況,即是否提供對使用系統(tǒng)資格、對特定數(shù)據(jù)的使用資格及特殊功能的使用資格進行檢查,在查出有違反使用資格情況后,能否向系統(tǒng)管理人員報告有關(guān)信息,是否提供對系統(tǒng)內(nèi)重要數(shù)據(jù)加密的功能。
- 評審操作特性實施情況,即操作命令和操作信息的恰當性,輸入數(shù)據(jù)與輸入控制語句的恰當性,輸出數(shù)據(jù)的恰當性,應(yīng)答時間的恰當性等。
- 評審軟件是否具有可修改性、可擴充性、可互換性和可移植性。
- 評審軟件是否具有可測試性。
- 評審軟件是否具有復(fù)用性。
- 軟件風險和風險管理,PMP之項目風險管理
Note:- 一般認為軟件風險包含兩個特性:不確定性和損失,不確定性即指風險可能發(fā)生也可能不發(fā)生。
- 如果風險可以預(yù)測,可以避免其發(fā)生,有些風險可以預(yù)測但無法避免。
- 風險的優(yōu)先級通常是根據(jù)風險暴露設(shè)定的。
- 風險暴露又稱風險曝光度,測量的是資產(chǎn)的整個安全性風險,它將表示實際損失的可能性與表示大量可能損失的資訊結(jié)合到單一數(shù)字評估中。在形式最簡單的定量性風險分析中,風險曝光度可透過將風險可能性及影響相乘算出。風險曝光度(Risk Exposure) = 錯誤出現(xiàn)率(風險出現(xiàn)率)× 錯誤造成損失(風險損失)。
- ISO/IEC 9126軟件質(zhì)量模型
Note:- ISO/IEC 9126軟件質(zhì)量模型中可靠性質(zhì)量特性是指在規(guī)定的一段時間內(nèi)和規(guī)定的條件下,軟件維護其性能水平有關(guān)的能力。包括的子特性有成熟性、容錯性(故障)和易恢復(fù)性(失效)。
- 易使用性的子特性包括:易學性,易理解性,易性操作性。
- 可維護性的子特性包括:易分析性
- 軟件測試:失效,故障,缺陷,錯誤
Note:- 軟件失效:失效是面向用戶的,軟件在運行時偏離了用戶需求,比如登錄功能失效
- 軟件故障:故障是面向開發(fā)者的,程序在執(zhí)行時輸出錯誤結(jié)果,比如數(shù)組越界,程序崩潰,功能失效等
- 軟件缺陷:軟件缺陷是存在于軟件(文檔、數(shù)據(jù)、程序)之中的那些不希望或不可接受的偏差。缺陷是錯誤的結(jié)果(缺陷是錯誤的表現(xiàn)),缺陷很難捕獲。
當一個軟件缺陷被激活時,便產(chǎn)生一個軟件故障;同一個軟件缺陷在不同條件下被激活,可能產(chǎn)生不同的軟件故障。 - 軟件錯誤:軟件錯誤即人為錯誤,指軟件開發(fā)人員在開發(fā)軟件的過程中無意間犯下的技術(shù)錯誤。
- 四者的因果關(guān)系(->表示導(dǎo)致):錯誤 -> 缺陷 -> 故障 -> 失效
- 決策表是什么?怎么使用決策表?(條件和事件豎著來標識,對于事件相同但條件不同的列可以進行合并,進而計算條件組合數(shù))
- 「軟件項目管理」成本估算模型——Walston-Felix模型 和 COCOMO Ⅱ模型(COCOMO-81包括基本/中級/高級,COCOMO Ⅱ模型中項目估算的三個階段:規(guī)劃 / 設(shè)計/ 開發(fā)階段,不同階段使用不同估算單位)
Note:- IBM模型和基本COCOMO模型為靜態(tài)單變量模型
- Putnam模型為動態(tài)多變量模型(軟件方程和人力增加方程,適合70000行以上的項目)
- 中級COCOMO模型在基本模型中已計算的軟件開發(fā)工作量的基礎(chǔ)上,在用涉及產(chǎn)品、硬件、人員、項目和項目的15個成本驅(qū)動因素來調(diào)整工作量的估算。高級COCOMO模型不但包括中級COCOMO模型的所有特性,而且為上述15個因素在軟件生存周期的不同階段賦予了不同的權(quán)重。
- 人機交互“黃金三原則”(用戶操縱控制、減輕用戶的記憶負擔、保持界面的一致性)
七、面向?qū)ο?/h3>
-
uml邊界類例子_UML中邊界對象、控制對象、實體對象
-
設(shè)計模式的3大類型和6大原則(先判斷是創(chuàng)建型/結(jié)構(gòu)型/行為型,再確定是哪個模式)
-
組件聚合原則(復(fù)用/發(fā)布原則,共同閉包原則,共同復(fù)用原則)
Note:面向?qū)ο?/strong>設(shè)計的幾大原則
- 單一職責原則:在面向?qū)ο笤O(shè)計時,就一個類而言,應(yīng)該僅有一個引起變化的原因。
- 里氏替換原則:子類可以替換父類。
- 依賴倒置原則:要依賴于抽象,而不是具體實現(xiàn);針對接口編程,不要針對實現(xiàn)編程(沒有強調(diào)不強迫客戶依賴于他們不用的方法)。
- 接口分離原則:使用多個專門的接口要比使用單一的總接口要好。不強迫客戶依賴于他們不用的方法,即:依賴于抽象,不依賴于具體,同時在依賴級別不應(yīng)有對于細節(jié)的依賴。
- 開放-封閉原則:對擴展開放,對修改關(guān)閉。
- 共同封閉原則:包中的所有類對于同一性質(zhì)的變化應(yīng)該是共同封閉的。一個變化若對一個包產(chǎn)生影響,則將對該包里的所有類產(chǎn)生影響,而對于其他的包不造成任何影響。
- 共同重用原則:一個包里的所有類應(yīng)該是共同重用的。如果重用了包里的一個類,那么就要重用包中的所有類。
-
JAVA實現(xiàn)23種設(shè)計模式,Java中常用的設(shè)計模式
Note:
- 創(chuàng)建型對象模式:單例模式,簡單工廠模式,抽象工廠模式,生成器模式,原型模式
- 結(jié)構(gòu)型對象模式:組合模式,適配器模式,裝飾者模式,代理模式,外觀模式,橋接模式,享元模式
- 行為型對象模式:策略模式,模板方法模式,觀察者模式,迭代器模式,責任鏈模式,命令模式,備忘錄模式,狀態(tài)模式,訪問者模式,中介者模式,解釋器模式
-
觀察者模式,狀態(tài)模式(行為型),建造者(生成器)模式
-
橋接模式(結(jié)構(gòu)型,接口和實現(xiàn)類),責任鏈模式(行為型),迭代器模式(行為型)
-
組合模式(結(jié)構(gòu)型;部分整體模式;依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次)
Note:
- 原型模式的適用場景:當一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時。
- 工廠模式的適用場景:當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。
- 抽象工廠模式的適用場景:當要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時
- 生成器模式的適用場景:當構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時
-
MVC 模式
-
面向?qū)ο蠓治龅?個活動(識別對象,類定義與類繼承,對象間的通信)
Note:
- 認定對象:在應(yīng)用領(lǐng)域中,按自然存在的實體確立對象。在定義域中,首先將自然存在的“名詞”作為一個對象,這通常是研究問題定義域?qū)嶓w的良好開始。通過實體間的關(guān)系尋找對象常常沒有問題,而困難在于尋找(選擇)系統(tǒng)關(guān)心的實質(zhì)性對象。實質(zhì)性對象是系統(tǒng)穩(wěn)定性的基礎(chǔ)。例如在銀行應(yīng)用系統(tǒng)中,實質(zhì)性對象應(yīng)包含客戶賬務(wù)、清算等,而門衛(wèi)值班表不是實質(zhì)性對象,甚至可不包含在該系統(tǒng)中。
- 組織對象:分析對象間的關(guān)系,將相關(guān)對象抽象成類,其目的是為了簡化關(guān)聯(lián)對象,利用類的繼承性建立具有繼承性層次的類結(jié)構(gòu)。抽象類時可從對象間的操作或一個對象是另一個對象的一部分來考慮;如房子由門和窗構(gòu)成,門和窗是房子類的子類。由對象抽象類,通過相關(guān)類的繼承構(gòu)造類層次,所以說系統(tǒng)的行為和信息間的分析過程是一種迭代表征過程。
- 描述對象的相互作用:描述出各對象在應(yīng)用系統(tǒng)中的關(guān)系。如一個對象是另一個對象的一部分,一個對象與其他對象間的通信關(guān)系等。這樣可以完整地描述每個對象的環(huán)境,由一個對象解釋另一個對象,以及一個對象如何生成另一個對象,最后得到對象的界面描述。
- 確定對象的操作。
- 定義對象的內(nèi)部信息。
識別對象目的是為了定義類,而類可以分為三種:實體類、接口類(邊界類)和控制類,所以一開始就需要對對象進行好好分析,接著組織對象(創(chuàng)建類,類繼承),描述對象相互作用(傳參或者設(shè)置為類屬性)
-
UML中類之間的關(guān)系
Note:
-
類與類之間6種關(guān)系:依賴(帶箭頭的虛線),關(guān)聯(lián)(不帶箭頭的實線),聚合(空心菱形,has a),組合(實心菱形,contain a),泛化 / 繼承(空心三角形,實線),實現(xiàn)(空心三角形,虛線)(在UML中聚合和組合表示容易記錯,這里用諧音來記:聚(ju 類似 zuo)空;組實(主食),因此轉(zhuǎn)化成“做空,主食”來記;兩者的強弱等級也容易記錯,這里可以通過字典序j < z,判斷聚合的關(guān)聯(lián)等級低于組合的等級)
-
聚合和組合的區(qū)別:兩者都是整體和部分之間的關(guān)系,但在聚合關(guān)系中,成員對象可以脫離整體對象而獨立存在,例如,學校與老師的關(guān)系;在組合關(guān)系中,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對象而存在。例如,頭和嘴的關(guān)系
-
類與類之間的6種關(guān)系,按相互聯(lián)系程度由強至弱依次為:繼承/泛化 = 實現(xiàn) > 組合 > 聚合 > 關(guān)聯(lián) > 依賴
-
依賴是通過類方法來調(diào)用,即其他類的對象通過方法參數(shù)與當前類交互;關(guān)聯(lián)是通過類的實例化來創(chuàng)建,即對于兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應(yīng)關(guān)系時(類A對象是類B的成員變量),這兩個對象之間為關(guān)聯(lián)關(guān)系。關(guān)聯(lián)關(guān)系分為單向關(guān)聯(lián)和雙向關(guān)聯(lián),在java中:
- 單向關(guān)聯(lián)表現(xiàn)為:類A當中使用了類B,其中類B是作為類A的成員變量。
- 雙向關(guān)聯(lián)表現(xiàn)為:類A當中使用了類B作為成員變量;同時類B中也使用了類A作為成員變量。
因此組合和聚合也屬于關(guān)聯(lián),只不過組合和聚合強調(diào)類之間的主次關(guān)系(只能在類的設(shè)計階段看出來,僅通過代碼看不了),而關(guān)聯(lián)沒有。組合例子:人和人的生命;聚合例子:筆和筆芯;關(guān)聯(lián)的例子:筆記本和鼠標;參考關(guān)聯(lián),聚合,組合三者之間的關(guān)系
A的某個屬性是類B的一個對象,并且類A對象消失時,類B對象也隨之消失,則類A與類B的關(guān)系應(yīng)為組合關(guān)系。
UML三種關(guān)系簡化為繼承(實現(xiàn),泛化),關(guān)聯(lián)和依賴,參考UML類圖的依賴和關(guān)聯(lián)詳解(含代碼)
-
UML之狀態(tài)圖
Note:
- UML狀態(tài)圖(state diagram) 展現(xiàn)了一個狀態(tài)機,它由狀態(tài)(簡單狀態(tài)和組合狀態(tài))、轉(zhuǎn)換(遷移)、事件和活動組成。
當某個事件(滿足監(jiān)護條件) 發(fā)生后,對象的狀態(tài)將發(fā)生變化。轉(zhuǎn)換是兩個狀態(tài)之間的一種關(guān)系,表示對象將在源狀態(tài)中執(zhí)行一定的事件或動作,并在某個 特定事件發(fā)生而且某個特定的監(jiān)護條件滿足時離開當前狀態(tài)而進入目標狀態(tài)。
由于狀態(tài)可以嵌套,所以活動可以在狀態(tài)內(nèi)執(zhí)行,也可以在狀態(tài)遷移時執(zhí)行。(2019下半年41題) - [tries<3]和tries++分別表示監(jiān)護條件和轉(zhuǎn)換,帶有【】表示限制條件,沒帶【】的具體操作表示一個狀態(tài)到另外一個狀態(tài)的轉(zhuǎn)換。
-
時序圖,時序圖學習2_組成元素之角色和對象
Note:
- 同步消息進行阻塞調(diào)用,調(diào)用者中止執(zhí)行,等待控制權(quán)返回,需要等待返回消息;
- 異步消息的調(diào)用者是發(fā)送消息后繼續(xù)執(zhí)行,不引起調(diào)用者的阻塞,也不必等待返回消息。
- 從圖示中判斷異步消息,就是找沒有實線返回消息的請求消息。
從概念上講,就是不需要等待返回消息就可以去做其他事情的請求消息就是異步消息。有返回消息的就是同步消息。
-
UML圖:活動圖詳細介紹(動作狀態(tài)、活動狀態(tài)、起始點、結(jié)束點、分支與合并、泳道和對象流)
Note:
- 對一個復(fù)雜用例中的業(yè)務(wù)處理流程進行進一步建模的最佳工具是UML活動圖。
- 活動圖 和 狀態(tài)圖的區(qū)別:
- 1)活動圖著重表現(xiàn)從一個活動到另一個活動的控制流,是內(nèi)部處理驅(qū)動的流程,強調(diào)對象間的控制流程。
- 2)狀態(tài)圖著重描述從一個狀態(tài)到另一個狀態(tài)的流程,主要有外部事件的參與。
- 活動圖 和 時序圖的區(qū)別:
- 1)時序圖(順序圖)著重描述處理過程,它的主要控制結(jié)構(gòu)是順序、分支和循環(huán),各個處理之間有嚴格的順序和時間關(guān)系(時序圖中每個參與者都有一條生命線,表示處理的時間段,而且具有循環(huán)分支結(jié)構(gòu))。
- 2)活動圖(流程圖)描述的則是對象活動的順序關(guān)系所遵循的規(guī)則,它著重表現(xiàn)的是系統(tǒng)的行為,而非系統(tǒng)的處理過程。
- 3)活動圖能夠表示并發(fā)活動的情形,時序圖不能。
-
軟考必考題型之UML圖形
Note:UML中提供了多種建模系統(tǒng)需求的圖,體現(xiàn)系統(tǒng)的靜態(tài)方面和動態(tài)方面。
- 類圖(Class Diadram)展現(xiàn)了一組對象、接口、協(xié)作和它們之間的關(guān)系。在面向?qū)ο笙到y(tǒng)的建模中,最常見的就是類圖,它給出系統(tǒng)的靜態(tài)設(shè)計視圖。
- 對象圖(Object Diagram)展現(xiàn)了某一時刻一組對象以及他們之間的關(guān)系
對象圖描述了在類圖中所建立的事物的實例的靜態(tài)快照,給出系統(tǒng)的靜態(tài)設(shè)計視圖或靜態(tài)進程視圖。 - 用例圖(Use Case Diagram)展現(xiàn)了一組用例、參與者(Actor)以及它們之間的關(guān)系。這個視圖主要支持系統(tǒng)的行為,即該系統(tǒng)在它的周邊環(huán)境的語境中所提供的外部可見服務(wù)。用例圖用于對一個系統(tǒng)的需求進行建模,包括說明這個系統(tǒng)應(yīng)該做什么(從系統(tǒng)外部的一個視點出發(fā)), 而不考慮系統(tǒng)應(yīng)該怎樣做。
- 序列圖(順序圖)展示的是一個用例與多個對象的行為(對單個用例圖的擴展)
- 活動圖(activity diagram) 將進程或其他計算結(jié)構(gòu)展示為計算內(nèi)部一步步的控制流和數(shù)據(jù)流。活動圖專注于系統(tǒng)的動態(tài)視圖。它對系統(tǒng)的功能建模和業(yè)務(wù)流程建模特別重要,并強調(diào)對象間的控制流程。
- 交互圖用于對系統(tǒng)的動態(tài)方面進行建模。一張交互圖表現(xiàn)的是一個交互,由一組對象和它們之間的關(guān)系組成,包含它們之間可能傳遞的消息。交互圖表現(xiàn)為通信圖、交互概覽圖和時序圖,每種針對不同的目的,能適用于不同的情況。
- 通信圖是強調(diào)接收和發(fā)送消息的對象的結(jié)構(gòu)組織的交互圖;
- 交互概覽圖強調(diào)控制流的交互圖。
- 時序圖/順序圖(Timing Diagram)關(guān)注沿著線性時間軸、生命線內(nèi)部和生命線之間的條件改變。
系統(tǒng)順序圖和順序圖的區(qū)別參考系統(tǒng)順序圖與順序圖區(qū)別
- 部署圖(Deploy Diagram)是用來對面向?qū)ο笙到y(tǒng)的物理方面(軟件和硬件)建模的方法,展現(xiàn)了運行時處理結(jié)點以及其中構(gòu)件(制品)的配置。
- 組件圖(Component Diagram)展現(xiàn)了一組組件之間的組織和依賴。
- 構(gòu)件應(yīng)是可替換的;
- 構(gòu)件表示的是物理模塊而不是邏輯模塊;
- 構(gòu)件應(yīng)是組成系統(tǒng)的一部分;
- 構(gòu)件與類處于不同的抽象層次;
-
模型驅(qū)動架構(gòu)(模型驅(qū)動分析方法包括 結(jié)構(gòu)化分析,面向?qū)ο蠓治?#xff09;,結(jié)構(gòu)化開發(fā)方法 & 數(shù)據(jù)流圖
-
C++中的public,protected,private繼承機制 - (C++默認使用私有繼承,三者區(qū)別在于 派生類會將父類的成員轉(zhuǎn)換成那種類型 & 對象訪問權(quán)限)
-
java的繼承機制
Note:
- java默認使用私有繼承,因此子類將父類的public,protected方法變成子類的private方法,此時需要重寫父類中的這些public,protected方法,才能讓對象訪問到。
- 對于java的成員屬性和方法,如何不加任何訪問修飾符,通常稱為“default訪問模式“。該模式下,只允許在同一個包中進行訪問,訪問權(quán)限僅次于private。
- 與C++不同的是,java只允許單繼承一個父類,但是接口允許多繼承。
- 抽象類不能直接進行實例化。
- 特殊 / 一般關(guān)系也叫做泛化(Generalization)關(guān)系,可以理解成:特殊元素(即子類對象)是一般元素(即父類對象)的一種特殊體現(xiàn)。
-
java中的public,protected,private,default詳解(對象中的成員是否可訪問)
-
重寫和重載及其區(qū)別
-
參數(shù)多態(tài)、包含多態(tài)、過載多態(tài)和強制多態(tài),C++>多態(tài),強制多態(tài),參數(shù)類型多態(tài),重載多態(tài),包含多態(tài)(運行時多態(tài))
Note:
- 強制多態(tài):強制類型轉(zhuǎn)換
- 過載多態(tài):函數(shù)重載
- 包含多態(tài):子類對父類方法的重寫
- 參數(shù)多態(tài):泛型
- 特定多態(tài)包含 強制多態(tài) 和 重載多態(tài), 通用多態(tài)包含參數(shù)多態(tài) 和 包含多態(tài)。
其中在面向?qū)ο蠓椒ㄖ?#xff0c;動態(tài)綁定是實現(xiàn)多態(tài)的基礎(chǔ)(通過動態(tài)綁定機制,在調(diào)用子類對象方法或?qū)傩詴r,會選擇調(diào)用子類還是父類的方法或?qū)傩?/strong>),換句話說,運行時結(jié)合是動態(tài)綁定(泛化過程的實現(xiàn)),編譯時結(jié)合是靜態(tài)綁定。參考java的動態(tài)綁定機制(不是動態(tài)分配)(2019下半年40題)
八、數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)
- 逆波蘭表達式(后綴表達式)
- Gantt圖與Pert圖 - 關(guān)鍵路徑計算
- 經(jīng)典算法之關(guān)鍵路徑(拓撲結(jié)構(gòu),最早 - 前驅(qū)max,最遲 - 后繼min)
- 計算AOE網(wǎng)關(guān)鍵路徑
Note: -
參考2019下半年第18題,可以先求解關(guān)鍵路徑(最長路徑)確定里程碑節(jié)點,接著利用里程碑節(jié)點子圖,計算"活動BE最多可以晚 ()天開始而不影響工期"
比如關(guān)鍵路徑為:A-B-F-J-L和A-D-G-I-J-L,那么計算BE最晚推遲幾天動工時可以只考慮B-F-J-L和B-E-H-J兩個子圖,發(fā)現(xiàn)(6+5)-(2+2+5) = 2即為答案。
- 最優(yōu)二叉樹(哈夫曼樹)
- 一文詳解:二叉樹之前序遍歷、中序遍歷、后序遍歷(相對root節(jié)點位置而言)
- 二叉排序樹 (平衡二叉排序樹 - 二分查找)
- 平衡二叉樹(判斷非平衡類型,找最小非平衡子樹)
Note: - 在二叉搜索樹下插入新的節(jié)點,并判斷插入到節(jié)點是否導(dǎo)致非平衡,如果非平衡,判斷是屬于哪種類型:LL,RR,LR,RL,其中LL表示新插入的節(jié)點位于根結(jié)點左孩子(L)的左子樹(L)上。
- 從新加入的節(jié)點開始,向上尋找最小非平衡子樹,以子樹的根結(jié)點為基準,使用LL/RR/LR/RL進行調(diào)整。
- 其中LR類型的非平衡可以先通過LL調(diào)整方式,再通過RR調(diào)整方式進行調(diào)整;RL類型可以先通過RR,再通過LL進行調(diào)整。
- 選擇排序為什么不穩(wěn)定
- 最長公共子序列(LCS) - 動態(tài)規(guī)劃
- 回溯法(深搜,全解)和分支限界法(廣搜,一解),分支限界法詳解1,分支定界算法求解線性規(guī)劃問題,分治法 / 動態(tài)規(guī)劃法 / 貪心法 / 回溯法 / 分支限界法的區(qū)別和聯(lián)系以及適用情況
- 鄰接矩陣(稠密圖)/鄰接表(稀疏圖)
- 連通圖、強連通圖、弱連通圖、生成樹、完全圖
Note: - 連通圖:圖中任意兩點之間均至少有一條通路,否則稱為不連通圖
- 強連通圖:在有向圖中, 若對于每一對頂點v1和v2, 都存在一條從v1到v2和從v2到v1的路徑,則稱此圖是強連通圖。
- 強連通和弱連通的概念只在有向圖中存在。
- 六大排序算法:插入/ 希爾 / 選擇 / 冒泡 / 堆 / 快速排序,八大排序算法的比較(歸并排序和堆排序z在最好和最壞的情況下,時間復(fù)雜度都為O(nlgn)),常見排序算法的時間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性比較
Note: - 不同排序算法在時間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性上的比較:
- 為什么說選擇排序是不穩(wěn)定的呢?舉個例子,序列arr = [5 8 5 2 9],我們知道第一遍選擇第1個元素5會和2交換,那么原序列中兩個5的相對前后順序就被破壞了,所以選擇排序是一個不穩(wěn)定的排序算法。參考選擇排序為什么是不穩(wěn)定的?
- 為什么說冒泡排序是穩(wěn)定的呢?因為每次都是從子序列第一個元素開始交換,最終得到子序列最大值,比如8,5(2)交換并不會影響5(1),5(2)的順序。
- 歸并排序可以通過手搖算法將空間復(fù)雜度降到O(1),但是時間復(fù)雜度會提高。
- 基數(shù)排序時間復(fù)雜度為O(N*M),其中N為數(shù)據(jù)個數(shù),M為數(shù)據(jù)位數(shù)
- 希爾排序流程(間隔排序):假設(shè)原始序列為3,7,6,5,4
- 第一趟間隔為 5 / 2 = 2:即分別依次對3,6,4,7,5排序,得到3,4,6和5,7
- 第二趟間隔為 2 / 2 = 1:即對3,4,6,5,7依次進行排序
- 桶排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,假設(shè)按十位數(shù)分為5個桶
- 第一趟:將原始序列逐一放入桶中,序列為:1,4 | 15 | 23,22,24 | 32,31 | 45,47
- 第二趟:對每個桶分別進行排序。
- 基數(shù)排序流程(桶排序的擴展):假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,由于最大只有十位數(shù),因此可以進行兩次桶排序:
- 第一趟對個位數(shù)進行分桶:依次放入1,31 | 32,22 | 23 | 24,4 | 45,15 | 47,得到序列為1,31,32,22,23,24,4,45,15,47
- 第二趟對十位數(shù)進行分桶:依次放入為1,4 | 15 | 22,23,24 | 31,32 | 45,47,輸出即為有序序列
- 快速排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,策略是選擇每個分組中的首元素作為基數(shù),每一趟執(zhí)行順序為:假設(shè)左i右j,循環(huán)依次←\leftarrow←(j--)找比基數(shù)小的值并與i替換,→\rightarrow→(i++)找比基數(shù)大的值并與j替換,每一趟結(jié)束會得到{比基數(shù)小},基數(shù),{比基數(shù)大}
- 第一趟,基數(shù)為1:序列沒變,即{1},{45,32,23,22,31,47,24,4,15}
- 第二趟,基數(shù)為45,子序列排序為:{15,32,23,22,31,4,24},45,{47}
…
- 堆排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15
- 第一趟,逐一構(gòu)建大根堆,最終得到:47,24,45,23,22,31,32,1,4,15,接著將堆頂47與堆底15進行交換。
- 第二趟:對子序列重新構(gòu)造大根堆,再交換堆頂與堆底元素…
- 歸并排序詳解(分治思想;對于兩個排好序的子區(qū)間([2,6]和[4,8]),需要開辟一個O(n)的數(shù)組,以及2個指針來完成兩個子區(qū)間的歸并)
- 堆排序算法(圖解詳細流程,插入一個元素的時間復(fù)雜度為O(lgn))
Note: - 先依次掃描數(shù)組中的每一個元素,每一次掃描完成當前索引構(gòu)成的子數(shù)組的堆的初始化(升序采用大頂堆,降序采用小頂堆)
- 大頂堆 和 小頂堆在數(shù)組中是亂序的,為了讓數(shù)組元素有序,交換堆頂和堆底元素,再從剩余元素中重新調(diào)整成堆。
- 堆排序,計數(shù)排序,桶排序,基數(shù)排序
- 線性表: 順序表和鏈表詳解
- 雙端隊列梳理分析(無受限/輸入受限/輸出受限的雙端隊列)
- 算法的時間復(fù)雜度(遞歸如何計算時間復(fù)雜度),算法空間復(fù)雜度(額外添加的變量個數(shù)),遞歸算法時間復(fù)雜度分析
- 圖的鄰接表表示法,有向圖的鄰接矩陣、鄰接表和逆鄰接表
Note: - 圖的遍歷是指從給定的源點出發(fā),沿著某條搜索路徑對每一個頂點進行訪問且僅訪問一次的過程,而不是“從給定的源點出發(fā)對每一個頂點僅訪問一次的過程”,因此環(huán)路不影響圖的遍歷。
- 無向圖和有向圖都可以用鄰接表和鄰接矩陣表示,深度優(yōu)先/廣度優(yōu)先都適用于無向圖的遍歷。
- 無向圖鄰接表的存儲空間為n + 2e,鄰接矩陣的存儲空間為n2n^2n2。因此鄰接矩陣多用于邊多的稠密圖;而鄰接表多用于邊少的稀疏圖。
- 有向圖鄰接表找出度易,找入度難;逆鄰接表找入度易,找出度難。
- 使用鄰接表存儲結(jié)構(gòu),深度優(yōu)先遍歷和廣度優(yōu)先遍歷運算的時間復(fù)雜度均為O(n+e)O(n + e)O(n+e)。
- 樹的三種存儲方式,樹的三種存儲結(jié)構(gòu)
Note: - 雙親表示法用數(shù)組實現(xiàn),容易查找當前節(jié)點的父節(jié)點。
- 孩子表示法用數(shù)組和單鏈表來實現(xiàn),該節(jié)點指向第一個孩子,其他孩子依次用鏈表串起來,容易查找當前節(jié)點的孩子節(jié)點。
- 孩子兄弟表示法用二叉鏈表來實現(xiàn),該節(jié)點左指針指向第一個孩子,右指針指向它的兄弟節(jié)點,容易查找當前節(jié)點的孩子節(jié)點和兄弟節(jié)點。
- 圖的經(jīng)典四大算法-Prim和Kruskal,Dijkstra和Floyd算法,參考【數(shù)據(jù)結(jié)構(gòu)】克魯斯卡爾(Kruskal)算法 —PK— 普里姆(Prim)算法,Dijkstra算法和Floyd算法詳解
Note: -
最小生成樹算法:
-
Prim:從任意頂點出發(fā)選擇與當前頂點集最近的一個頂點(記憶方法:prim 和 prince相似,prince有家族,所以是prim是頂點集算法)
構(gòu)建最小生成樹的步驟:
-
在生成樹的構(gòu)造過程中,圖中n個頂點分屬兩個集合:已落在生成樹上的頂點集合U 和 尚未落在生成樹上的頂級集合V-U,則應(yīng)在所有連通U中頂點和V-U中的頂點的邊中選取權(quán)值最小的邊。
-
Kruskal:從邊開始,把所有的邊按照權(quán)值先從小到大排列,接著按照順序選取每條邊,如果這條邊的兩個端點不屬于同一集合,那么就將它們合并(記憶方法:Kruskal中有ru,聯(lián)想ruler,所以是基于邊的貪心算法)
構(gòu)建最小生成樹的步驟:
- T的初始化狀態(tài) T = (V, 空 ) ,即最小生成樹T是圖G的生成零圖。
- 將圖G中的邊按照權(quán)值從小到大的順序排序
- 依次選取每條邊,若選取的邊未使生成樹T形成回路,則加入TE中,否則舍棄。直至TE中包含n-1條邊為止。
兩者均采用貪心思想。
-
單源最短路徑(假設(shè)以v1v_1v1?為起點,求v1v_1v1?到各頂點的最短路徑)vs 任意點最短路徑:
-
Dijkstra算法是單源最短路徑算法:把網(wǎng)中所有的頂點分成兩個集合S和T、S集合的初態(tài)只包含頂點v0, T集合的初態(tài)為網(wǎng)中除v0之外的所有頂點。凡以v0為源點,已經(jīng)確定了最短路徑的終點并入S集合中(記憶方法:Dijkstra中有Tesla(斯特拉 = 特斯拉),聯(lián)想到開車尋路,即兩點的最短路徑問題,可以和prim區(qū)分開)
-
Floyd算法是任意點最短路徑算法:核心代碼就有五行,主要用公式min(Dis(i,j),Dis(i,k)+Dis(k,j))min(Dis(i,j),Dis(i,k)+Dis(k,j))min(Dis(i,j),Dis(i,k)+Dis(k,j))來不斷優(yōu)化帶權(quán)鄰接矩陣,最后得到矩陣就是每對頂點之間的最短距離了
Dijkstra算法采用貪心思想,而Floyd算法采用動態(tài)規(guī)劃思想。
- Hash沖突,數(shù)據(jù)結(jié)構(gòu) - 散列表(沖突解決方法 & 裝填因子)
Note: - 關(guān)鍵字e的同義詞,指的是其他關(guān)鍵字利用哈希函數(shù)進行求值時,得到的函數(shù)結(jié)果與e是一致的,此時這些關(guān)鍵字就是e的同義詞。在哈希表查找關(guān)鍵字e時成功且經(jīng)過多次比較,可以知道經(jīng)過計算e的位置。
- 采用線性探測法解決哈希沖突,此時該位置對同義詞開放,對非同義詞也是開放的,也就是說,其他非同義關(guān)鍵字在使用線性探測法解決沖突時,也有可能直接占據(jù)該位置。
九、程序設(shè)計語言
-
有限自動機;正規(guī)式->NFA->DFA->最小化DFA->詞法分析器
Note:
- 不確定的有限自動機(NFA):NFA是一個五元組,M=(S,Σ,move,s0,F)
- S是有限個狀態(tài)的集合
- Σ是有限個輸入字符(包括ε)的集合
- move是一個狀態(tài)轉(zhuǎn)移函數(shù),move(si,ch) = sj表示當前狀態(tài)si下若遇到輸入字符ch,則遷移到狀態(tài)sj
- s0是唯一的初態(tài)
- F是終態(tài)集,它是S的子集,包含了所有的終態(tài)
- 確定的有限自動機(DFA):DFA是NFA的特例,其特點是某個狀態(tài)通過指定字符轉(zhuǎn)移到下一個狀態(tài)具有確定性,即對每一個狀態(tài)s和每一個字符a,最多有一個下一個狀態(tài)。
- NFA 和 DFA 能識別的字符串從初始態(tài)出發(fā),到終止態(tài)結(jié)束(期間可多次轉(zhuǎn)移至初始態(tài)或終止態(tài))
- 若兩個FA識別同一個正規(guī)集,則這兩個FA等價。對于每個NFA,都存在與之等價的DFA。
-
語法分析器的輸入
Note:
-
詞法分析是編譯過程的第一階段,其任務(wù)是對源程序從前到后(從左到右)逐個字符地掃描,從中識別出一個個的“單詞”符號(2019下半年20題中,詞法分析輸出的結(jié)果為 記號流,不是字符流(Java Reader)。
完成的工作:檢測非法字符、單詞拼寫錯誤等
-
語法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語言的語法規(guī)則將單詞符號序列分解成各類語法單位,如“表達式”、“語句”和“程序”等。
完成的工作:標點符號錯誤、表達式中缺少操作數(shù)、括號不匹配等有關(guān)語言結(jié)構(gòu)上的錯誤。
-
(靜態(tài))語義分析階段主要檢查源程序是否包含語義錯誤,并收集類型信息供后面的代碼生成階段使用。只有語法和語義都正確的源程序才能被翻譯成正確的目標代碼。
- 這里要注意的是語義錯誤有動態(tài)語義錯誤和靜態(tài)語義錯誤。靜態(tài)語義錯誤是指在編譯的語義分析階段可以發(fā)現(xiàn)。動態(tài)語義錯誤是指在運行時才能發(fā)現(xiàn)。在語義分析階段并不能識別出所有的語義錯誤,只能發(fā)現(xiàn)靜態(tài)語義錯誤。
- 完成的工作:完成類型檢查,運算符與運算對象類型不合法等錯誤。
-
目標代碼(機器碼)生成是編譯器工作的最后一個階段(動態(tài)語義分析)。這一階段的任務(wù)是把中間代碼(匯編語言) 變換成特定機器上的絕對指令代碼、可重定位的指令代碼或匯編指令代碼,這個階段的工作與具體的機器密切相關(guān)。
完成的工作:動態(tài)語義錯誤,包括陷入死循環(huán)、變量取零時做除數(shù)、引用數(shù)組元素下標越界等錯誤等。
-
從原理上講,對源程序進行語義分析之后就可以直接生成目標代碼,但由于源程序與目標代碼的邏輯結(jié)構(gòu)往往差別很大,特別是考慮到具體機器指令系統(tǒng)的特點,要使翻譯一次到位很困難,而且用語法制導(dǎo)方式機械生成的目標代碼往往是繁瑣和低效的,因此有必要設(shè)計一種中間代碼,將源程序首先翻譯成中間代碼表示形式,以利于進行與機器無關(guān)的優(yōu)化處理。
由于中間代碼實際上也起著編譯器前端和后端分水嶺的作用,所以使用中間代碼也有助于提高編譯程序的可移植性。常用的中間代碼有后綴式、三元式、四元式和樹(圖)等形式。中間代碼并不依賴于具體的機器。
-
源程序不可避免地會有一些錯誤,這些錯誤大致可分為語法錯誤和語義錯誤。
- 語法錯誤是指語言結(jié)構(gòu)上的使用錯誤,是指編譯時所發(fā)現(xiàn)的程序錯誤,如單詞拼寫錯誤、標點符號錯、表達式中缺少操作數(shù)、括號不匹配等有關(guān)語言結(jié)構(gòu)上的錯誤。
- 對于語義錯誤有動態(tài)語義錯誤和靜態(tài)語義錯誤。靜態(tài)語義錯誤為在編譯的語義分析階段可以發(fā)現(xiàn)。動態(tài)語義錯誤為在運行時才能發(fā)現(xiàn)。因此語義分析階段并不能發(fā)現(xiàn)程序中所有的語義錯誤。
-
上下文有關(guān)文法(1型文法)/ 上下文無關(guān)文法(2型文法),文法和正規(guī)式(四種文法)
Note:
-
上下文有關(guān)文法(1型文法):此文法對應(yīng)于線性有界自動機,它是在0型文法的基礎(chǔ)上增加了一條對于每一個a->b,都存在|a|<=|b|,這里的|b|表示的是b的長度,而不是絕對值。即由Ab->B不屬于1型文法,而A->Bba則屬于1型文法。即左側(cè)可以既有終結(jié)符也有非終結(jié)符。
-
上下文無關(guān)文法(2型文法):左側(cè)只含有一個非終結(jié)符,在推導(dǎo)式的過程中,左側(cè)會被完全替換掉,只起到一個中間的作用。如A->Ba符合2型文法要求,如Ab->Bab不是2型文法,因為Ab不是非終結(jié)符。
-
正規(guī)文法(3型文法):它對應(yīng)于有限狀態(tài)自動機,它是在2型文法的基礎(chǔ)上滿足:A->a|aB(右線性)或A->a|Ba(左線性)。如果有A->a,A->aB,B->a,B->cB則符合3型文法的要求。但是A->ab,A->aB,B->a,B->cB或A->a,A->Ba,B->a,B->cB則不符合3型文法的要求。正規(guī)文法要求,不能夠推導(dǎo)出兩個終結(jié)符,而且左線性和右線性只能使用一種,不能夠同時出現(xiàn)。
-
大多數(shù)程序設(shè)計語言的語法規(guī)則用 上下文無關(guān)文法 來描述。
-
編譯原理之求FIRST集,FIRST集合FOLLOW集
-
正規(guī)文法和正規(guī)式的相互轉(zhuǎn)換(理解正規(guī)文法的概念,以及正規(guī)式轉(zhuǎn)正規(guī)文法的規(guī)定)
-
正規(guī)式和有限自動機的轉(zhuǎn)換(有限自動機轉(zhuǎn)正規(guī)式的3個圖 / 正規(guī)式轉(zhuǎn)有限自動機的3個圖)
-
根據(jù)文法進行表達式推導(dǎo)
-
什么是腳本,腳本語言?
Note:
- 腳本語言是介乎于 HTML 和諸如 JAVA 、 Visual Basic 、 C++ 等編程語言之間的一種特殊的語言。常見的腳本語言有:Python、JavaScript。
- 腳本語言一般都有相應(yīng)的腳本引擎來解釋執(zhí)行,是一種解釋性語言,一般需要解釋器才能運行。也就是指令被立即執(zhí)行,不存在一個編譯的中間狀態(tài)。
- 腳本語言運行效率比匯編語言低。
- 動態(tài)程序一般有兩種實現(xiàn)方式,一是二進制方式,一是腳本方式。
- 二進制方式是先將我們編寫的程序進行編譯,變成機器可識別的指令代碼(如.exe文件),然后再執(zhí)行。
- 腳本簡單地說就是一條條的文字命令,以文本形式存在。
- 編譯和解釋是語言處理的兩種基本方式。
- 編譯過程包括詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標代碼生成等階段,以及符號表管理與出錯處理模塊。
- 解釋過程在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但是在運行用戶程序時,它直接執(zhí)行源程序或源程序的內(nèi)部形式(解釋過程不會生成目標程序)。
- 這兩種語言處理程序的根本區(qū)別是:
- 在編譯方式下,機器上運行的是與源碼程序等價的目標程序,源程序和編 譯程序都不再參與目標程序的執(zhí)行過程;
- 而在解釋方式下,解釋程序和源程序(或其某種等價表示)要參與到程序的運行過程中,運行程序的控制權(quán)在解釋程序。
- 在編譯方式下,詞法、語法和語義分析是必須要進行的工作,而生產(chǎn)中間代碼和優(yōu)化則是可以進行也可以不進行。
-
編譯與反編譯詳解,C語言編譯過程(預(yù)處理,編譯(匯編碼),匯編(機器碼),鏈接)
Note:
- 編譯是將高級語言源程序 翻譯成 機器語言程序(匯編形式或機器代碼形式),反編譯是編譯的逆過程。
- 反編譯通常不能把可執(zhí)行文件 還原成 高級語言源代碼,只能轉(zhuǎn)換成功能上等價的匯編程序。
-
可視化程序設(shè)計的基本理論
Note:
- 可視化程序設(shè)計主要是讓程序設(shè)計人員利用軟件本身所提供的各種控件,像搭積木式地構(gòu)造應(yīng)用程序的各種界面。
- 可視化程序設(shè)計最大的優(yōu)點是設(shè)計人員可以不用編寫或只需編寫很少的程序代碼,就能完成應(yīng)用程序的設(shè)計,這樣就能極大地提高設(shè)計入員的工作效率。
- 在可視化程序設(shè)計中,采用解釋方式可隨時查看程序的運行效果。
- 能進行可視化程序設(shè)計的語言很多,比較常用的有微軟的Visual Basic、Visual C++、Visual C#、中文Visual Foxpro、Borland公司的Delphi等。
-
強類型&弱類型語言、動態(tài)&靜態(tài)語言有什么區(qū)別,強類型語言和弱類型語言的區(qū)別
Note:
- 強類型語言有些類型不支持隱式類型轉(zhuǎn)換,需要通過強制類型轉(zhuǎn)換才可實現(xiàn),比如java,python;python代碼如下:b = 3
c = 3.1415926
print(b + c)
---
6.1415926a = "123"
b = 3
print(a + b)
---
TypeError: can only concatenate str (not "int") to str
弱類型語言中所有類型都支持隱式類型轉(zhuǎn)換,比如js,php;js代碼如下:var a = "123"
var b = 3
console.log(a + b)
---
1233
對于弱類型語言,需要弄清楚不同類型之間是如何隱式變換的,比如str + int →\rightarrow→ str
- 動態(tài)類型語言在運行期間才去做數(shù)據(jù)類型檢查(python);而靜態(tài)類型語言在編譯期間就去做數(shù)據(jù)類型檢查(java,c++)。
- 許多程序設(shè)計語言規(guī)定,程序中的數(shù)據(jù)都必須具有類型,其作用包括:
- 便于為數(shù)據(jù)合理分配存儲單元;
- 便于對參與表達式計算的數(shù)據(jù)對象進行檢查;
- 便于規(guī)定數(shù)據(jù)對象的取值范圍及能夠進行的運算;
十、多媒體基礎(chǔ)
- 多媒體開發(fā)你必須知道的各種音頻格式之間的比較(WAV/MIDI/AAC…)
- WAV格式音頻
Note: - 聲音(音頻)信號的一個基本參數(shù)是頻率,它是指聲波每秒鐘變化的次數(shù),用Hz表示。人耳能聽到的音頻信號的頻率范圍是 20Hz ~ 20KHz。
- CIF是Common Intermediate Format的簡稱,即常用的標準化圖像格式。在H.323協(xié)議簇中,規(guī)定了視頻采集設(shè)備的標準采集分辨率CIF=352×288像素。
- 使用150DPI的掃描分辨率掃描一幅3×4英寸的彩色照片,得到原始的24位真彩色圖像的數(shù)據(jù)量是3?4?150?150?24/8=8100003 * 4 * 150 * 150 *24 / 8 = 8100003?4?150?150?24/8=810000 字節(jié)
- 矢量圖中的圖形元素稱為圖元。而另一類圖具有代表性的圖像表示形式是位圖圖像,該圖采用像素來表示圖。
- 某數(shù)碼相機內(nèi)置128MB的存儲空間,拍攝分辨率設(shè)定為1600×1200像素,顏色深度為24位(bit),若不采用壓縮存儲技術(shù),使用內(nèi)部存儲器最多可以存儲 128?1024?1024?8/(1600?1200?24)=23128 * 1024 * 1024 * 8 / (1600 * 1200 * 24 ) = 23128?1024?1024?8/(1600?1200?24)=23 張照片(顏色空間為2242^{24}224種顏色,而存儲空間只有8位)。
- 計算機通過MIC(話筒接口) 收到的信號是模擬信號:通過話筒傳入計算機的是人類的聲音,而這種聲音信號是一種連續(xù)的模擬信號,而非離散的數(shù)字信號,在接收到模擬信號以后,經(jīng)過采樣、量化等工作將模擬信號轉(zhuǎn)換為數(shù)字信號在計算機中處理。
- 未經(jīng)壓縮的數(shù)字音頻數(shù)據(jù)傳輸率可按下式計算:數(shù)據(jù)傳輸率(b/s)=采樣頻率(Hz) ×量化位數(shù)(b)×聲道數(shù),比如對于44.1khz、樣本精度為16b/s的雙聲道數(shù)字音頻其數(shù)據(jù)傳輸率為44.1 * 16 * 2 = 1411.2kb/s
十一、知識產(chǎn)權(quán)標準化
- 知識產(chǎn)權(quán)與標準化
- 知識產(chǎn)權(quán)(包括著作權(quán)法(保護期限,權(quán)利歸屬,侵權(quán)判定))和標準化(標準化知識,軟件工程國家標準(標準種類,文檔指南,軟件質(zhì)量特性,軟件質(zhì)量保證))
Note: - 按照我國著作權(quán)法的權(quán)利保護期,署名權(quán),修改權(quán)和保護作品完整權(quán)受到永久保護。
- 其中法律依據(jù),著作權(quán)法規(guī)定“執(zhí)行本單位的任務(wù)或者主要是利用本單位的物質(zhì)條件所完成的職務(wù)作品,其權(quán)利屬于該單位。”
- 某軟件公司參與開發(fā)管理系統(tǒng)軟件的程序員張某,辭職到另一公司任職,于是該項目負責人將該管理系統(tǒng)軟件上開發(fā)者的署名更改為李某(接張某工作),該項目負責人的行為侵犯了張某開發(fā)者身份權(quán)(署名權(quán))。
- 著作權(quán)有可復(fù)制性。著作權(quán)的對象是作品,是指文學、藝術(shù)、和科學領(lǐng)域內(nèi)具有獨創(chuàng)性并能以某種有形形式復(fù)制的智力成果,因此,著作權(quán)必然具有可復(fù)制性,但是復(fù)制并原封不動發(fā)行別人的作品就屬于侵權(quán)。
- 軟件著作權(quán)保護目標程序、源程序、軟件文檔,但不包護開發(fā)軟件的所有操作方法(比如IDE等工具)(2021上12)
- 據(jù)《中華人民共和國商標法》,煙草制品中必須使用注冊商標。
- 甲乙兩公司的財務(wù)軟件產(chǎn)品功能基本一致,這兩公司分別申請“大堂”和“大唐”商標注冊(無法區(qū)分誰先使用)。兩財務(wù)軟件相似,且經(jīng)協(xié)商雙方均不同意用其申請注冊的商標標識。此情形下由甲乙抽簽結(jié)果確定誰獲準注冊。但如果甲第一次使用時間為2019年7月,而乙第一次使用時間為2019年5月,如果兩公司同一天申請注冊商標,則乙公司的"大唐"獲準注冊。
原因分析: - 這個是同一類產(chǎn)品,構(gòu)成近似商標,“近似商標”是指文字、數(shù)字、圖形、三維標志或顏色組合等商標的構(gòu)成要素的發(fā)音、視覺、含義或排列順序及整體結(jié)構(gòu)上雖有一定區(qū)別,但又使人難以區(qū)分,容易產(chǎn)生混滑的商標。上述案例會產(chǎn)生商標故不能同時注冊。由雙方協(xié)商決定。
- 首先第一原則是,誰先申請誰獲得;其次,同時申請時,誰先使用誰獲得;
如果無法區(qū)分誰先使用,則協(xié)商歸屬,協(xié)商不成可以抽簽決定。
- 商業(yè)秘密一般是指不為公眾所知悉,能為權(quán)利人帶來經(jīng)濟利益,具有實用性并經(jīng)權(quán)利人采取保密措施的技術(shù)信息和經(jīng)營信息。對于公司采取保密措施的行為,該公司具有商業(yè)秘密權(quán)。
十二、案例分析
uml邊界類例子_UML中邊界對象、控制對象、實體對象
設(shè)計模式的3大類型和6大原則(先判斷是創(chuàng)建型/結(jié)構(gòu)型/行為型,再確定是哪個模式)
組件聚合原則(復(fù)用/發(fā)布原則,共同閉包原則,共同復(fù)用原則)
Note:面向?qū)ο?/strong>設(shè)計的幾大原則
- 單一職責原則:在面向?qū)ο笤O(shè)計時,就一個類而言,應(yīng)該僅有一個引起變化的原因。
- 里氏替換原則:子類可以替換父類。
- 依賴倒置原則:要依賴于抽象,而不是具體實現(xiàn);針對接口編程,不要針對實現(xiàn)編程(沒有強調(diào)不強迫客戶依賴于他們不用的方法)。
- 接口分離原則:使用多個專門的接口要比使用單一的總接口要好。不強迫客戶依賴于他們不用的方法,即:依賴于抽象,不依賴于具體,同時在依賴級別不應(yīng)有對于細節(jié)的依賴。
- 開放-封閉原則:對擴展開放,對修改關(guān)閉。
- 共同封閉原則:包中的所有類對于同一性質(zhì)的變化應(yīng)該是共同封閉的。一個變化若對一個包產(chǎn)生影響,則將對該包里的所有類產(chǎn)生影響,而對于其他的包不造成任何影響。
- 共同重用原則:一個包里的所有類應(yīng)該是共同重用的。如果重用了包里的一個類,那么就要重用包中的所有類。
JAVA實現(xiàn)23種設(shè)計模式,Java中常用的設(shè)計模式
Note:
- 創(chuàng)建型對象模式:單例模式,簡單工廠模式,抽象工廠模式,生成器模式,原型模式
- 結(jié)構(gòu)型對象模式:組合模式,適配器模式,裝飾者模式,代理模式,外觀模式,橋接模式,享元模式
- 行為型對象模式:策略模式,模板方法模式,觀察者模式,迭代器模式,責任鏈模式,命令模式,備忘錄模式,狀態(tài)模式,訪問者模式,中介者模式,解釋器模式
觀察者模式,狀態(tài)模式(行為型),建造者(生成器)模式
橋接模式(結(jié)構(gòu)型,接口和實現(xiàn)類),責任鏈模式(行為型),迭代器模式(行為型)
組合模式(結(jié)構(gòu)型;部分整體模式;依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次)
Note:
- 原型模式的適用場景:當一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時。
- 工廠模式的適用場景:當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。
- 抽象工廠模式的適用場景:當要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時
- 生成器模式的適用場景:當構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時
MVC 模式
面向?qū)ο蠓治龅?個活動(識別對象,類定義與類繼承,對象間的通信)
Note:
- 認定對象:在應(yīng)用領(lǐng)域中,按自然存在的實體確立對象。在定義域中,首先將自然存在的“名詞”作為一個對象,這通常是研究問題定義域?qū)嶓w的良好開始。通過實體間的關(guān)系尋找對象常常沒有問題,而困難在于尋找(選擇)系統(tǒng)關(guān)心的實質(zhì)性對象。實質(zhì)性對象是系統(tǒng)穩(wěn)定性的基礎(chǔ)。例如在銀行應(yīng)用系統(tǒng)中,實質(zhì)性對象應(yīng)包含客戶賬務(wù)、清算等,而門衛(wèi)值班表不是實質(zhì)性對象,甚至可不包含在該系統(tǒng)中。
- 組織對象:分析對象間的關(guān)系,將相關(guān)對象抽象成類,其目的是為了簡化關(guān)聯(lián)對象,利用類的繼承性建立具有繼承性層次的類結(jié)構(gòu)。抽象類時可從對象間的操作或一個對象是另一個對象的一部分來考慮;如房子由門和窗構(gòu)成,門和窗是房子類的子類。由對象抽象類,通過相關(guān)類的繼承構(gòu)造類層次,所以說系統(tǒng)的行為和信息間的分析過程是一種迭代表征過程。
- 描述對象的相互作用:描述出各對象在應(yīng)用系統(tǒng)中的關(guān)系。如一個對象是另一個對象的一部分,一個對象與其他對象間的通信關(guān)系等。這樣可以完整地描述每個對象的環(huán)境,由一個對象解釋另一個對象,以及一個對象如何生成另一個對象,最后得到對象的界面描述。
- 確定對象的操作。
- 定義對象的內(nèi)部信息。
識別對象目的是為了定義類,而類可以分為三種:實體類、接口類(邊界類)和控制類,所以一開始就需要對對象進行好好分析,接著組織對象(創(chuàng)建類,類繼承),描述對象相互作用(傳參或者設(shè)置為類屬性)
UML中類之間的關(guān)系
Note:
-
類與類之間6種關(guān)系:依賴(帶箭頭的虛線),關(guān)聯(lián)(不帶箭頭的實線),聚合(空心菱形,has a),組合(實心菱形,contain a),泛化 / 繼承(空心三角形,實線),實現(xiàn)(空心三角形,虛線)(在UML中聚合和組合表示容易記錯,這里用諧音來記:聚(ju 類似 zuo)空;組實(主食),因此轉(zhuǎn)化成“做空,主食”來記;兩者的強弱等級也容易記錯,這里可以通過字典序j < z,判斷聚合的關(guān)聯(lián)等級低于組合的等級)
-
聚合和組合的區(qū)別:兩者都是整體和部分之間的關(guān)系,但在聚合關(guān)系中,成員對象可以脫離整體對象而獨立存在,例如,學校與老師的關(guān)系;在組合關(guān)系中,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對象而存在。例如,頭和嘴的關(guān)系
-
類與類之間的6種關(guān)系,按相互聯(lián)系程度由強至弱依次為:繼承/泛化 = 實現(xiàn) > 組合 > 聚合 > 關(guān)聯(lián) > 依賴
-
依賴是通過類方法來調(diào)用,即其他類的對象通過方法參數(shù)與當前類交互;關(guān)聯(lián)是通過類的實例化來創(chuàng)建,即對于兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應(yīng)關(guān)系時(類A對象是類B的成員變量),這兩個對象之間為關(guān)聯(lián)關(guān)系。關(guān)聯(lián)關(guān)系分為單向關(guān)聯(lián)和雙向關(guān)聯(lián),在java中:
- 單向關(guān)聯(lián)表現(xiàn)為:類A當中使用了類B,其中類B是作為類A的成員變量。
- 雙向關(guān)聯(lián)表現(xiàn)為:類A當中使用了類B作為成員變量;同時類B中也使用了類A作為成員變量。
因此組合和聚合也屬于關(guān)聯(lián),只不過組合和聚合強調(diào)類之間的主次關(guān)系(只能在類的設(shè)計階段看出來,僅通過代碼看不了),而關(guān)聯(lián)沒有。組合例子:人和人的生命;聚合例子:筆和筆芯;關(guān)聯(lián)的例子:筆記本和鼠標;參考關(guān)聯(lián),聚合,組合三者之間的關(guān)系
A的某個屬性是類B的一個對象,并且類A對象消失時,類B對象也隨之消失,則類A與類B的關(guān)系應(yīng)為組合關(guān)系。
UML三種關(guān)系簡化為繼承(實現(xiàn),泛化),關(guān)聯(lián)和依賴,參考UML類圖的依賴和關(guān)聯(lián)詳解(含代碼)
UML之狀態(tài)圖
Note:
- UML狀態(tài)圖(state diagram) 展現(xiàn)了一個狀態(tài)機,它由狀態(tài)(簡單狀態(tài)和組合狀態(tài))、轉(zhuǎn)換(遷移)、事件和活動組成。
當某個事件(滿足監(jiān)護條件) 發(fā)生后,對象的狀態(tài)將發(fā)生變化。轉(zhuǎn)換是兩個狀態(tài)之間的一種關(guān)系,表示對象將在源狀態(tài)中執(zhí)行一定的事件或動作,并在某個 特定事件發(fā)生而且某個特定的監(jiān)護條件滿足時離開當前狀態(tài)而進入目標狀態(tài)。
由于狀態(tài)可以嵌套,所以活動可以在狀態(tài)內(nèi)執(zhí)行,也可以在狀態(tài)遷移時執(zhí)行。(2019下半年41題) - [tries<3]和tries++分別表示監(jiān)護條件和轉(zhuǎn)換,帶有【】表示限制條件,沒帶【】的具體操作表示一個狀態(tài)到另外一個狀態(tài)的轉(zhuǎn)換。
時序圖,時序圖學習2_組成元素之角色和對象
Note:
- 同步消息進行阻塞調(diào)用,調(diào)用者中止執(zhí)行,等待控制權(quán)返回,需要等待返回消息;
- 異步消息的調(diào)用者是發(fā)送消息后繼續(xù)執(zhí)行,不引起調(diào)用者的阻塞,也不必等待返回消息。
- 從圖示中判斷異步消息,就是找沒有實線返回消息的請求消息。
從概念上講,就是不需要等待返回消息就可以去做其他事情的請求消息就是異步消息。有返回消息的就是同步消息。
UML圖:活動圖詳細介紹(動作狀態(tài)、活動狀態(tài)、起始點、結(jié)束點、分支與合并、泳道和對象流)
Note:
- 對一個復(fù)雜用例中的業(yè)務(wù)處理流程進行進一步建模的最佳工具是UML活動圖。
- 活動圖 和 狀態(tài)圖的區(qū)別:
- 1)活動圖著重表現(xiàn)從一個活動到另一個活動的控制流,是內(nèi)部處理驅(qū)動的流程,強調(diào)對象間的控制流程。
- 2)狀態(tài)圖著重描述從一個狀態(tài)到另一個狀態(tài)的流程,主要有外部事件的參與。
- 活動圖 和 時序圖的區(qū)別:
- 1)時序圖(順序圖)著重描述處理過程,它的主要控制結(jié)構(gòu)是順序、分支和循環(huán),各個處理之間有嚴格的順序和時間關(guān)系(時序圖中每個參與者都有一條生命線,表示處理的時間段,而且具有循環(huán)分支結(jié)構(gòu))。
- 2)活動圖(流程圖)描述的則是對象活動的順序關(guān)系所遵循的規(guī)則,它著重表現(xiàn)的是系統(tǒng)的行為,而非系統(tǒng)的處理過程。
- 3)活動圖能夠表示并發(fā)活動的情形,時序圖不能。
軟考必考題型之UML圖形
Note:UML中提供了多種建模系統(tǒng)需求的圖,體現(xiàn)系統(tǒng)的靜態(tài)方面和動態(tài)方面。
- 類圖(Class Diadram)展現(xiàn)了一組對象、接口、協(xié)作和它們之間的關(guān)系。在面向?qū)ο笙到y(tǒng)的建模中,最常見的就是類圖,它給出系統(tǒng)的靜態(tài)設(shè)計視圖。
- 對象圖(Object Diagram)展現(xiàn)了某一時刻一組對象以及他們之間的關(guān)系
對象圖描述了在類圖中所建立的事物的實例的靜態(tài)快照,給出系統(tǒng)的靜態(tài)設(shè)計視圖或靜態(tài)進程視圖。 - 用例圖(Use Case Diagram)展現(xiàn)了一組用例、參與者(Actor)以及它們之間的關(guān)系。這個視圖主要支持系統(tǒng)的行為,即該系統(tǒng)在它的周邊環(huán)境的語境中所提供的外部可見服務(wù)。用例圖用于對一個系統(tǒng)的需求進行建模,包括說明這個系統(tǒng)應(yīng)該做什么(從系統(tǒng)外部的一個視點出發(fā)), 而不考慮系統(tǒng)應(yīng)該怎樣做。
- 序列圖(順序圖)展示的是一個用例與多個對象的行為(對單個用例圖的擴展)
- 活動圖(activity diagram) 將進程或其他計算結(jié)構(gòu)展示為計算內(nèi)部一步步的控制流和數(shù)據(jù)流。活動圖專注于系統(tǒng)的動態(tài)視圖。它對系統(tǒng)的功能建模和業(yè)務(wù)流程建模特別重要,并強調(diào)對象間的控制流程。
- 交互圖用于對系統(tǒng)的動態(tài)方面進行建模。一張交互圖表現(xiàn)的是一個交互,由一組對象和它們之間的關(guān)系組成,包含它們之間可能傳遞的消息。交互圖表現(xiàn)為通信圖、交互概覽圖和時序圖,每種針對不同的目的,能適用于不同的情況。
- 通信圖是強調(diào)接收和發(fā)送消息的對象的結(jié)構(gòu)組織的交互圖;
- 交互概覽圖強調(diào)控制流的交互圖。
- 時序圖/順序圖(Timing Diagram)關(guān)注沿著線性時間軸、生命線內(nèi)部和生命線之間的條件改變。
系統(tǒng)順序圖和順序圖的區(qū)別參考系統(tǒng)順序圖與順序圖區(qū)別
- 部署圖(Deploy Diagram)是用來對面向?qū)ο笙到y(tǒng)的物理方面(軟件和硬件)建模的方法,展現(xiàn)了運行時處理結(jié)點以及其中構(gòu)件(制品)的配置。
- 組件圖(Component Diagram)展現(xiàn)了一組組件之間的組織和依賴。
- 構(gòu)件應(yīng)是可替換的;
- 構(gòu)件表示的是物理模塊而不是邏輯模塊;
- 構(gòu)件應(yīng)是組成系統(tǒng)的一部分;
- 構(gòu)件與類處于不同的抽象層次;
模型驅(qū)動架構(gòu)(模型驅(qū)動分析方法包括 結(jié)構(gòu)化分析,面向?qū)ο蠓治?#xff09;,結(jié)構(gòu)化開發(fā)方法 & 數(shù)據(jù)流圖
C++中的public,protected,private繼承機制 - (C++默認使用私有繼承,三者區(qū)別在于 派生類會將父類的成員轉(zhuǎn)換成那種類型 & 對象訪問權(quán)限)
java的繼承機制
Note:
- java默認使用私有繼承,因此子類將父類的public,protected方法變成子類的private方法,此時需要重寫父類中的這些public,protected方法,才能讓對象訪問到。
- 對于java的成員屬性和方法,如何不加任何訪問修飾符,通常稱為“default訪問模式“。該模式下,只允許在同一個包中進行訪問,訪問權(quán)限僅次于private。
- 與C++不同的是,java只允許單繼承一個父類,但是接口允許多繼承。
- 抽象類不能直接進行實例化。
- 特殊 / 一般關(guān)系也叫做泛化(Generalization)關(guān)系,可以理解成:特殊元素(即子類對象)是一般元素(即父類對象)的一種特殊體現(xiàn)。
java中的public,protected,private,default詳解(對象中的成員是否可訪問)
重寫和重載及其區(qū)別
參數(shù)多態(tài)、包含多態(tài)、過載多態(tài)和強制多態(tài),C++>多態(tài),強制多態(tài),參數(shù)類型多態(tài),重載多態(tài),包含多態(tài)(運行時多態(tài))
Note:
- 強制多態(tài):強制類型轉(zhuǎn)換
- 過載多態(tài):函數(shù)重載
- 包含多態(tài):子類對父類方法的重寫
- 參數(shù)多態(tài):泛型
- 特定多態(tài)包含 強制多態(tài) 和 重載多態(tài), 通用多態(tài)包含參數(shù)多態(tài) 和 包含多態(tài)。
其中在面向?qū)ο蠓椒ㄖ?#xff0c;動態(tài)綁定是實現(xiàn)多態(tài)的基礎(chǔ)(通過動態(tài)綁定機制,在調(diào)用子類對象方法或?qū)傩詴r,會選擇調(diào)用子類還是父類的方法或?qū)傩?/strong>),換句話說,運行時結(jié)合是動態(tài)綁定(泛化過程的實現(xiàn)),編譯時結(jié)合是靜態(tài)綁定。參考java的動態(tài)綁定機制(不是動態(tài)分配)(2019下半年40題)
Note:
-
參考2019下半年第18題,可以先求解關(guān)鍵路徑(最長路徑)確定里程碑節(jié)點,接著利用里程碑節(jié)點子圖,計算"活動BE最多可以晚 ()天開始而不影響工期"
比如關(guān)鍵路徑為:A-B-F-J-L和A-D-G-I-J-L,那么計算BE最晚推遲幾天動工時可以只考慮B-F-J-L和B-E-H-J兩個子圖,發(fā)現(xiàn)(6+5)-(2+2+5) = 2即為答案。
Note:
- 在二叉搜索樹下插入新的節(jié)點,并判斷插入到節(jié)點是否導(dǎo)致非平衡,如果非平衡,判斷是屬于哪種類型:LL,RR,LR,RL,其中LL表示新插入的節(jié)點位于根結(jié)點左孩子(L)的左子樹(L)上。
- 從新加入的節(jié)點開始,向上尋找最小非平衡子樹,以子樹的根結(jié)點為基準,使用LL/RR/LR/RL進行調(diào)整。
- 其中LR類型的非平衡可以先通過LL調(diào)整方式,再通過RR調(diào)整方式進行調(diào)整;RL類型可以先通過RR,再通過LL進行調(diào)整。
Note:
- 連通圖:圖中任意兩點之間均至少有一條通路,否則稱為不連通圖
- 強連通圖:在有向圖中, 若對于每一對頂點v1和v2, 都存在一條從v1到v2和從v2到v1的路徑,則稱此圖是強連通圖。
- 強連通和弱連通的概念只在有向圖中存在。
Note:
- 不同排序算法在時間復(fù)雜度,空間復(fù)雜度,穩(wěn)定性上的比較:
- 為什么說選擇排序是不穩(wěn)定的呢?舉個例子,序列arr = [5 8 5 2 9],我們知道第一遍選擇第1個元素5會和2交換,那么原序列中兩個5的相對前后順序就被破壞了,所以選擇排序是一個不穩(wěn)定的排序算法。參考選擇排序為什么是不穩(wěn)定的?
- 為什么說冒泡排序是穩(wěn)定的呢?因為每次都是從子序列第一個元素開始交換,最終得到子序列最大值,比如8,5(2)交換并不會影響5(1),5(2)的順序。
- 歸并排序可以通過手搖算法將空間復(fù)雜度降到O(1),但是時間復(fù)雜度會提高。
- 基數(shù)排序時間復(fù)雜度為O(N*M),其中N為數(shù)據(jù)個數(shù),M為數(shù)據(jù)位數(shù)
- 希爾排序流程(間隔排序):假設(shè)原始序列為3,7,6,5,4
- 第一趟間隔為 5 / 2 = 2:即分別依次對3,6,4,7,5排序,得到3,4,6和5,7
- 第二趟間隔為 2 / 2 = 1:即對3,4,6,5,7依次進行排序
- 桶排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,假設(shè)按十位數(shù)分為5個桶
- 第一趟:將原始序列逐一放入桶中,序列為:1,4 | 15 | 23,22,24 | 32,31 | 45,47
- 第二趟:對每個桶分別進行排序。
- 基數(shù)排序流程(桶排序的擴展):假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,由于最大只有十位數(shù),因此可以進行兩次桶排序:
- 第一趟對個位數(shù)進行分桶:依次放入1,31 | 32,22 | 23 | 24,4 | 45,15 | 47,得到序列為1,31,32,22,23,24,4,45,15,47
- 第二趟對十位數(shù)進行分桶:依次放入為1,4 | 15 | 22,23,24 | 31,32 | 45,47,輸出即為有序序列
- 快速排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15,策略是選擇每個分組中的首元素作為基數(shù),每一趟執(zhí)行順序為:假設(shè)左i右j,循環(huán)依次←\leftarrow←(j--)找比基數(shù)小的值并與i替換,→\rightarrow→(i++)找比基數(shù)大的值并與j替換,每一趟結(jié)束會得到{比基數(shù)小},基數(shù),{比基數(shù)大}
- 第一趟,基數(shù)為1:序列沒變,即{1},{45,32,23,22,31,47,24,4,15}
- 第二趟,基數(shù)為45,子序列排序為:{15,32,23,22,31,4,24},45,{47}
…
- 堆排序流程:假設(shè)原始序列為1,45,32,23,22,31,47,24,4,15
- 第一趟,逐一構(gòu)建大根堆,最終得到:47,24,45,23,22,31,32,1,4,15,接著將堆頂47與堆底15進行交換。
- 第二趟:對子序列重新構(gòu)造大根堆,再交換堆頂與堆底元素…
Note:
- 先依次掃描數(shù)組中的每一個元素,每一次掃描完成當前索引構(gòu)成的子數(shù)組的堆的初始化(升序采用大頂堆,降序采用小頂堆)
- 大頂堆 和 小頂堆在數(shù)組中是亂序的,為了讓數(shù)組元素有序,交換堆頂和堆底元素,再從剩余元素中重新調(diào)整成堆。
Note:
- 圖的遍歷是指從給定的源點出發(fā),沿著某條搜索路徑對每一個頂點進行訪問且僅訪問一次的過程,而不是“從給定的源點出發(fā)對每一個頂點僅訪問一次的過程”,因此環(huán)路不影響圖的遍歷。
- 無向圖和有向圖都可以用鄰接表和鄰接矩陣表示,深度優(yōu)先/廣度優(yōu)先都適用于無向圖的遍歷。
- 無向圖鄰接表的存儲空間為n + 2e,鄰接矩陣的存儲空間為n2n^2n2。因此鄰接矩陣多用于邊多的稠密圖;而鄰接表多用于邊少的稀疏圖。
- 有向圖鄰接表找出度易,找入度難;逆鄰接表找入度易,找出度難。
- 使用鄰接表存儲結(jié)構(gòu),深度優(yōu)先遍歷和廣度優(yōu)先遍歷運算的時間復(fù)雜度均為O(n+e)O(n + e)O(n+e)。
Note:
- 雙親表示法用數(shù)組實現(xiàn),容易查找當前節(jié)點的父節(jié)點。
- 孩子表示法用數(shù)組和單鏈表來實現(xiàn),該節(jié)點指向第一個孩子,其他孩子依次用鏈表串起來,容易查找當前節(jié)點的孩子節(jié)點。
- 孩子兄弟表示法用二叉鏈表來實現(xiàn),該節(jié)點左指針指向第一個孩子,右指針指向它的兄弟節(jié)點,容易查找當前節(jié)點的孩子節(jié)點和兄弟節(jié)點。
Note:
-
最小生成樹算法:
-
Prim:從任意頂點出發(fā)選擇與當前頂點集最近的一個頂點(記憶方法:prim 和 prince相似,prince有家族,所以是prim是頂點集算法)
構(gòu)建最小生成樹的步驟:-
在生成樹的構(gòu)造過程中,圖中n個頂點分屬兩個集合:已落在生成樹上的頂點集合U 和 尚未落在生成樹上的頂級集合V-U,則應(yīng)在所有連通U中頂點和V-U中的頂點的邊中選取權(quán)值最小的邊。
-
-
Kruskal:從邊開始,把所有的邊按照權(quán)值先從小到大排列,接著按照順序選取每條邊,如果這條邊的兩個端點不屬于同一集合,那么就將它們合并(記憶方法:Kruskal中有ru,聯(lián)想ruler,所以是基于邊的貪心算法)
構(gòu)建最小生成樹的步驟:- T的初始化狀態(tài) T = (V, 空 ) ,即最小生成樹T是圖G的生成零圖。
- 將圖G中的邊按照權(quán)值從小到大的順序排序
- 依次選取每條邊,若選取的邊未使生成樹T形成回路,則加入TE中,否則舍棄。直至TE中包含n-1條邊為止。
兩者均采用貪心思想。
-
-
單源最短路徑(假設(shè)以v1v_1v1?為起點,求v1v_1v1?到各頂點的最短路徑)vs 任意點最短路徑:
-
Dijkstra算法是單源最短路徑算法:把網(wǎng)中所有的頂點分成兩個集合S和T、S集合的初態(tài)只包含頂點v0, T集合的初態(tài)為網(wǎng)中除v0之外的所有頂點。凡以v0為源點,已經(jīng)確定了最短路徑的終點并入S集合中(記憶方法:Dijkstra中有Tesla(斯特拉 = 特斯拉),聯(lián)想到開車尋路,即兩點的最短路徑問題,可以和prim區(qū)分開)
-
Floyd算法是任意點最短路徑算法:核心代碼就有五行,主要用公式min(Dis(i,j),Dis(i,k)+Dis(k,j))min(Dis(i,j),Dis(i,k)+Dis(k,j))min(Dis(i,j),Dis(i,k)+Dis(k,j))來不斷優(yōu)化帶權(quán)鄰接矩陣,最后得到矩陣就是每對頂點之間的最短距離了
Dijkstra算法采用貪心思想,而Floyd算法采用動態(tài)規(guī)劃思想。
-
Note:
- 關(guān)鍵字e的同義詞,指的是其他關(guān)鍵字利用哈希函數(shù)進行求值時,得到的函數(shù)結(jié)果與e是一致的,此時這些關(guān)鍵字就是e的同義詞。在哈希表查找關(guān)鍵字e時成功且經(jīng)過多次比較,可以知道經(jīng)過計算e的位置。
- 采用線性探測法解決哈希沖突,此時該位置對同義詞開放,對非同義詞也是開放的,也就是說,其他非同義關(guān)鍵字在使用線性探測法解決沖突時,也有可能直接占據(jù)該位置。
有限自動機;正規(guī)式->NFA->DFA->最小化DFA->詞法分析器
Note:
- 不確定的有限自動機(NFA):NFA是一個五元組,M=(S,Σ,move,s0,F)
- S是有限個狀態(tài)的集合
- Σ是有限個輸入字符(包括ε)的集合
- move是一個狀態(tài)轉(zhuǎn)移函數(shù),move(si,ch) = sj表示當前狀態(tài)si下若遇到輸入字符ch,則遷移到狀態(tài)sj
- s0是唯一的初態(tài)
- F是終態(tài)集,它是S的子集,包含了所有的終態(tài)
- 確定的有限自動機(DFA):DFA是NFA的特例,其特點是某個狀態(tài)通過指定字符轉(zhuǎn)移到下一個狀態(tài)具有確定性,即對每一個狀態(tài)s和每一個字符a,最多有一個下一個狀態(tài)。
- NFA 和 DFA 能識別的字符串從初始態(tài)出發(fā),到終止態(tài)結(jié)束(期間可多次轉(zhuǎn)移至初始態(tài)或終止態(tài))
- 若兩個FA識別同一個正規(guī)集,則這兩個FA等價。對于每個NFA,都存在與之等價的DFA。
語法分析器的輸入
Note:
-
詞法分析是編譯過程的第一階段,其任務(wù)是對源程序從前到后(從左到右)逐個字符地掃描,從中識別出一個個的“單詞”符號(2019下半年20題中,詞法分析輸出的結(jié)果為 記號流,不是字符流(Java Reader)。
完成的工作:檢測非法字符、單詞拼寫錯誤等 -
語法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語言的語法規(guī)則將單詞符號序列分解成各類語法單位,如“表達式”、“語句”和“程序”等。
完成的工作:標點符號錯誤、表達式中缺少操作數(shù)、括號不匹配等有關(guān)語言結(jié)構(gòu)上的錯誤。 -
(靜態(tài))語義分析階段主要檢查源程序是否包含語義錯誤,并收集類型信息供后面的代碼生成階段使用。只有語法和語義都正確的源程序才能被翻譯成正確的目標代碼。
- 這里要注意的是語義錯誤有動態(tài)語義錯誤和靜態(tài)語義錯誤。靜態(tài)語義錯誤是指在編譯的語義分析階段可以發(fā)現(xiàn)。動態(tài)語義錯誤是指在運行時才能發(fā)現(xiàn)。在語義分析階段并不能識別出所有的語義錯誤,只能發(fā)現(xiàn)靜態(tài)語義錯誤。
- 完成的工作:完成類型檢查,運算符與運算對象類型不合法等錯誤。
-
目標代碼(機器碼)生成是編譯器工作的最后一個階段(動態(tài)語義分析)。這一階段的任務(wù)是把中間代碼(匯編語言) 變換成特定機器上的絕對指令代碼、可重定位的指令代碼或匯編指令代碼,這個階段的工作與具體的機器密切相關(guān)。
完成的工作:動態(tài)語義錯誤,包括陷入死循環(huán)、變量取零時做除數(shù)、引用數(shù)組元素下標越界等錯誤等。 -
從原理上講,對源程序進行語義分析之后就可以直接生成目標代碼,但由于源程序與目標代碼的邏輯結(jié)構(gòu)往往差別很大,特別是考慮到具體機器指令系統(tǒng)的特點,要使翻譯一次到位很困難,而且用語法制導(dǎo)方式機械生成的目標代碼往往是繁瑣和低效的,因此有必要設(shè)計一種中間代碼,將源程序首先翻譯成中間代碼表示形式,以利于進行與機器無關(guān)的優(yōu)化處理。
由于中間代碼實際上也起著編譯器前端和后端分水嶺的作用,所以使用中間代碼也有助于提高編譯程序的可移植性。常用的中間代碼有后綴式、三元式、四元式和樹(圖)等形式。中間代碼并不依賴于具體的機器。 -
源程序不可避免地會有一些錯誤,這些錯誤大致可分為語法錯誤和語義錯誤。
- 語法錯誤是指語言結(jié)構(gòu)上的使用錯誤,是指編譯時所發(fā)現(xiàn)的程序錯誤,如單詞拼寫錯誤、標點符號錯、表達式中缺少操作數(shù)、括號不匹配等有關(guān)語言結(jié)構(gòu)上的錯誤。
- 對于語義錯誤有動態(tài)語義錯誤和靜態(tài)語義錯誤。靜態(tài)語義錯誤為在編譯的語義分析階段可以發(fā)現(xiàn)。動態(tài)語義錯誤為在運行時才能發(fā)現(xiàn)。因此語義分析階段并不能發(fā)現(xiàn)程序中所有的語義錯誤。
上下文有關(guān)文法(1型文法)/ 上下文無關(guān)文法(2型文法),文法和正規(guī)式(四種文法)
Note:
-
上下文有關(guān)文法(1型文法):此文法對應(yīng)于線性有界自動機,它是在0型文法的基礎(chǔ)上增加了一條對于每一個a->b,都存在|a|<=|b|,這里的|b|表示的是b的長度,而不是絕對值。即由Ab->B不屬于1型文法,而A->Bba則屬于1型文法。即左側(cè)可以既有終結(jié)符也有非終結(jié)符。
-
上下文無關(guān)文法(2型文法):左側(cè)只含有一個非終結(jié)符,在推導(dǎo)式的過程中,左側(cè)會被完全替換掉,只起到一個中間的作用。如A->Ba符合2型文法要求,如Ab->Bab不是2型文法,因為Ab不是非終結(jié)符。
-
正規(guī)文法(3型文法):它對應(yīng)于有限狀態(tài)自動機,它是在2型文法的基礎(chǔ)上滿足:A->a|aB(右線性)或A->a|Ba(左線性)。如果有A->a,A->aB,B->a,B->cB則符合3型文法的要求。但是A->ab,A->aB,B->a,B->cB或A->a,A->Ba,B->a,B->cB則不符合3型文法的要求。正規(guī)文法要求,不能夠推導(dǎo)出兩個終結(jié)符,而且左線性和右線性只能使用一種,不能夠同時出現(xiàn)。
-
大多數(shù)程序設(shè)計語言的語法規(guī)則用 上下文無關(guān)文法 來描述。
編譯原理之求FIRST集,FIRST集合FOLLOW集
正規(guī)文法和正規(guī)式的相互轉(zhuǎn)換(理解正規(guī)文法的概念,以及正規(guī)式轉(zhuǎn)正規(guī)文法的規(guī)定)
正規(guī)式和有限自動機的轉(zhuǎn)換(有限自動機轉(zhuǎn)正規(guī)式的3個圖 / 正規(guī)式轉(zhuǎn)有限自動機的3個圖)
根據(jù)文法進行表達式推導(dǎo)
什么是腳本,腳本語言?
Note:
- 腳本語言是介乎于 HTML 和諸如 JAVA 、 Visual Basic 、 C++ 等編程語言之間的一種特殊的語言。常見的腳本語言有:Python、JavaScript。
- 腳本語言一般都有相應(yīng)的腳本引擎來解釋執(zhí)行,是一種解釋性語言,一般需要解釋器才能運行。也就是指令被立即執(zhí)行,不存在一個編譯的中間狀態(tài)。
- 腳本語言運行效率比匯編語言低。
- 動態(tài)程序一般有兩種實現(xiàn)方式,一是二進制方式,一是腳本方式。
- 二進制方式是先將我們編寫的程序進行編譯,變成機器可識別的指令代碼(如.exe文件),然后再執(zhí)行。
- 腳本簡單地說就是一條條的文字命令,以文本形式存在。
- 編譯和解釋是語言處理的兩種基本方式。
- 編譯過程包括詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標代碼生成等階段,以及符號表管理與出錯處理模塊。
- 解釋過程在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但是在運行用戶程序時,它直接執(zhí)行源程序或源程序的內(nèi)部形式(解釋過程不會生成目標程序)。
- 這兩種語言處理程序的根本區(qū)別是:
- 在編譯方式下,機器上運行的是與源碼程序等價的目標程序,源程序和編 譯程序都不再參與目標程序的執(zhí)行過程;
- 而在解釋方式下,解釋程序和源程序(或其某種等價表示)要參與到程序的運行過程中,運行程序的控制權(quán)在解釋程序。
- 在編譯方式下,詞法、語法和語義分析是必須要進行的工作,而生產(chǎn)中間代碼和優(yōu)化則是可以進行也可以不進行。
編譯與反編譯詳解,C語言編譯過程(預(yù)處理,編譯(匯編碼),匯編(機器碼),鏈接)
Note:
- 編譯是將高級語言源程序 翻譯成 機器語言程序(匯編形式或機器代碼形式),反編譯是編譯的逆過程。
- 反編譯通常不能把可執(zhí)行文件 還原成 高級語言源代碼,只能轉(zhuǎn)換成功能上等價的匯編程序。
可視化程序設(shè)計的基本理論
Note:
- 可視化程序設(shè)計主要是讓程序設(shè)計人員利用軟件本身所提供的各種控件,像搭積木式地構(gòu)造應(yīng)用程序的各種界面。
- 可視化程序設(shè)計最大的優(yōu)點是設(shè)計人員可以不用編寫或只需編寫很少的程序代碼,就能完成應(yīng)用程序的設(shè)計,這樣就能極大地提高設(shè)計入員的工作效率。
- 在可視化程序設(shè)計中,采用解釋方式可隨時查看程序的運行效果。
- 能進行可視化程序設(shè)計的語言很多,比較常用的有微軟的Visual Basic、Visual C++、Visual C#、中文Visual Foxpro、Borland公司的Delphi等。
強類型&弱類型語言、動態(tài)&靜態(tài)語言有什么區(qū)別,強類型語言和弱類型語言的區(qū)別
Note:
- 強類型語言有些類型不支持隱式類型轉(zhuǎn)換,需要通過強制類型轉(zhuǎn)換才可實現(xiàn),比如java,python;python代碼如下:b = 3 c = 3.1415926 print(b + c) --- 6.1415926a = "123" b = 3 print(a + b) --- TypeError: can only concatenate str (not "int") to str 弱類型語言中所有類型都支持隱式類型轉(zhuǎn)換,比如js,php;js代碼如下:var a = "123" var b = 3 console.log(a + b) --- 1233 對于弱類型語言,需要弄清楚不同類型之間是如何隱式變換的,比如str + int →\rightarrow→ str
- 動態(tài)類型語言在運行期間才去做數(shù)據(jù)類型檢查(python);而靜態(tài)類型語言在編譯期間就去做數(shù)據(jù)類型檢查(java,c++)。
- 許多程序設(shè)計語言規(guī)定,程序中的數(shù)據(jù)都必須具有類型,其作用包括:
- 便于為數(shù)據(jù)合理分配存儲單元;
- 便于對參與表達式計算的數(shù)據(jù)對象進行檢查;
- 便于規(guī)定數(shù)據(jù)對象的取值范圍及能夠進行的運算;
Note:
- 聲音(音頻)信號的一個基本參數(shù)是頻率,它是指聲波每秒鐘變化的次數(shù),用Hz表示。人耳能聽到的音頻信號的頻率范圍是 20Hz ~ 20KHz。
- CIF是Common Intermediate Format的簡稱,即常用的標準化圖像格式。在H.323協(xié)議簇中,規(guī)定了視頻采集設(shè)備的標準采集分辨率CIF=352×288像素。
- 使用150DPI的掃描分辨率掃描一幅3×4英寸的彩色照片,得到原始的24位真彩色圖像的數(shù)據(jù)量是3?4?150?150?24/8=8100003 * 4 * 150 * 150 *24 / 8 = 8100003?4?150?150?24/8=810000 字節(jié)
- 矢量圖中的圖形元素稱為圖元。而另一類圖具有代表性的圖像表示形式是位圖圖像,該圖采用像素來表示圖。
- 某數(shù)碼相機內(nèi)置128MB的存儲空間,拍攝分辨率設(shè)定為1600×1200像素,顏色深度為24位(bit),若不采用壓縮存儲技術(shù),使用內(nèi)部存儲器最多可以存儲 128?1024?1024?8/(1600?1200?24)=23128 * 1024 * 1024 * 8 / (1600 * 1200 * 24 ) = 23128?1024?1024?8/(1600?1200?24)=23 張照片(顏色空間為2242^{24}224種顏色,而存儲空間只有8位)。
- 計算機通過MIC(話筒接口) 收到的信號是模擬信號:通過話筒傳入計算機的是人類的聲音,而這種聲音信號是一種連續(xù)的模擬信號,而非離散的數(shù)字信號,在接收到模擬信號以后,經(jīng)過采樣、量化等工作將模擬信號轉(zhuǎn)換為數(shù)字信號在計算機中處理。
- 未經(jīng)壓縮的數(shù)字音頻數(shù)據(jù)傳輸率可按下式計算:數(shù)據(jù)傳輸率(b/s)=采樣頻率(Hz) ×量化位數(shù)(b)×聲道數(shù),比如對于44.1khz、樣本精度為16b/s的雙聲道數(shù)字音頻其數(shù)據(jù)傳輸率為44.1 * 16 * 2 = 1411.2kb/s
Note:
- 按照我國著作權(quán)法的權(quán)利保護期,署名權(quán),修改權(quán)和保護作品完整權(quán)受到永久保護。
- 其中法律依據(jù),著作權(quán)法規(guī)定“執(zhí)行本單位的任務(wù)或者主要是利用本單位的物質(zhì)條件所完成的職務(wù)作品,其權(quán)利屬于該單位。”
- 某軟件公司參與開發(fā)管理系統(tǒng)軟件的程序員張某,辭職到另一公司任職,于是該項目負責人將該管理系統(tǒng)軟件上開發(fā)者的署名更改為李某(接張某工作),該項目負責人的行為侵犯了張某開發(fā)者身份權(quán)(署名權(quán))。
- 著作權(quán)有可復(fù)制性。著作權(quán)的對象是作品,是指文學、藝術(shù)、和科學領(lǐng)域內(nèi)具有獨創(chuàng)性并能以某種有形形式復(fù)制的智力成果,因此,著作權(quán)必然具有可復(fù)制性,但是復(fù)制并原封不動發(fā)行別人的作品就屬于侵權(quán)。
- 軟件著作權(quán)保護目標程序、源程序、軟件文檔,但不包護開發(fā)軟件的所有操作方法(比如IDE等工具)(2021上12)
- 據(jù)《中華人民共和國商標法》,煙草制品中必須使用注冊商標。
- 甲乙兩公司的財務(wù)軟件產(chǎn)品功能基本一致,這兩公司分別申請“大堂”和“大唐”商標注冊(無法區(qū)分誰先使用)。兩財務(wù)軟件相似,且經(jīng)協(xié)商雙方均不同意用其申請注冊的商標標識。此情形下由甲乙抽簽結(jié)果確定誰獲準注冊。但如果甲第一次使用時間為2019年7月,而乙第一次使用時間為2019年5月,如果兩公司同一天申請注冊商標,則乙公司的"大唐"獲準注冊。
原因分析:- 這個是同一類產(chǎn)品,構(gòu)成近似商標,“近似商標”是指文字、數(shù)字、圖形、三維標志或顏色組合等商標的構(gòu)成要素的發(fā)音、視覺、含義或排列順序及整體結(jié)構(gòu)上雖有一定區(qū)別,但又使人難以區(qū)分,容易產(chǎn)生混滑的商標。上述案例會產(chǎn)生商標故不能同時注冊。由雙方協(xié)商決定。
- 首先第一原則是,誰先申請誰獲得;其次,同時申請時,誰先使用誰獲得;
如果無法區(qū)分誰先使用,則協(xié)商歸屬,協(xié)商不成可以抽簽決定。
Note:下午案例分析題共5道題,每題15分。算法題變化性較大,個人建議要保證1,2,3,5題的正確性,爭取每題拿到12分以上。
1、結(jié)構(gòu)化分析
- 數(shù)據(jù)流圖(結(jié)構(gòu)化分析)
Note:-
數(shù)據(jù)流圖中存在3種數(shù)據(jù)流向:
-
1)實體(E) →\rightarrow→ 加工(P)→\rightarrow→ 存儲(D)
-
2)實體(E) ←\leftarrow← 加工(P)←\leftarrow← 存儲(D)
-
3)加工(P) →\rightarrow→ 加工(P)(例如2021上半年案例分析:P1(車輛識別) →\rightarrow→ 車輛入場信息 →\rightarrow→ P5(道閘控制) )
-
不存在E →\rightarrow→ E,D →\rightarrow→ D,D→\rightarrow→ E,E →\rightarrow→ D的數(shù)據(jù)流,必須有P加工的過程。
-
-
數(shù)據(jù)流圖的題目經(jīng)常會問存儲(D)的名稱,最簡單的解題規(guī)范:“直接使用數(shù)據(jù)流傳入 或 傳出的名稱” + “信息表”,比如2019年上半年題1:
其中D2為學生信息,D3為校園場所信息;如果想要獲得更準確的D的名稱,可以在"數(shù)據(jù)流缺失問題求解"上進行修補。比如2021年上半年題1:D2初定為會員信息表,后來確定為兩張表:車位信息表和車主余額表。
-
在問數(shù)據(jù)流圖缺失情況時(補充圖中缺失的數(shù)據(jù)流及其起點和終點),即分析數(shù)據(jù)流圖中的 數(shù)據(jù)流向 是否完整(是否滿足上面2種),如果不完整,再判斷該數(shù)據(jù)流圖是否存在“分布式”存儲:
- 步驟1:比如2019年上半年題1,D2、D1的數(shù)據(jù)流向雖然不完整,但是是“分布式”存儲,因此缺失的數(shù)據(jù)流從D4、D3開始分析:
- 步驟2:經(jīng)過補充后圖中的數(shù)據(jù)流向是完整的,接著從題目中挖掘,分析是否存在某個字段信息沒有被存儲,由于題目中要求學生信息中要包含家長ID,這時就找到了D2。
如何對步驟2中題干內(nèi)容的提煉,決定著我們是否能找到缺失數(shù)據(jù)流的關(guān)鍵,以2021年上半年案例分析為例,題干內(nèi)容和數(shù)據(jù)流圖如下,假設(shè)我們已知:E1:汽車,E2:車主,E3:支付系統(tǒng),E4:管理人員,E5:道閘控制系統(tǒng);D1:停車記錄表,D2:用戶或車主賬號儲存余額表/會員信息表,D3:車位信息表/基礎(chǔ)信息表。
1、信息維護。管理人員E4對車位(總數(shù)、空余車位數(shù)等)計費規(guī)則等基礎(chǔ)信息D3進行設(shè)置。
2、會員注冊。車主E2提供手機號、車牌號等信息D3進行注冊,提交充值信息D2(等級、綁定并授權(quán)支付系統(tǒng)進行充值或交費的支付賬號),不同級別和充值額度享受不同停車折扣點。
3、車牌識別。當車輛E1進入停車場時,若有(空余車位數(shù)大干1),自動識別車牌號P1后進行道閘控制P5 ,當車主開車離開停車場時,識別車牌號P1,計費成功P3后,請求道閘控制P5。
4、計費。更新車輛離場時間,根據(jù)計費規(guī)則計算出停車費用,若車主E2是會員,提示停車費用P2:若儲存余額夠本次停車費用,自動扣費P3,更新余額D2 ,若儲值余額D2不足,自動使用授權(quán)繳費賬號請求支付系統(tǒng)E3進行支付,獲取支付狀態(tài)。若非會員臨時停車,提示停車費用,車主通過掃描費用信息中的支付碼調(diào)用支付系統(tǒng)E3自助交費P3,獲取支付狀態(tài)。
5、道閘控制。根據(jù)道閘控制P5請求向道閘控制系統(tǒng)E5發(fā)送若干放行指令和接收道閘執(zhí)行狀態(tài)。若道閘執(zhí)行狀態(tài)為正常放行時,對入場車輛,(道閘控制P5)將車牌號及其入場時間信息存入停車記錄,修改空余車位數(shù)D3 ;(道閘控制P5)對出場車輛更新停車狀態(tài),修改空余車位數(shù)D3。當因道閘重置系統(tǒng)出現(xiàn)問題(斷網(wǎng)斷電或是故障為抬杠等情況),而無法在規(guī)定的時間內(nèi)接收到其返回的執(zhí)行狀態(tài)正常放行時, 系統(tǒng)P5向管理人員發(fā)送異常告警信息,之后管理人員E4安排故障排查處理P4 ,確保車輛有序出入停車場。
問:缺失數(shù)據(jù)流及其起點和終點?
答題思路:已完成1~2題對實體(E)和存儲(D)的補充之后,先從題干中圈出并標記每個實體E,加工P和存儲D,然后再通過標記去逐一檢查那條數(shù)據(jù)流丟失了,一般丟失情況包括一開始介紹的3種數(shù)據(jù)流情況。如上面刪除線表示:
標準答案為:- P3到D2:余額(若儲存余額夠本次停車費用,自動扣費,更新余額)
- P5到D3:車位數(shù)(修改空余車位數(shù))
- P1到P5:車輛入場信息
- P4到P5:故障排查處理
- 步驟1:比如2019年上半年題1,D2、D1的數(shù)據(jù)流向雖然不完整,但是是“分布式”存儲,因此缺失的數(shù)據(jù)流從D4、D3開始分析:
-
在問數(shù)據(jù)流“學生狀態(tài)”,“學生信息” 的組成時,其實是在問這些數(shù)據(jù)在數(shù)據(jù)庫中用哪些字段進行存儲,此時需要結(jié)合題意和數(shù)據(jù)流圖進行分析。
- 學生狀態(tài)包括:學生卡ID,學生心率,體溫(攝氏度)等健康指標及其所在位置等信息;
- 學生信息包括:家長ID,學生ID,學生卡ID,班主任等信息
-
如果要求使用結(jié)構(gòu)化語言對業(yè)務(wù)需求進行分析時,解題步驟為:
- 1)從題干中抽取“動詞 + 名詞” 或者 “名詞 + 動詞”,而不是直接COPY整個句子。
- 2)從題干內(nèi)容中提煉出IF,WHILE:比如2021上半年1題中,車輛入場和出場是想對的概念,因此是IF;比如2020下半年1題中,圖像采集是一個WHILE過程。
- 3)利用偽代碼(參考latex代碼格式,參考Latex寫偽代碼)書寫,常見語法包括:while(...) do {xxx} end while,if(...) then {xxx} end if
例如2020下半年第一題,需求如下,要求用結(jié)構(gòu)化語言對缺陷檢測的加工邏輯進行描述。
缺陷檢測。根據(jù)檢測模型和檢測質(zhì)量標準對圖像采集所收到的產(chǎn)品檢測信息中所有圖像進行檢測或所有圖像檢測合格。若一個產(chǎn)品出現(xiàn)一張圖像檢測不合格,就表示該產(chǎn)品不合格,對不合格產(chǎn)品,其檢測結(jié)果包括,產(chǎn)品型號和不合格類型。
WHILE(接收圖像)DO{檢測所收到的所有圖像;IF(出現(xiàn)一張圖像檢測不合格)THEN{返回產(chǎn)品不合格;不合格產(chǎn)品檢測結(jié)果=產(chǎn)品星號+不合格類型;}END IF }END WHILE
參考答案:
-
2、數(shù)據(jù)庫設(shè)計
- 實體聯(lián)系圖(ER圖有實體(entity)、屬性(attribute)、關(guān)系(relationship)三部分),『數(shù)據(jù)庫』 E-R圖(實體聯(lián)系圖)你都不會,你設(shè)計什么數(shù)據(jù)庫?
Note:- 用矩形框表示實體型,矩形框內(nèi)寫明實體名稱;
- 用橢圓框表示 實體的屬性,將屬性名記入框中;(矩形框 或者 菱形框 都可以通過橢圓框添加屬性)
- 用菱形框表示實體型之間的關(guān)系,在菱形框內(nèi)寫明關(guān)系名,即實體 – 聯(lián)系 – 實體;而關(guān)聯(lián)關(guān)系的一般性約束包括:一對一(1 : 1),一對多(1 : *),多對多(* : *)的關(guān)系
- 用實心連線表示:實體與屬性之間;實體與聯(lián)系之間;聯(lián)系與屬性之間用直線相連,并在直線上標注聯(lián)系的類型。
- 一文搞懂候選碼、主碼、全碼、外碼、主屬性、主鍵、主關(guān)鍵字、非主屬性清晰總結(jié)(候選碼(畫圖后)可以遍歷所有屬性),什么是外鍵/外鍵的作用(如果一個實體的某個字段指向另一個實體的主鍵則稱為外鍵;主從表關(guān)系;作用是保證數(shù)據(jù)的一致性)
Note:-
如果一名培訓(xùn)師可以講授多門課程、一門課程可由多名培訓(xùn)師講授,如果關(guān)系模式設(shè)計如下:
- 員工(員工號,姓名,部門號,崗位,基本工資,電話,家庭住址);
- 講授(課程號,員工號,培訓(xùn)地點)
- 課程(課程號,課程名稱,學時)
則關(guān)于講授關(guān)系的主鍵為 (課程號,員工號);講授關(guān)系的外鍵為 (課程號,員工號),即這兩個字段分別對應(yīng) 員工表 和 課程表的主鍵。(2019下半年第二題)
-
如果A->BC,B->D,則存在傳遞依賴A->D;比如關(guān)系模式設(shè)計如下:
- 部門(部門號,部門名,部門負責人,電話)
- 員工(員工號,姓名,部門號,崗位,基本工資,電話,家庭住址);
- 崗位 (崗位號,基本工資)
題目給定不同崗位設(shè)置不同的基本工資,因此員工號(主鍵A)可以決定崗位號(B),崗位號(主鍵B)可以決定基本工資(C),則員工與基本工資之間存在傳遞依賴。(2019下半年第二題)
-
比如問某個字段(所屬公司代碼,投資方編號)的完整性約束關(guān)系(2019年上半年第二題),則把該字段在哪個表中作為外鍵,主鍵都羅列出來,比如:
- 員工 - 外鍵:所屬公司代碼
- 項目 - 外鍵:投資方編號
- 項目 - 主鍵:(項目編號,投資方編號)組合
有時要注意題干中給出的字段信息不全,主鍵/外鍵信息可能沒有明確在題干中顯示,需要自己歸納出一個字段名(比如2020年下半年第二題),題干如下:
業(yè)務(wù)部關(guān)系模式需要記錄的信息包括業(yè)務(wù)部的編號、名稱、地址、電話和分公司編號,業(yè)務(wù)部編號唯一標記分公司關(guān)系模式中的每一個元素,每個業(yè)務(wù)部各有一名主管負責業(yè)務(wù)部的管理工作,每個業(yè)務(wù)部有多名職員,每個職員只能來源于一個業(yè)務(wù)部。
在確定業(yè)務(wù)部關(guān)系模式中的主外鍵時,業(yè)務(wù)部的主鍵很容易得到,即業(yè)務(wù)部的編號,但業(yè)務(wù)部的外鍵不單單只有分公司編號,還有主管編號(題目中未明確給出,建議參照第二問的ER圖歸納得到)。
-
- 數(shù)據(jù)庫范式 & 模式分解 詳細介紹(1NF,2NF,3NF,BCNF,4NF), 數(shù)據(jù)庫的規(guī)范理論
Note:-
如果題目中問表設(shè)計是否合理時,可以從數(shù)據(jù)是否存在冗余、插入異常、更新異常、刪除異常等問題考慮。比如2020下半年第二題問:
職員關(guān)系模式需要記錄的信息包括職員號、姓名、所屬業(yè)務(wù)部編號、崗位、電話、家庭成員姓名和成員關(guān)系。在職員關(guān)系模式中,假設(shè)每個職員有多名家庭成員,那么職員關(guān)系模式存在什么問題?應(yīng)如何解決?
在原來的職員關(guān)系表中,主鍵為(職員號,家庭成員姓名),有些非主屬性存在部分依賴于職員號,即該表符合1F但不符合2F。這里可以將字段(職員號,家庭成員姓名)從表中抽離出來,并共同構(gòu)成主鍵。
參考答案為:對職員關(guān)系模式進行拆分,職員1(職員號、姓名、崗位、所屬業(yè)務(wù)部編號,電話);職員2(職員號,家庭成員姓名,關(guān)系)。這樣非主屬性完全依賴于碼(2F)。
-
3、統(tǒng)一建模語言UML
- ER圖和類圖之間的關(guān)系,用例圖、類圖、順序圖操作
Note:- 在用例圖中:
- 每個用例用 “動詞 + 名詞” 來表示,比如2020下半年第三題題干中寫的是:“將房產(chǎn)信息從系統(tǒng)中刪除”,在寫用例時則要替換成:“刪除系統(tǒng)中的房產(chǎn)信息”。
- 關(guān)聯(lián)關(guān)系包含3種:包含,擴展和繼承;參考 用例圖里3種關(guān)系的內(nèi)涵和2021年上半年題3
- include:基用例是一個抽象的用例,不能單獨作為一個完整用例,需要配合子用例使用
- extend:基用例是一個擴展點,子用例在執(zhí)行時必須先激活基用例;
- generalize:子用例繼承基用例的所有屬性和通信方式, 與extend不同的是,基用例并不是一個擴展點,子用例在執(zhí)行時不需要先激活基用例;
- 參與者不一定是人
- 在類圖中(類可分為3種,不一定是現(xiàn)實中的實體類):
-
類圖是軟件的藍圖,用于詳細描述系統(tǒng)內(nèi)各個對象的相關(guān)的類,以及這些類之間的靜態(tài)關(guān)系。設(shè)計類是已經(jīng)完成了規(guī)格說明并且達到能夠被實現(xiàn)程度的類。
-
類組件:類名 - 如果是抽象類需要斜體
-
類屬性:可見性 名稱:類型 [=缺省值]
+(public),–(private), #(protected) ~(package) -
六種類間關(guān)系(耦合度由低到高):依賴關(guān)系use-a、關(guān)聯(lián)關(guān)系has-a、聚合關(guān)系(has a)、組合關(guān)系(contain a)、泛化關(guān)系is a、實現(xiàn)關(guān)系(類與接口)
-
類可以分為三種:實體類、接口類(邊界類)和控制類。
- 實體類的對象表示現(xiàn)實世界中真實的實體,如人、物等。
- 接口類(邊界類)的對象為用戶提供一種與系統(tǒng)合作交互的方式,分為人和系統(tǒng)兩大類,其中人的接口(用戶界面)可以是顯示屏、窗口、Web窗體、對話框、菜單、列表框、其他顯示控制、條形碼、二維碼或者用戶與系統(tǒng)交互的其他方法。系統(tǒng)接口涉及把數(shù)據(jù)發(fā)送到其他系統(tǒng),或者從其他系統(tǒng)接收數(shù)據(jù)。
- 控制類的對象用來控制活動流,充當協(xié)調(diào)者。
-
實體類是應(yīng)用領(lǐng)域的核心類,一般用于保存系統(tǒng)中的信息以及提供針對這些信息的相關(guān)處理行為,主要負責數(shù)據(jù)和業(yè)務(wù)邏輯;
-
接口類(邊界類)是系統(tǒng)內(nèi)對象和系統(tǒng)外參與者的聯(lián)系媒介,負責和用戶進行交互,即用戶界面;
-
控制類主要是協(xié)調(diào)實體類和邊界類之間的交互。
-
- 在進行用例描述時,必須包括基本事件流和備選數(shù)據(jù)流,參考場景法:基本流、備選流、構(gòu)造場景
- 基本事件流:按照正確的業(yè)務(wù)流程來實現(xiàn)的一條操作路徑;
- 備選數(shù)據(jù)流:導(dǎo)致程序出現(xiàn)錯誤的操作流程;
- 在用例圖中:
- 用例圖里3種關(guān)系的內(nèi)涵(include基用例為抽象用例;extend基用例為擴展點;generalize基用例被子用例繼承)
Note:
用例之間的include,extend和generalize關(guān)系的內(nèi)涵。- include:包含關(guān)系,當兩個或多個用例中共用一組相同的動作,這時可以將這組相同的動作抽出來作為一個獨立的子用例,供多個基用例共享。因為子用例被抽出,基用例并非一個完整的用例,所以include關(guān)系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執(zhí)行。include關(guān)系在用例圖中使用帶箭頭的虛線表示(在線上標注<<include>>),箭頭從基用例指向子用例。如2021上半年題3,文字描述和用例圖如下:
3)確認處方。患者登錄后,可以查看醫(yī)生開具的所有處方。患者選擇需要抓藥的處方和數(shù)量(需要抓幾副藥),同時說明是否需要煎制。選擇取藥方式:自行到店取藥或者送藥上門,若選擇送藥上門,患者需要提供提供收貸人姓名、聯(lián)系方式和收貨地址。系統(tǒng)自動計算本次抓藥的費用,患者可以使用微信或支付寶等支付方式支付費用。支付成功之后,處方被發(fā)送給藥師進行藥品配制。
答:因為U1作為基用例,即抽象的用例,需要配合U2子用例一起使用,由題干可知U1:確認處方,U2:支付 - extend:擴展關(guān)系,表示對基用例的擴展。基用例是一個完整的用例,即使沒有子用例的參與,也可以完成一個完整的功能。extend的基用例中存在一個擴展點,只有當擴展點被激活時,子用例才會被執(zhí)行。extend關(guān)系在用例圖中也使用帶箭頭的虛線表示(在線上標注<<extend>>),但箭頭是從子用例指向基用例。
- generalize:泛化關(guān)系,是一種繼承關(guān)系。子用例將繼承基用例的所有行為關(guān)系和通信關(guān)系,也就是說在任何使用基用例的地方都可以用子用例來代替。泛化關(guān)系在用例圖中使用實線空心箭頭表示,箭頭方向從子用例指向基用例。
如2021上半年題3,文字描述和用例圖如上,由題干可知:U3,U4繼承于U2(支付) ,而U1(確認處方) 又包含著U2(支付) ,因此U3、U4分別為微信支付、支付寶支付。
- include:包含關(guān)系,當兩個或多個用例中共用一組相同的動作,這時可以將這組相同的動作抽出來作為一個獨立的子用例,供多個基用例共享。因為子用例被抽出,基用例并非一個完整的用例,所以include關(guān)系中的基用例必須和子用例一起使用才夠完整,子用例也必然被執(zhí)行。include關(guān)系在用例圖中使用帶箭頭的虛線表示(在線上標注<<include>>),箭頭從基用例指向子用例。如2021上半年題3,文字描述和用例圖如下:
4、設(shè)計模式
- Java中常用的設(shè)計模式(23種)
- JAVA實現(xiàn)23種設(shè)計模式
Note:- 歷年題型整理:
- 生成器模式:2017上,2018上
- 橋接模式(無類圖):2017下
- 狀態(tài)模式:2018下
- 策略模式:2019上
- 觀察者模式:2019下
- 組合模式:2021上
- 答題技巧:該題型較為簡單,不要求對設(shè)計模式有較深的理解(難的考點已放在上午題了),該題更注重的是代碼的閱讀理解能力。選擇擅長的編程語言(C++/Java二選一),利用接口與實現(xiàn)類、抽象類與子類的關(guān)系,直接進行代碼填充即可(試了2017~2021的設(shè)計模式題,親測有效)。
- 可以通過設(shè)計模式題目中給出的類圖,理解要實現(xiàn)什么一個功能,而在代碼填充上主要還是依賴于平時對編程語言的熟悉掌握程度,以及代碼的閱讀理解能力;
- 注意不要馬虎大意,比如多寫了標點符號,少寫了abstract等
- 歷年題型整理:
總結(jié)
以上是生活随笔為你收集整理的【软考】软件设计师知识点整理(待更新)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eviews3种面板模型的选择-F检验操
- 下一篇: 什么原数据更容易平稳_时序数据处理难题攻