159号程序员
2021-08-15 22:47:33
本文适合普及组到提高组的同学学习,并且尽量做到优秀的排版和通俗易懂,少用缩写。
本文设定为读者已经学习过C++语法、基础算法(如排序)、各种计算机基础名词、小学~初中数学
本文的写作顺序为由易至难,笔者按照自己的理解给知识点分了难度。
标有
建议先预习CSP 2020 入门组第一轮/CSP 2020 提高组第一轮/CSP 2020 第一轮(初赛)模拟的前
迄今为止,初赛分为两个部分:
这里只介绍基础题的部分,程序题由于知识点过散,需要大家自己多做题,多看代码,缕清思路。
如果有对文章的建议/问题勘误均欢迎私信或在下方留言!
本 blog 目前只发布在洛谷上,不接受任何形式的转载/抄袭,除非得到原作者 @159号程序员 的许可。
计算机的分类
按年代分类
按性能分类
巨型机>大/中型机>小型机>微型机=工作站。
补:一般按照规模大小、性能、能耗等分类。
补:一般来说,巨型机的运算速度在平均每秒千万次以上,存储容量在千万位以上。
补:大型机和超级计算机(旧称巨型机)的主要区别:
大型机使用专用指令系统和操作系统,巨型机使用通用处理器及 UNIX 或类 UNIX 操作系统(如 Linux)。
大型机长于非数值计算(数据处理),巨型长于数值计算(科学计算)。
大型机主要用于商业领域,如银行和电信,而巨型用于尖端科学领域,特别是国防领域。
大型机大量使用冗余等技术确保其安全性及稳定性,所以内部结构通常有两套。而巨型机使用大量处理器,通常由多个机柜组成。
为了确保兼容性,大型机的部分技术较为保守。
补:小型机采用精简指令集处理器,性能和价格介于PC服务器和大型主机之间的一种高性能
补:小型机主要用于金融证券和交通等对业务的单点运行具有高可靠性的行业应用。
微型机:速度快,容量中,体积小。主要用于个人工作/处理数据,
工作站:速度快,容量中,体积小。用于辅助微型机工作。
空间换算
显然,这些数据单位的英文全称的第一个单词代表着这个数据单位的字节数。kilo,mega,giga,tera 是英文中的单位名,后面的 binary 代表着“在二进制下”。
例如,kilo 代表着数量单位“千”,kilobinary 代表着二进制意义下的“千”,也就是
mega 代表着数量单位“百万”,可以理解为
我们常把这些单位中的 i 省去,如:KB、MB。
生活中,还有一类常用的数据单位:
这些数据单位的英文全称中少了“binary”,所以这里的数量单位代表着十进制下的数据单位,如 kilo byte 代表
注意到,这些数据单位和上一种数据单位的简写是相同的。若无特殊说明,使用第一种数据单位,即 KB 默认代表
补:我们常常会遇到硬盘标注大小和计算机内显示大小不同的问题。这其实是硬盘厂商为了节约成本玩的文字游戏。他们在硬盘上标注的 GB 其实代表 giga byte ,而不是我们默认的 giga binary byte。
我们设硬盘上标注的大小为
重要贡献人员
艾伦·图灵(英):数学家,逻辑学家,计算机科学/人工智能之父,首次提出了计算机科学理论。计算机界的最高奖项“图灵奖”以他命名,被称为“计算机界的诺贝尔奖”。
冯·诺依曼(美):科学家,现代计算机之父,首次提出了存储程序控制原理,称为“冯·诺依曼结构”。
克劳德·香农(美):科学家,创造了信息论,提出了某种信息从一处传送到另一处所需的全部设备所构成的系统。
习题
计算机的构成
要想实现计算机的基础功能,计算机必须由运算器、存储器、控制器、输入设备、输出设备构成,缺少前两者就无法正常启动计算机,即为“冯·诺依曼结构”。
计算机的核心部件,被称为计算机的“大脑”,又称“微处理器”。
内存储器:简称“内存”,用于电脑内部的存储。相对外存而言,读写速度快,但是存储空间小,并且存储在 RAM 里的数据断电后会丢失。注意与“外存(硬盘等)”区分开。
RAM(Random Access Memory):随机存取存储器,与CPU直接交互数据,可随时读写,断电数据全部丢失。
ROM(Read-Only Memory):只读存储器,只能读出无法写入信息。信息一旦写入后就固定下来,断电数据不会丢失,故又称为固定存储器。
外存储器:简称“外存”,用于处置长期保存的数据,一般处于电脑外部,断电后数据不会丢失。相对内存而言,外存读写速度慢,但存储容量大。主要包括硬盘、光盘、U 盘(USB闪存盘)等类型。
输入设备:在计算机与人交互时,接受外部命令或者需要加工的数据。常用的输入数据包括键盘、鼠标、麦克风、摄像头等。
输出设备:在计算机与人交互时,将处理结果以人类能够识别/感受的方式呈现出来的设备。常有的输出设备包括显示器、音响、打印机等。
如上图,为各个设备之间的关系,不同设备用不同颜色进行表示。
关于CPU
访问速度:寄存器>高速缓存>内存>外存。
历史:出现于
断电后数据保留于 ROM 和外存。
文件扩展名(注意不是“拓展名”)
图像存储:jpg/jpeg/png/pic/bmp/gif/webp。
音频存储:mp3/wav。
视频存储:mp4/avi/mpeg/flv/rmvb/rpm。
计算机语言常识
机器语言/机器码:最早的语言,计算机能识别的语言,由二进制数字
汇编语言:用符号代替二进制数,计算机不能直接识别,需要用编译器进行编译,难度依然很大,目前除了对性能要求极高的需求以外不被使用。
高级语言:如今的编程语言(C++,JAVA 等),需要用编译器,难度小,分为编译方式和解释方式两种编译方式。
编译方式(C++):先对整个程序进行编译(会进行多次分析),再执行程序。速度快(进行多次编译对程序进行优化)。
解释方式(Python/PHP):扫描一行解释一行,速度慢(无法进行优化)。
习题:
ASCII 码
ASCII 码(American Standard Code for Information Interchange)是美国国家交换标准代码,现成为世界交换代码标准。
ASCII 码是一种用
建议记下 'A'
、'a'
和 '0'
的 ASCII 码以推算其他常用字符的 ASCII 码,有很多阅读程序题会间接考察。
补:
补:一个汉字在计算机中占
机器数与真值
计算机中要处理的整数有“无符号”和“有符号”之分,“无符号”整数顾名思义就是不考虑正负的整数,可以直接用二进制表示,故只讨论“有符号”整数。
原码:原码将一个整数表示成符号位+二进制串。符号位上,
但是,用这种方法表示的数进行两个异号数相加或两个同号数相减时很不方便,而且
补:原码中,
反码:对于一个正数,反码就是其原码;对于一个负数,反码就是除符号位外,原码的各位全部取反,即
如:
补码:对于一个正数,补码就是其原码;对于一个负数,补码等于反码+1。
如:
逻辑运算
逻辑非:
逻辑与:
逻辑或:
运算优先级:逻辑非>逻辑与>逻辑或。
可以简单理解为:非(乘方)>与(乘/除法)>或(加/减法)。
按位与:
按位或:
按位异或:
特别的,在进行按位运算时,如果位数不够,需要在位数少的数前补
逻辑表达式:由逻辑运算组合而成,返回值只有 T(True) 和F(False),C++ 中
如果逻辑表达式由多个组合,需要从右往左依次判断,最后得出答案。这种性质被称为右结合性。
例如:<表达式1>?<表达式2>:<表达式3>?<表达式4>:<表达式5>
。
执行的时候是从表达式
图论
基本概念/术语
顶点/节点(Vertex/Node),简称点。
边(Edge):节点之间的连线。
完全图:任意两点都有边相连,一个
简单路径:两点之间通过不重复的边相连。
连通图:任意两点都可以直接/间接到达,注意区别于完全图,完全图属于连通图,连通图不一定属于完全图。
有向图:边是有方向的(
无向图:边是无方向的(
环:对于一个回路
特别的,如果环
入度:以顶点
出度:以顶点
树
基本概念/术语
树:一个长得像真实生活中倒置(即根在上、叶子在下)的树的图,任意两点之间的简单路径有且只有一条。树是一棵连通且无环的图,边数
根节点:树最上层的节点,一棵树有且只有一个。
深度:到根结点的路径上的边数。
高度:所有结点的深度的最大值。
叶节点:没有子结点的结点。
父亲:对于除根以外的每个结点,从该结点到根路径上的第二个结点。根结点没有父结点。
祖先:一个结点到根结点的路径上,除了它本身外的结点。根结点的祖先集合为空。
子节点:如果
兄弟:同一个父亲的多个子结点互为兄弟。
后代:如果
子树:删掉与父亲相连的边后,该结点所在的子图。
二叉树
前/先序遍历:根
中序遍历:左子树/儿子
后序遍历:左子树/儿子
遍历的特殊结论
前/先序遍历 + 中序遍历 = 确定二叉树。
后序遍历 + 中序遍历 = 确定二叉树。
特殊的二叉树及其性质
满二叉树/完美二叉树:所有叶结点的深度均相同的二叉树称为满二叉树/完美二叉树。
满二叉树的第
若在任意一棵满二叉树中,有
完全二叉树:只有最下面两层结点的度数可以小于
对于一棵满二叉树/完美二叉树,其深度为
对于一棵满二叉树/完美二叉树/完全二叉树,若任意节点(除叶节点外)的编号为
二叉树的第
习题
栈
定义/术语
定义:有一叠碗,每一次取的时候取最上面的出来,放的时候放到最上面,先进来的后出去,后进来的先出去,这就是后进先出(last in first out)表,简称 LIFO 表。
栈顶:栈最顶端的元素。
栈底:栈最底端的元素。
操作
push(x)
往栈顶前添加一个元素
pop()
从栈顶弹出(删除)一个元素。
top()
返回栈顶的值。
empty()
返回是否为空。(
size()
返回栈里的元素个数。
队列
定义/术语
定义: 与生活中的队列相同,一条队伍,没有人会插队,大家都按队伍的规矩排好。先进来的先出去,后进来的后出去,这就是先进先出(first in first out)表,简称 FIFO 表。
队首/队头:队列的第一项。
队尾:队列的最后一项。
操作
push(x)
往队尾后添加一个元素
pop()
从队首弹出(删除)一个元素。
front()
返回队首的值。
empty()
返回是否为空。(
size()
返回队列里的元素个数。
链表
定义/特点
定义:链表和数组都可用于存储数据,其中链表通过指针来连接元素,而数组则是把所有元素按次序依次存储。
链表可以方便地删除、插入数据,操作次数是
链表不可以随机访问任意数据!
习题
字符串
定义:字符串指一串字符组成的串。
子串:子串被定义为字符串中任意个连续的字符组成的子序列,子串个数
前/中/后缀表达式:
前缀表达式:一种没有括号的表达式,与中缀表达式不同的是,将运算符写在前面,操作数写在后面。如:前缀表达式
中缀表达式:与平常使用的表达式相同,有括号且运算符在操作数中间。
后缀表达式:与前缀表达式相反,将操作数写在前面,运算符写在后面。如:后缀表达式
前/中/后缀表达式的转化
前/后缀表达式转中缀表达式
画出表达式树:表达式树是一种特殊的树,叶节点是操作数,其他节点为运算符
将表达式树前序遍历,可得前缀表达式;中序遍历可得中缀表达式;后序遍历可得后缀表达式。
中缀表达式转前/后缀表达式
给中缀表达式加上括号:
把运算符移到括号前/后面(移到前面为前缀表达式,反之亦然):
删去括号,剩下的即为最终解:
也可以用上文的“表达式树”做,比较复杂,推荐以上加括号的方法。
最大公约数/最小公倍数
最大公约数:两/多个数之间最大的共有因数。
最小公倍数:两/多个数之间最小的共有倍数。
具体求法
可以得到规律:最大公约数为左侧能被所有数字整除的数的乘积(此处只有
补:实际上,上图中除到
显然,短除法并不适合较大的数字,运算会特别麻烦,出错率高。所以辗转相除法就应运而生了。
辗转相除法(欧几里得算法):辗转相除法是用来求两个正整数最大公约数的算法。以除数和余数反复做除法运算,当余数为
例如:求
习题
进制
十进制转
把十进制数每次对
简单记忆:整数部分,辗转除
例如
如何证明正确性?
一个二进制串可以用位值表示出来:
其中,
因为
这样就得到了
显然有:
观察上式,此时的
此时
常用进制的英文
习题
排列组合
加法原理:完成一项工作有
乘法原理:完成一项工作有
排列(Arrangement/Permutation)
定义:从
计算公式:
其中,
证明:第
全排列:排列的一种特殊情况,此时
组合(Combination)
定义:从
公式:
证明:如果
组合数也常用
排列组合九大解题技巧(按个人认为的理解难度排序)
先选后排:先将元素选出来,再进行排列,非常有效的降低问题的复杂度。
特殊优先:特殊元素,优先处理;特殊位置,优先考虑。
分排用直排:
分类法:当计算符合条件的数目比计算不符合条件数目简单时,将问题分成若干类,逐个求解,与“排除法”相对。
排除法:当计算符合条件的数目比计算不符合条件数目复杂时,简称正难则反。排除不符合要求的,剩下的就是符合题目要求的。与“分类法”相对。
捆绑法:
插空法:
隔板法/插板法:将
定序:
第一抽屉原理:【施工中】
习题
CSP 2019 入门组第一轮-T7
CSP 2019 入门组第一轮-T13(本题强烈建议重点复习)
CSP 2020 第一轮(初赛)模拟-T11
CSP 2020 入门组第一轮-T14
质数
定义:在大于
特别的,
习题
一个问题有很多种不同的算法,如何评价一个算法的好坏呢?这就需要时间复杂度和空间复杂度来衡量了。
定义
渐进时间复杂度,用符号
常量
常量,即永远不变的量,例如,
特别的,如果代码中出现了宏定义,那么宏定义的值依旧是常量,因为它不随着输入数据规模的大小而改变。
示例
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
本代码中,cin >> a[i][j]
执行了
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> b[i][j];
本代码中,cin >> a[i][j]
执行了 cin >> b[i][j]
也执行了
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++)
cin >> b[i][j];
本代码中,cin >> a[i][j]
执行了 cin >> b[i][j]
执行了
符号
非递归程序的时间复杂度的计算
非递归程序的时间复杂度计算一般都比较简单,直接数循环。大多数算法都适用于此,但是也有例外,例如二分等,需要特别留心。
递归程序&主定理
假设某算法的计算时间表示为递归式:
求该算法的时间复杂度。
虽然此方法计算量较大,但是是初学者不二的选择。如果追求卷面,可以学习主定理。
主定理:将一个规模为
空间复杂度
定义:空间复杂度较时间复杂度来说简单许多,可以直接数。符号同时间复杂度。
计算
可见,只需要数数组有几维即可,其他注意事项(如常数等)与时间复杂度相同。
初赛里常考的的排序大多分为
基于比较:通过比较元素来排序数列,如冒泡排序,快速排序等。
不基于比较:不比较元素,通过其他方法(如hash)来进行排序,如基数排序等。
IP
.
隔开,每一个数字取 12.34.56.78
。补:IP 分割成 12.34.56.0
到 12.34.56.255
内的 IP 全部封号,只需要封 12.34.56.*
即可达到操作。
:
隔开,主要是防止 IPv4 不够用。缩写
记忆方法:英语好的同学建议记下英文全称,英语不好的话可以记下释义。
局域网:LAN(Local Area Network),小范围的网络,
城域网:MAN(Metropolitan Area Network),数千米至数十千米内。
广域网:WAN(Wide Area Network),数十千米至数千千米以上。
随机存储器:RAM(Random Access Memory)。
只读存储器:ROM(Read Only Memory)。
万维网:WWW(World Wide Web)。
文件传输协议:FTP(File Transfer Protocol)。
简单邮件传输协议:SMTP(Simple Mail Transfer Protocol)。
对等网络:P2P(peer-t(w)o-peer),音译。
邮局协议第三版 :POP3(Post Office Protocol - Version 3)。
传输控制协议:TCP(Transmission Control Protocol)。
用户数据报协议:UDP(User Datagram Protocol)。
交互邮件访问协议:IMAP(Internet Message Access Protocol)。
超文本传输协议:HTTP(S)(Hyper Text Transfer Prtcl(over Securesocket ayer)),带 “S”的为增加了传输加密和身份认证。
关于 NOIP
NOIP(National Olympiad in Informatics in Provinces),全国青少年信息学奥林匹克联赛(省级),开办于
复赛使用 C、C++、Pascal,
复赛使用 NOI Linux 评测。
NOI(National Olympiad in Informatics):全国青少年计算机程序设计竞赛,开办于
NOIP(National Olympiad in Informatics in Provinces):全国青少年信息学奥林匹克联赛, 自
特别的,如果题目询问了 NOIP 举办了多少届,需要扣除一届,因为 CSP 举行的时候 NOIP 还没有举行。
APIO(Asia-Pacific Informatics Olympiad):亚洲与太平洋地区信息学奥林匹克竞赛。
IOI(International Olympiad in Informatics):国际信息学奥林匹克竞赛,等级最高的信息学竞赛。
图片/视频存储与屏幕分辨率
分辨率:分辨率就是屏幕上显示的像素个数,分辨率
图片存储:给出一张图片的分辨率和色彩的位率(位率越高色彩越多),要算出这张图片所占的空间(一般是 MB)。
计算公式:
计算完毕后记得转化单位。
例如:某张图片的分辨率为
视频大小
一个视频可以视为很多图片的集合,显然,图片的张数为时长乘帧率(每秒几张图片)。
计算公式:
例如:一部
操作系统位数
位数指操作系统所能支配的内存寻址空间,就是该操作系统所能支持的最大内存限制。
位数越高,该操作系统支持的数据吞吐量越大:
补:一般来讲,
参考了部分网络资源以及往期洛谷日报,还有CSP/NOIP的试题。
二叉树、栈、队列图片来自OI wiki。
补充资料来自百度词条。
感谢@Aw顿顿和@离散小波变换° 提供
感谢@xiongyushun @developer6hyx @UnAccepting自动机 @STJqwq(多次) @jpb_Saturn @ppip @x17875487211 @Mr_罗(多次) @Lucius7 @Franz_Liszt @Lcyanstars @Neil_Seniorious @Confringo @sea_in_coder @__Tonycyt__的宝贵建议。
以上就是