NOIP(划掉)CSP2019一轮知识点
今年似乎变动很大呢……
以下标题中打*的是我认为的重点内容
*一、关于计算机
(一)计算机组成
计算机的工作原理跟人的大脑很相似,而且还是大脑功能的延伸,所以习惯上叫它电脑。
硬件组成:
1. 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。
2. 运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。
3. 存储器(Memory):存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。
4. 输入(Input system):输入设备是计算机的重要组成部分,输入设备与输出设备合称为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。
5. 输出(Output system):输出设备与输入设备同样是计算机的重要组成部分,它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等。
CPU:
CPU(中央处理器)=运算器+控制器+(寄存器)
存储器:
存储器=内存储器(主存)+外存储器
随机存储器RAM的“随机”指“随时访问”
随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。
只读存储器(英语:Read-Only Memory,简称:ROM)。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定 ,断电后所存数据也不会改变;其结构较简单,读出较方便,因而常用于存储各种固定程序和数据。
BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
快存:高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。在计算机存储系统的层次结构中,是介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进行的。
外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等。又称为辅存。
断电后可以保存数据:硬盘,ROM
断电后不可以保存数据:显存(显卡内存),RAM,CPU
面向过程语言 :C、Fortran、Pascal
面对对象的高级语言:C++、Java
解释执行的程序设计语言(脚本语言):Python、PHP
软件系统:
关于操作系统:
UNIX 诞生于1969年
Windows 诞生于1985
Linux 诞生于1991年
Windows 和 Linux 都参考了 UNIX
操作系统(operating system,OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
(二)计算机发展史
(这部分中部分内容参考洛谷日报第45期。感谢)
(三)计算机中各存储单位的进位关系:
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024Byte
1Byte(字节)=8bit(位)
bit不常用
*二、二进制原码、反码与补码
(这部分中部分内容参考https://blog.csdn.net/jq_ak47/article/details/45338061。感谢)
(一)原码
在计算机中(以八位机为例),我们知道都用二进制来存储数
如5,二进制为00000101
那么负数怎么存储?将最高位设为符号位,正数为0,负数为1
如-5,二进制为10000101
-6,为10000110
以上叫做原码
(二)反码
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
如7,原码为00000111,反码为00000111
如-10,原码为10001010,反码为11110101
(三)补码
正数的补码是其本身,负数的补码是反码加一
补码有什么用呢?解决负整数加减法
比如我们计算16-8 或是 16+(-8)
如果用原码计算
0 0 0 0 1 0 0 0
+1 0 0 0 0 1 0 0
————————
1 0 0 0 1 1 1 1
将10001111转换为二进制,结果为-24,显然不对
如果用补码呢?
0 0 0 0 1 0 0 0
+ 1 1 1 1 1 1 0 0
————————
1 0 0 0 0 0 1 0 0
*注意,此处用八位二进制,而计算结果是九位二进制,所以最高位自动省略
这样结果是8,正确
若要将补码转化为原码,正数不变,负数先-1再取反码就可以了
三、P问题、NP问题与NPC问题
(这部分中部分内容参考http://www.matrix67.com/blog/archives/105。感谢)
我就说的简略一点了(主要是怕自己忘了),详见上面网址
(一)P问题
每个问题的算法都有时间复杂度
O(1),O(N),O(NlogN),O(n2)等n不在指数为的复杂度为多项式级复杂度
O(N!),O(2n)等复杂度是非多项式级的
可以找到一个多项式级复杂度算法的问题是P问题
NOI系列考的绝大多数问题都是P问题
注:如果一个问题不存在多项式空间的算法,那它一定不是 P 类问题(详见NOIP2012提高组初赛第20题)
(二)NP问题
一个解可以用多项式级复杂度检验的问题是NP问题
注:找不到多项式复杂度解的(非P问题)不一定是NP问题
易得NP=P。即所有P问题都是NP问题
至于P=NP,大家感兴趣的话可以自己研究研究(滑稽护体)
(三)NPC问题(NP-完全问题)
先讲一下“归约”
有两个问题,问题A和问题B
若可以用问题B的算法来解决问题A,那么问题A可以归约为问题B
比如,一元一次方程可以归约为一元二次方程
归约具有传递性,即A可以归约成B,B可以归约成C,那么A一定可以归约成C
可以看出,在不断归约的过程中,算法的时间复杂度逐渐增高,解决的问题也越来越广
大胆猜测,是否可以将所有的NP问题都归约成一个问题?解决了这个问题就能解决所有NP问题?
答案是肯定的!
而且这不仅是一个问题,还是一类问题
这类问题叫做NPC(NP-完全)问题。
一个问题满足以下两条,它就是NPC问题:
1、它是NP问题
2、所有NP问题都能在多项式时间复杂度内归约到它
NPC问题的鼻祖是逻辑电路问题,有兴趣的读者可以自行了解。
另外说一下NP-hard问题,它满足NPC问题的第二条但不一定满足第一条。它包含NPC问题。
*四、进制转换
(一)二、八、十六互转通用方法:
以八进制转二进制为例
先把关系表列出来:
八进制数 |
二进制数 |
0 |
000 |
1 |
001 |
2 |
010 |
3 |
011 |
4 |
100 |
5 |
101 |
6 |
110 |
7 |
111 |
二转八:
例如:10010011.1011
2^3=8
所以使用三位一合的方法。若整数部分位数不是三的倍数,在最高位前补0;若小数部分位数不是三的倍数,在末尾补0。接着以小数点为分界,从左到右分别转化小数部分和整数部分。
对照上面的表 10 010 011. 101 100
2 2 3 . 5 4
所以(10010011.1011)2=(223.54)8
八转二:
同理,一位三分法
例如:7643
对照上面的表 7 6 4 3
111 110 100 011
注:十六进制等进制中,A代表10,B代表11,以此类推
(二) 二转十和十转二
二转十:个位*2^0,十位*2^1,百位*2^2…… 若是小数,十分位*2^-1,百分位*2^-2……然后加起来就行了
十转二:整数部分:不断除以2,直到商为0,倒取各阶段余数
小数部分:不断乘以2,直到积为1,正取各阶段整数
如10.25转化为二进制
10÷2=5……0
5÷2=2……1
2÷2=1……0
1÷2=0……1
倒着取余数,1010即为整数部分
0.25*2=0.5……0
0.5*2=1……1
正着取整数,0.01即为小数部分
将两部分合起来,得到10.25=(1010.01)2
(三)其它
符号:二进制是B,八进制是O,十进制是D,十六进制是H
其它2^n的进制如要转化为十进制,先转化为二进制,再转化为十进制。
十进制转化成它们同理。
**五、排序算法
基本是每年必考!
(这部分中部分内容参考http://blog.csdn.net/whuslei/article/details/6442755/ 和 https://blog.csdn.net/xiazdong/article/details/8462393。感谢)
这个讲的实在太好了%%%
九大排序算法:(加上桶排序就是十个)
计数排序 O(n+k) O(n+k) O(n+k) O(n+k) 稳定 简单
排序算法稳定,指排序前后数值相同的两个数相对位置不会改变
稳定:插、归、冒、基、计
不稳定:快、堆、希、选
需要额外空间:归、基、计
不需要额外空间:插、希、冒、快、堆、选
运用分治思想的:归、快
时间复杂度是O(NlogN)的:堆、快、归(希尔排序的时间复杂度依赖于增量的选择,这里不做讨论)
最慢是O(N2)的:插、冒、快、选
最快是O(N)的:插、冒(改进后)
最快最慢相同的:冒(不改进)、选、堆、归、基,计
需要进行关键字比较:冒、堆、插
不需要:基
example:(NOIP2017提高组t11)
设 A 和 B 是两个长为 n 的有序数组,现在需要将 A 和 B 合并成一个排好序的数组,请问任何以元素比较作为基本运算的归并算法最坏情况下至少要做 ( )次比较。
答案:2n-1
对于一些排序算法的详解
一、希尔排序(本部分来源于上面那个写得超级棒的链接)
希尔排序(Shell's Sort)是插入排序的一种优化版本,又称“缩小增量排序”
核心思想是先选取一个小于n的整数为第一个增量,之后每个增量递减,
比如n=41时,增量可以是40,13,4,1
当前增量是x
那么每次对于a[i],a[i-x],a[i-2x]……这些数进行插入排序
然后递减增量,直到增量为1
形象的过程如下:
希尔排序的时间复杂度从O(n1.3)到O(n2)不等,这主要取决于增量序列的选择
希尔排序不需要额外空间
二、归并排序(本部分来源于上面那个写得超级棒的链接)
void merge(int l,int mid,int r) { int i=0,p1=l,p2=mid+1; while(p1<=mid && p2<=r) { if(a[p1]<a[p2]) { f[++i]=a[p1]; p1++; } else { f[++i]=a[p2]; p2++; } } while(p1<=mid) { f[++i]=a[p1++]; } while(p2<=r) { f[++i]=a[p2++]; } for(i=1;i<=r-l+1;i++) { a[l+i-1]=f[i]; } return ; } void merge_sort(int l,int r) { if(l>=r) return ; int mid=l+r>>1; merge_sort(l,mid); merge_sort(mid+1,r); merge(l,mid,r); return ; }
三、基数排序
可以理解为按位进行桶排序,时间复杂度为O(d(n+k))
四、计数排序
(转自https://blog.csdn.net/qq_35580883/article/details/79111293)
也运用到了桶
a A是待排序数组,C中存储每个数字出现的次数
b C求前缀和。此时C中存储对于每个数字,小于等于它的数字个数
c d e f 倒序遍历数组A B[C[A[i]]]=A[i],C[A[i]]--。自减保证下一个相同的数字可以储存在适当的位置
f 排序完毕
时间、空间复杂度O(n+k),稳定
六、时空复杂度
(一)时间复杂度
(这部分中部分内容参考https://www.luogu.org/blog/Chanis/master。感谢 )
表的第二行是一些奇怪的东西,不用管它
初赛还经常要计算代码的时间复杂度。对于递归函数的一定要细心思考
(二)空间复杂度
(这部分中部分内容参考https://blog.csdn.net/shiwei408/article/details/7280296?utm_source=copy 。感谢)
32位系统下,int、long、long long、__int64所占字节数(B)
char: 1字节(8位)
int: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
unsigned int : 4字节 (32位,取值范围 0 ~ 2^32-1)
long: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
unsigned long : 4字节 (32位,取值范围 0 ~ 2^32-1)
long long : 8字节(64位,取值范围 -2^63 ~ 2^63-1)
七、位运算与逻辑运算
(一)位运算
按位与:&
按位或:|
按位异或:^
按位取反:~(对于十进制来说,取相反数再减一)
左移:<<
右移:>>
*优先级:~大于>>、<<大于&大于^大于|大于&=、^=、|=、<<=、>>=
(二)逻辑运算
"∨" 表示"或" (逻辑加法)
"∧" 表示"与". (逻辑乘法)
"┐"表示"非". (逻辑否定)
"⊕"表示"异或"
按位运算优先级大于逻辑运算
与:11为1,其它为0
或:00为0,其它为1
异或:不同为1,相同为0
八、指针
一个小东西……
int a;//定义一个变量
int *p;//定义一个指针
*p=&a;//指针p取到a的地址(p是一个地址)
cout<<*p;//输出地址中的值(*p是一个值)
example:NOIP2015提高组第24题
#include <iostream>
using namespace std;
void fun(char *a, char *b) {
a = b; //a变为c2的地址。注意,指针=指针时地址中的值不变,变的只是指针
(*a)++; //将a地址(c2)中的值+1
}
int main() {
char c1, c2, *p1, *p2;
c1 = 'A';
c2 = 'a';
p1 = &c1; //p1是c1的地址
p2 = &c2; //p2是c2的地址
fun(p1, p2); //(NOIP的函数好像都叫fun……)
cout << c1 << c2 << endl;//输出为Ab
return 0;
}
*九、图论
图论挺重要的,板子需要背一背
下面只是一些概念
(一)无向图
完全图:n 个点,n(n-1)/2 条边(每对顶点之间都恰连有一条边)
树:n 个点,n-1 条边(每对顶点之间都有且仅有一条路径,无环)
割点:删除该点后图不连通
割边(桥):删除该边后图不连通
点双连通:某个没有割点的无向图
边双连通:某个没有割边(桥)的无向图
双连通分量:图的极大双连通子图(分为点双连通分量和边双联通分量)
(二)有向图
强连通:在有向图G中,若u能到v,v也能到u,则称u和v是强连通的
强连通图:若有向图G的任意两个节点都强连通,则称G是一个强连通图
强连通分量:有向非强连通图的极大强连通子图,称为强连通分量
DAG:有向无环图
将一个有向图中的强连通分量都缩成一个点,则原图会形成一个DAG
拓扑排序仅适用于DAG
DAG中,最长反链=最小链覆盖;最长链=最小反链覆盖
(三)其它
简单图:无重边无自环的图
十、计算机奖项
图灵奖 (A.M. Turing Award) 由ACM于1966年设立
它是计算机界最负盛名、最崇高的一个奖项,有“计算机界的诺贝尔奖”之称
奖励那些对计算机事业做出重要贡献的个人
华人学者目前仅有2000年图灵奖得主姚期智
约翰•冯•诺依曼奖 由IEEE(电气和电子工程师协会)于1999年成立
表扬在计算机科学和技术上具有杰出成就的科学家
高德纳奖 (Donald E. Knuth Prize) 始于1996年,每1.5年颁发一次
授予为计算机科学基础做出杰出贡献的人
姚期智获得了1996年的高德纳奖
*十一、表达式
中缀表达式就是我们常用的式子,如10 * 3 +(3-1)* 2 - 10 / 2
要想转成前缀或后缀表达式,首先建一颗二叉树,非叶子节点是运算符(不包括括号),叶子结点是数字
首先找到整个式子最后进行的运算符(从前往后找)
在这个式子中即为-
那么它就是根节点
然后式子被-分成了左右两部分,左边的是左子树,右边的是右子树
重复此过程,即可得到表达式树
它的先序遍历(根左右)即为前缀表达式 - + * 10 3 * - 3 1 2 / 10 2
它的后序遍历(左右根)即为后缀表达式 10 3 * 3 1 - 2 * + 10 2 / -
十二、网
广域网(Wide Area Network,缩写为 WAN(NOIP2018PJ t4) ),又称广域网、外网、公网。是连接不同地区局域网或城域网计算机通信的远程网。通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。广域网并不等同于互联网。
局域网(Local Area Network,缩写为LAN)的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网络安全,能够有效地保护资料安全,保证局域网网络能够正常稳定的运行。
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术。
IEEE 802.11是现今无线局域网通用的标准,它是由电气和电子工程师协会(IEEE)所定义的无线网络通信的标准。
Wi-Fi是一个创建于IEEE 802.11标准的无线局域网技术。
-
数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要储存的数据。
-
地址总线(Address Bus):用来指定在RAM(Random Access Memory)之中储存的数据的地址。
-
控制总线(Control Bus):将微处理器控制单元(Control Unit)的信号,传送到周边设备。
-
扩展总线(Expansion Bus):外部设备和计算机主机进行数据通信的总线,例如ISA总线,PCI总线。
-
局部总线(Local Bus):取代更高速数据传输的扩展总线三类总线在微机系统中的地位和关系
- 1在连接上,TCP是基于连接的,是面向连接的运输层协议,如打电话之前要拨号建立连接,UDP是无连接的,即发送数据之前不需要建立连接
- 2在对于系统资源的要求上,TCP较多,UDP较少
- 3结构程序方面,TCP的结构较为复杂,而UDP结构较为简单
- 4在模式上TCP为流模式,而UDP则是数据报模式
- 5TCP能保证数据的正确性和顺序性,而UDP可能丢失且不能保证数据的顺序不改变
……
二一四七四八三六四七、一些杂乱的
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
哈夫曼编码采用贪心思想。该方法完全依据字符出现概率来构造异字头的平均长度最短的码字。哈夫曼树的叶子节点个数比非叶子节点个数多一。
编译器的主要功能是将源程序翻译成指令
字串是连续的,但子序列不一定是连续的
国际计算机学会ACM(Association for Computing Machinery)创立于1947年,现任主席是Vicki L. Hanson教授
HTML称为超文本标记语言,是一种标识性的语言。特点是具有简易性、可扩展性、平台无关性、通用性
中国计算机大会由中国计算机学会(CCF)创办于2003年。2019年10月17-19日,2019中国计算机大会(CNCC2019)将在苏州金鸡湖国际会议中心举办。今年,NOI论坛将亮相CNCC,并于10月17日下午在CNCC2019上举办主题为“编程普及教育与计算思维培养”的论坛。
本文部分图片来源于网络和其它博客(均已注明)
若需转载,请注明https://www.cnblogs.com/llllllpppppp/p/9749930.html
CSP2019 RP++!!!