\(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消。取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是如今的\(CSP-J/S\)。做为一名于2019年1月入\(OI\)的蒟蒻\(OIer\),没能参加\(NOIP\)是我一辈子的遗憾。但在遗憾之余,我不得不备战\(CSP\)的认证。而\(CSP\)非专业级认证的第一轮(也就是\(NOIP\)初赛)经常使某些大神\(OIer\)(就是对基础知识不太了解)无缘复赛...因此今天来盘一下初赛知识点,顺带着本身也学习一下......html
图灵奖:由ACM(美国计算机协会)设立于1966年。是“计算机界的诺贝尔奖”。算法
冯·诺依曼奖:由IEEE设立。编程
对信息科学作出突出贡献的大神:图灵(因此才有个奖),冯 · 诺伊曼数组
中国获图灵奖的大神:姚期智(清华就有姚班,就是以他的名字命名的)数据结构
世界第一台电子计算机:埃尼阿克(\(ENIAC\)),于1946年2月14日(够虐狗的)在美国宾夕法尼亚大学诞生。又被叫作电子管计算机。编程语言
分两类:面向对象和面向过程。函数
高级语言须要编译运行,常数较大,运行速度慢。而低级语言常数极小,运行速度快。此外,高级语言更容易移植。工具
汇编学习
C++,Java,EIFFEL,Simula 67等。编码
C,Fortran语言。
递归是指一种经过重复将问题分解为同类的子问题而解决问题的方法。递归式方法能够被用于解决不少的计算机科学问题。简单来说,就是“自身调用自身”(在函数中)。
一、P类问题:若是一个问题能找到一个在多项式时间内解决它的算法,那么这个问题就是P问题。
二、NP类问题:注意:NP问题不是非P类问题,而是在多项式时间内验证一个解的问题。或者,咱们能够将其理解为在多项式时间内猜出一个解的问题。
三、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进制
二进制是计算机进行计算所使用的工具,天然也是很是常考的要点。二进制的相关知识有许多,甚至算法中的位运算也是二进制的相关内容,但为了过第一轮初赛,咱们只介绍一些理论知识。关于位运算的相关知识请有兴趣的同窗本身学习。
顾名思义,原码就是十进制数直接转换成二进制以后直接造成的二进制编码。
正数的补码是自己,负数的补码是其反码加一。
顾名思义:正数的反码是自己,负数的反码是其除符号位以外的全部位按位取反的结果。
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开始判断是否为真,而后执行某一个表达式,依次向上回溯。
\[ \frac{n\times (n-1)}{2} \]
连通图:顾名思义,连通图就是连通的图,即任意两点都能直接或间接到达,这就区别于彻底图必须直接用边到达的定义。
树:emm...直观来说,就是一张长得像树的图。定义是任意两点之间的简单路径有且只有一条。树是一棵连通且无环的图。它的边数是\(n-1\)。
二叉树有不一样的遍历方式,通常来说,咱们将其分红三类:先序遍历(也叫先根遍历)、中序遍历(中根遍历)以及后序遍历(后根遍历)。
先序遍历:遍历方式以下:根—左儿子—右儿子
中序遍历:遍历方式以下:左儿子—根—右儿子
后序遍历:遍历方式以下:左儿子—右儿子—根
咱们用一张图来理解一下这几种遍历方式。
这张图的先序遍历:1245367
中序遍历:4251637
后序遍历:4526731
一个推论:
先序遍历+中序遍历=一棵肯定的二叉树
后序遍历+中序遍历=一棵肯定的二叉树
先序遍历+后序遍历=啥也不是
图例以下:
图例以下:
一、对于一棵彻底二叉树来说,它的叶子节点为\(n\),则节点总数为\(2\times n-1\)。此结论可逆。
二、对于一棵满二叉树来说,它的层数(深度)为\(k\),则它的节点总数为\(2^k-1\)。此结论可逆。
本蒟蒻有一篇专门讲拓扑排序的讲解:
想象一个桶,你从上面往里扔砖,而后你想把某一块砖拿出来,你须要先拿出来你后扔进去的砖。这就是栈。栈的基本原则是:后进先出
来一发图示?
一篇专门的博客:
想象你在排队买票,这个队伍中的人都很是有素质,都自觉排队并且不会提早离开队伍。这样就只能从队首买完票再离开,从队尾进入队伍。队列的基本原则是:先进先出。
再来一发图示:
链表分两种:单向链表和双向链表。关于链表,我有一篇专门讲解的博客。有兴趣的读者请戳:
字符串子串的概念:字符串是一串字符(废话),它的子串被定义为:字符串中任意个连续的字符组成的子序列。
字符串子串个数的计算公式:
\[ \frac{n\times (n+1)}{2}+1 \]
(就是字符串长度等差数列)
若是是非空子串,就把那个一减去便可(子串个数的公式加一就是考虑空子串的状况)。
时间复杂度:渐进时间复杂度用符号\(O\) 表示。一个程序的语句执行次数能够用一个代数式表示,那么咱们取这个代数式的最高次项且忽略此项系数做为时间复杂度。若是一个程序的语句执行次数为 \(2n^3+3n^2+n+7\),那么这个程序的渐进时间复杂度为\(O(n^3)\)。
计算非递归程序的时间复杂度:简单粗暴,数循环。
常数:常数即为咱们忽略掉的\(O\)中最高次项的系数与低次项所带来的时间消耗。
空间复杂度:类比时间复杂度。看开空间开了多大。
计算空间占用量:根据咱们以上说过的计算机存储单位的知识:一个\(int\)占用的内存是\(4B\),因此咱们把开的\(int\)乘上4,再除以1024就是\(KB\),同理,再除\(1024\)就是\(MB\)。
公式:\(n\)为元素个数,\(M\)为最终答案(以\(MB\)为单位)
\[ M=\frac{4n}{1024\times 1024} \]
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
——傅思惟\(from\quad JDFZ\)