操作系统基础——LinuxLinux是开源的操作系统,定制性很强,有很多发行版,选择使用Kail Linux ,可以在清华大学开源软件镜像站下载具体操作在菜鸟教程学习在Linux中一切都是文件,在Linux里一切起源为/这个根目录。从/开始的路径称为绝对路径,知道绝对路径就可以精准定位文件。../形式的称为相对路径,.表示当前目录,..表示上一级目录。例如../load表示上一级目录load文件夹,../../load表示上上级目录下的load文件夹
重要的目录
/etc目录:存储系统文件。例如/etc/passwd
var目录:存储一些类似日志的东西
home目录:家目录,分隔每个用户的个人房间
root目录:root用户(系统根管理员用户)的单独房间
tmp目录:临时目录,存储一些杂七杂八的缓存内容
文件管理常用命令
pwd:查看当前在哪个目录
cd:加一个参数,会切换到指定目录
ls:列出指定目录下边有哪些文件,不指定参数的话默认当前文件夹
cat:打开指定文件
echo:打印字符
touch:创文件
可以在命令后加一个参数,例如ls /home同时可以用-开头 ...
开个新坑,看看能不能学下去吧本系列为参考B站up主黑兔由帝所做笔记
计算机基本原理计算机的分类粗略分为
个人设备(PC)
服务器
存储计算机需要存储数据,存储分为两种
外存:例如硬盘、光盘、u盘,特点是存储数据都比较慢(会被先放入内存,再由CPU处理),但是即使关机了,数据也还在,开机可以继续使用
内存:RAM(随机存储器),例如内存条,特点是存储容量小,存取速度极快,关机后数据消散写文档时需要保存就是因为需要将内存中的文档写入外存硬盘中
攻防领域的应用:无文件攻击:一段恶意代码不接触磁盘,只在内存中运行,那么常规扫描硬盘进行查杀的杀毒软件是没有效果的
在不同的操作系统中,在磁盘中删除文件的操作是不同的。在windows系统中,删除文件只是做了已删除的标记,让新数据可以覆盖到做了已删除标记的地方,如果没有被覆盖,那么还有可能恢复数据。
处理有了数据,由CPU(中央处理器)对数据进行处理。由于历史的遗留问题,处理器有很多架构,例如x86,arm,mips架构等,不同架构不能互通。跨平台只建立在有一个对应平台解释器的前提下。例如,在x86的计算机上写一段python代码可以 ...
字符串模式匹配的定义在主串中找出与模式串相同的子串,并返回其所在位置
朴素模式匹配算法思想主串长度为n,模式串长度为m将主串中所有与长度为m的子串与模式串一一比较 ,直到找到一个与模式串完全匹配的子串,或所有的子串都不匹配 (最多对比n-m+1个子串)若当前子串匹配失败,则主串指针i指向下一个子串的第一个位置,模式串指针j回到模式串的第一个位置i=i-j+2 j=1若j>T.length,则当前子串匹配成功,返回当前子串的第一个位置——i-T.length
代码1234567891011121314151617int Index(SString S,SString T){ int i=1,j=1; while(i<=S.length&&j<=T.length){ if(S.ch[i]==T.ch[j]){ i++; j++; } else { i=i-j+2; ...
串的定义串,即字符串(String),是由零个或者多个字符组成的有限序列。一般记为S=’$a_{1}$$a_{2}$···$a_{n}$’(n>=0)其中,S是串名,单引号括起来的字符序列是串的值;$a_{i}$可以是字母、数字或者其他字符;串中字符的个数n称为串的长度。n=0时的串称为空串(用$\emptyset$表示)
例:T=’iPhone 17 Pro Max?’
子串:串中任意个连续的字符组成的子序列
‘iPhone’,’Pro M’是串T的子串
主串:包含子串的串
T是子串’iPhone M’的主串
字符在主串的位置:字符在串中的序号
‘1’在T中的位置是8(第一次出现)
子串在主串的位置:子串的第一个字符在主串中的位置 (位序从1)
‘11 Pro’在T的位置是8
空串 VS 空格串:
M=’’ (空串)N=’ ‘ (空格串,由三个空格字符组成)
串 VS 线性表串是一种特殊的线性表,数据元素之间呈线性关系串的数据对象限定为字符集(如中文字符、英文字符、数 ...
CS学习
未读一维数组的储存结构C语言定义一维数组:ElemType a[10]各数组元素大小相同,且物理上连续存放数组元素a[i]的存放地址=LOC+i*sizeof(ELemType)(0<=i<=10)
二维数组的储存结构C语言定义二维数组:ElemType b[2][4]两种储存方式
行优先储存 M行N列的二维数组b[M][N],若按照行优先存储 则b[i][j]的存储地址=LOC+(i*N+j)*sizeof(ElemType)
列优先储存 M行N列的二维数组b[M][N],若按照列优先存储 则b[i][j]的存储地址=LOC+(i+j*M)*sizeof(ElemType)
普通矩阵的存储$\left(\begin{array}{cccccc}a_{1,1} & a_{1,2} & a_{1,3} & \cdots \cdots & a_{1, n-1} & a_{1, n} \\a_{2,1} & a_{2,2} & a_{2,3} & \cdots ...
括号匹配问题分析
( ( ( ( ) ) ) )
最后的左括号最先被匹配(LIFO)——可以用栈实现这个特性
( ( ( ) ) ( ) )
每出现一个右括号,就消耗一个左括号(出栈)遇到左括号就入栈,遇到右括号就消耗一个左括号,并且与右括号的大小进行比较
算法实现
代码12345678910111213141516171819202122232425262728293031323334353637383940#define MAXSIZE 10typedef struct{ char data[MAXSIZE]; int top;}SqStack;void InitStack(SqStack &S){ S.top=0;}bool Push(SqStack &S,char x){ S.data[S.top]=x; S.top++; return true;}bool Pop(SqStack &S,char &x){ ...
队列的概念队列(Queue)是指允许在一段插入,另一端删除的线性表
重要术语
队头:允许删除的一端
队尾:允许插入的一端
空队列:队列里没有任何数据元素
特点:先进先出(FIFO)First In First Out
队列的基本操作
队列的顺序实现队列的定义12345#define MAXSIZE 10typedef struct{ int data[MAXSIZE]; int front,rear;//队头指针和队尾指针}SqQueue;
队列的初始化1234void InitQueue(SqQueue &Q){ Q.front=0; Q.rear=0;}
判断队列是否为空1234bool QueueEmpty(SqQueue Q){ if(front==rear)return true; else return false;}
入队12345bool EnQueue(SqQueue &Q,int x){ if((Q.rear+1)%MAXSIZE==Q ...
栈的概念栈(stack)只允许在一端 进行插入或删除操作的线性表。
重要术语
空栈:栈里没有任何数据元素
栈顶:允许插入和删除的一段
栈底:不允许插入和删除的一段
特点:先进后出(LIFO)Last In First Out
栈的基本操作
常考题型合法的出栈顺序n个元素进栈,出栈元素的不同排列的个数为$\frac{1}{n+1}C_{2n}^{n}$
顺序栈顺序栈的定义12345#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int top;}SqStack;
顺序栈的初始化注意:看清楚top是指向栈顶元素还是栈顶元素的后面一个位置
1234void InitStack(SqStack &S){ S.top=-1;//指向栈顶元素 //栈满条件top==MAXSIZE-1}
判断栈空1234bool StackEmpty(SqStack S){ if(S.top==-1)return true; else return fal ...
逻辑结构
都是线性表,都是线性结构
存储结构
顺序表:
采用顺序储存
优点:支持随机存取、存储密度高
缺点:分配连续的大片空间不方便;不方便改变容量大小
链表:
链式储存
优点:离散的小空间分配方便;改变容量方便
缺点:不可随机存取、存储密度低
基本操作创
顺序表:分配一大片连续空间(动态分配、静态分配)
链表:只分配一个头结点
销
顺序表:修改lenth=0,将顺序表标记为一个空表
静态分配:静态数组(自动回收空间)
动态分配:动态数组(malloc、free)(需要手动free)
链表:依次销毁各个结点(free)
增删
顺序表:增/删都需要移动大量数据元素
时间复杂度O(n),主要消耗到移动元素上(若数据元素很大,则移动的时间代价很高)
链表:只需要修改指针
时间复杂度O(n),主要消耗在查找目标元素上
查
顺序表:
按位查找:时间复杂度O(1)
按值查找:时间复杂度O(n)(若顺序表内元素有序,时间复杂度O($\log_{2}{n}$)
链表:
按位查找:时间复杂度O(n)
按值查找:时间复杂度O(n)
项目
顺序 ...