CSP-J/S 第一輪知識點選講
\(NOIP\)(全國青少年信息學奧林匹克競賽)於2019年取消。取而代之的是由\(CCF\)推出的非專業級軟件能力認證,也就是現在的\(CSP-J/S\)。作為一名於2019年1月入\(OI\)的蒟蒻\(OIer\),沒能參加\(NOIP\)是我一生的遺憾。但在遺憾之余,我不得不備戰\(CSP\)的認證。而\(CSP\)非專業級認證的第一輪(也就是\(NOIP\)初賽)常常使某些大神\(OIer\)(就是對基礎知識不太了解)無緣復賽...所以今天來盤一下初賽知識點,順帶着自己也學習一下......
信息學史及基本知識
一、信息學及計算機史
- 計算機的頂級獎項:圖靈獎、馮·諾依曼獎
圖靈獎:由ACM(美國計算機協會)設立於1966年。是“計算機界的諾貝爾獎”。
馮·諾依曼獎:由IEEE設立。
-
對信息科學做出突出貢獻的大神:圖靈(所以才有個獎),馮 · 諾伊曼
-
中國獲圖靈獎的大神:姚期智(清華就有姚班,就是以他的名字命名的)
-
世界第一台電子計算機:埃尼阿克(\(ENIAC\)),於1946年2月14日
(夠虐狗的)在美國賓夕法尼亞大學誕生。又被叫做電子管計算機。
二、關於編程
- 編程語言:
分兩類:面向對象和面向過程。
- 高級語言和低級語言的區別:
高級語言需要編譯運行,常數較大,運行速度慢。而低級語言常數極小,運行速度快。此外,高級語言更容易移植。
- 常見低級語言:
匯編
- 面向對象的高級語言:
C++,Java,EIFFEL,Simula 67等。
- 面向過程的高級語言:
C,Fortran語言。
- 遞歸編程:
遞歸是指一種通過重復將問題分解為同類的子問題而解決問題的方法。遞歸式方法可以被用於解決很多的計算機科學問題。簡單來講,就是“自身調用自身”(在函數中)。
- P類/NP類/NPC類問題:
1、P類問題:如果一個問題能找到一個在多項式時間內解決它的算法,那么這個問題就是P問題。
2、NP類問題:注意:NP問題不是非P類問題,而是在多項式時間內驗證一個解的問題。或者,我們可以將其理解為在多項式時間內猜出一個解的問題。
3、NPC類問題:定義如下:如果一個問題是NP問題,而且所有的NP問題都可以約化到它。那么它就是NPC類問題。再來介紹一下關於約化的定義:如果一個問題A可以約化為問題B,含義就是這個問題A可以用問題B的解法來解決。
三、關於計算機
先上張大圖:
-
重要設備:
硬件組成:
-
控制器(Control):是整個計算機的中樞神經,其功能是對程序規定的控制信息進行解釋,根據其要求進行控制,調度程序、數據、地址,協調計算機各部分工作及內存與外設的訪問等。
-
運算器(Datapath):運算器的功能是對數據進行各種算術運算和邏輯運算,即對數據進行加工處理。
-
存儲器(Memory):存儲器的功能是存儲程序、數據和各種信號、命令等信息,並在需要時提供這些信息。
-
輸入設備(Input system):輸入設備是計算機的重要組成部分,輸入設備與輸出設備合稱為外部設備,簡稱外設,輸入設備的作用是將程序、原始數據、文字、字符、控制命令或現場采集的數據等信息輸入到計算機。常見的輸入設備有鍵盤、鼠標器、光電輸入機、磁帶機、磁盤機、光盤機等。
-
輸出設備(Output system):輸出設備與輸入設備同樣是計算機的重要組成部分,它把外算機的中間結果或最后結果、機內的各種數據符號及文字或各種控制信號等信息輸出出來。微機常用的輸出設備有顯示終端CRT、打印機、激光印字機、繪圖儀及磁帶、光盤機等。
-
-
CPU及存儲:
CPU(中央處理器)=運算器+控制器+寄存器
運算器=算術邏輯運算單元(ALU)及浮點運算單元(FPU)
存儲器=內存儲器+外存儲器
BIOS是英文"Basic Input Output System"的縮略語,直譯過來后中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、系統設置信息、開機后自檢程序和系統自啟動程序。 其主要功能是為計算機提供最底層的、最直接的硬件設置和控制。
隨機存儲器RAM的“隨機”指“隨時訪問”
所以,我們記下來以下知識點:
斷電后可以保存數據:硬盤,ROM
斷電后不可以保存數據:顯存(顯卡內存),RAM,CPU
- 計算機各存儲單位及進位關系:
計算機的存儲單位有以下幾種:
\(TB/GB/MB/KB/B\)
他們之間的進位關系為1024(這應該是常識,沒打過比賽還沒玩過手機么?)
特殊地,\(1B=8(bit)\),這里的\(bit\)是二進制下的一位內存。
進制及進制轉化
十進制轉任意進制
將十進制轉換成\(N\)進制,只需把十進制數每次除\(N\)求余數,然后把余數逆序寫出來。
看不懂就看圖:
這是二進制的圖,其他進制就類比推一下就可以了。如果這個看不懂的話就不要參加初賽了,50塊錢買點啥不好...
任意進制轉十進制
簡單說就是:按位轉,第\(i\)位的數字乘以要轉換的進制的\(n-1\)次冪即可。
還是上圖:
任意進制互相轉化
這里考慮用十進制做中轉,先把\(A\)進制轉十進制,再把十進制轉\(B\)進制。
關於小數的進制轉換
十進制轉任意進制的小數不進行除法運算,而進行乘法運算后取整,取整后從前向后排列。
任意進制轉十進制的小數只需要乘上負指數,最后算出來即可。
各進制的字母表達
\(H(Hexadecimal)\)——16進制
\(D(Decimal)\)——10進制
\(O(Octonary)\)——8進制
\(B(Binary)\)——2進制
二進制的相關知識
二進制是計算機進行計算所使用的工具,自然也是非常常考的要點。二進制的相關知識有許多,甚至算法中的位運算也是二進制的相關內容,但為了過第一輪初賽,我們只介紹一些理論知識。關於位運算的相關知識請有興趣的同學自己學習。
- 1、原碼
顧名思義,原碼就是十進制數直接轉換成二進制之后直接形成的二進制編碼。
- 2、補碼
正數的補碼是本身,負數的補碼是其反碼加一。
- 3、反碼
顧名思義:正數的反碼是本身,負數的反碼是其除符號位之外的所有位按位取反的結果。
附:ASCII碼
ASCII碼的正規名稱是:美國信息交換標准代碼,是基於拉丁字母的一套電腦編碼系統。是最通用的信息交換標准。一共定義了128個字符。
這里不賦ASCII碼的轉換表。只給出幾種比較常用的轉換:
字符0→48
大寫字母A→65
小寫字母a→97
空格→32
換行→13
位運算
位運算不僅在初賽中是一個知識點分類,在復賽(即真正的程序設計與運用)的時候也有很大的一個應用。而且,位運算的相關知識是計算機運算的靈魂,更是每個程序猿應該理解的一種基本操作。
關於位運算的相關知識,本蒟蒻在另一篇專門的博客中詳細的講解。
為了應對初賽的筆試題,建議讀者在閱讀完這篇博客之后至少應該掌握:各種位運算的運算法則以及位運算優先級。
另外,對於位運算的優先級,本蒟蒻在后面的邏輯運算部分還會有詳細的解析。
邏輯運算
邏輯運算
邏輯運算一共有三種,每種都有兩種寫法:
邏輯非:!或 ┐
邏輯與:&& 或 ∧
邏輯或:|| 或 ∨
邏輯運算的優先級
非\(>\)與\(>\)或
位運算+邏輯運算的優先級
邏輯非(!,┐)=按位反(~)>位移運算(<<,>>)>不等號(>=,<=)>等號(==,!=)>按位與(&)>按位異或(^)>按位或(|)>邏輯與(&&,∧)>邏輯或(||,∨)
邏輯表達式
由邏輯運算復合而成,只有兩種結果:\(true\)和\(false\),在C/C++中,返回的值以\(0\)表示假,以\(1\)表示真。
條件表達式
條件表達式的基本形式如下:
<表達式1>?<表達式2>:<表達式3>
其表達意義是:如果表達式1成立,則執行表達式2,否則執行表達式3。其實也等價於\(if-else\)條件語句。例如下:
#define Min(a,b) a<b?a:b
注意:如果條件表達式有多個進行復合,那么在執行的時候需要從由往左依次判斷最后得出一個結果。即:右結合性。
比如:
<表達式1>?<表達式2>:<表達式3>?<表達式4>:<表達式5>
那么,在執行的時候是從3開始判斷是否為真,然后執行某一個表達式,依次向上回溯。
圖論理論知識
基本概念
- 完全圖:任意兩點都有邊相連,我們很容易推出來,一張完全圖的邊數為(\(n\)為節點個數)
-
連通圖:顧名思義,連通圖就是連通的圖,即任意兩點都能直接或間接到達,這就區別於完全圖必須直接用邊到達的定義。
-
樹:emm...直觀來講,就是一張長得像樹的圖。定義是任意兩點之間的簡單路徑有且只有一條。樹是一棵連通且無環的圖。它的邊數是\(n-1\)。
二叉樹的遍歷
二叉樹有不同的遍歷方式,一般來講,我們將其分成三類:先序遍歷(也叫先根遍歷)、中序遍歷(中根遍歷)以及后序遍歷(后根遍歷)。
-
先序遍歷:遍歷方式如下:根—左兒子—右兒子
-
中序遍歷:遍歷方式如下:左兒子—根—右兒子
-
后序遍歷:遍歷方式如下:左兒子—右兒子—根
我們用一張圖來理解一下這幾種遍歷方式。
這張圖的先序遍歷:1245367
中序遍歷:4251637
后序遍歷:4526731
-
一個推論:
先序遍歷+中序遍歷=一棵確定的二叉樹
后序遍歷+中序遍歷=一棵確定的二叉樹
先序遍歷+后序遍歷=啥也不是
特殊二叉樹及其性質
- 完全二叉樹:只有最后一層不是滿的,且最后一層的所有節點均集中在左側。
圖例如下:
- 滿二叉樹:節點個數已滿。
圖例如下:
- 特殊二叉樹的性質:
1、對於一棵完全二叉樹來講,它的葉子節點為\(n\),則節點總數為\(2\times n-1\)。此結論可逆。
2、對於一棵滿二叉樹來講,它的層數(深度)為\(k\),則它的節點總數為\(2^k-1\)。此結論可逆。
拓撲排序
本蒟蒻有一篇專門講拓撲排序的講解:
簡單數據結構基本理論
1、棧
想象一個桶,你從上面往里扔磚,然后你想把某一塊磚拿出來,你需要先拿出來你后扔進去的磚。這就是棧。棧的基本原則是:后進先出
來一發圖示?
附:前、中、后綴表達式
一篇專門的博客:
2、隊列
想象你在排隊買票,這個隊伍中的人都非常有素質,都自覺排隊而且不會提前離開隊伍。這樣就只能從隊首買完票再離開,從隊尾進入隊伍。隊列的基本原則是:先進先出。
再來一發圖示:
3、鏈表
鏈表分兩種:單向鏈表和雙向鏈表。關於鏈表,我有一篇專門講解的博客。有興趣的讀者請戳:
4、字符串
字符串子串的概念:字符串是一串字符(廢話),它的子串被定義為:字符串中任意個連續的字符組成的子序列。
字符串子串個數的計算公式:
(就是字符串長度等差數列)
如果是非空子串,就把那個一減去即可(子串個數的公式加一就是考慮空子串的情況)。
時空復雜度的計算
-
時間復雜度:漸進時間復雜度用符號\(O\) 表示。一個程序的語句執行次數可以用一個代數式表示,那么我們取這個代數式的最高次項且忽略此項系數作為時間復雜度。如果一個程序的語句執行次數為 \(2n^3+3n^2+n+7\),那么這個程序的漸進時間復雜度為\(O(n^3)\)。
-
計算非遞歸程序的時間復雜度:簡單粗暴,數循環。
-
常數:常數即為我們忽略掉的\(O\)中最高次項的系數與低次項所帶來的時間消耗。
-
空間復雜度:類比時間復雜度。看開空間開了多大。
-
計算空間占用量:根據我們以上說過的計算機存儲單位的知識:一個\(int\)占用的內存是\(4B\),所以我們把開的\(int\)乘上4,再除以1024就是\(KB\),同理,再除\(1024\)就是\(MB\)。
公式:\(n\)為元素個數,\(M\)為最終答案(以\(MB\)為單位)
PS:一般來講,比賽中所給的\(256MB\)內存可以開\(6\times 10^7\)個\(int\)類型的變量。另外,大數組必須開全局變量。如果扔在主函數里極容易爆棧。
數學、邏輯學及運籌學知識
- 排列組合:排列組合是每年必考知識點。但是這是一個比較大的課題。不僅是高二數學選修重點,也是數學編程的一個重要分支。關於排列組合及相關知識,我有一個專門講解排列組合的博客,歡迎讀者翻閱:
- 幻方
題目類型整理
題型 | 知識點類型 | 題目數量 |
---|---|---|
單選 | 信息學史&基本知識 | 8-10 |
單選 | C++語法知識點 | 2-3 |
單選 | 數據結構&算法 | 3-4 |
單選 | 數學&邏輯學&運籌學 | 3-4 |
單選 | 比賽相關知識 | 1-2 |
問題求解 | 數學 | 1 |
問題求解 | 數據結構 | 1 |
模擬程序運行 | C++語法&算法 | 4 |
完善程序 | C++語法&算法 | 2 |
閱讀&使用說明
因為本博客知識點較多,推薦大家一點點學、一點點用,不要一口氣讀完。(神犇請自動忽略這句話)作為一篇發表后不到一個月就在閱讀量上遙遙領先的博客,我感到極其的驚喜和感動。但是因為本蒟蒻太菜了,所以敬請有緣讀到這篇博客的各路大佬多支持多幫助,指正講解中的錯誤,並順手點一下推薦......
再次感謝大家的資瓷!!並祝大家\(CSP-S\quad 2019\quad RP++\)——UPD:2019.10.14