能力说明:
了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。
暂时未有相关云产品技术能力~
你只管努力,剩下的交给时间
#### 1.⚽️搜索镜像 ```shell #1.搜索镜像 docker search nginx [root@VM-16-15-centos /]# docker search nginx NAME DESCRIPTION
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容包括代码、运行时、库、环境变量和配置文件。 **所有的应用,直接打包docker镜像,就可以直接跑起来!**
*Docker是怎么工作的** - Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问! - Docker Server接收到Docker-Client的指令,就会执行这个指令!
🎃 环境准备 - 需要懂一点Linux基础 - CentOS 7 我的系统是CentOS 8,与7只有一个命令有区别,已标注 - Xshell操作服务器
Nginx目录结构
Docker 是一个基于go语言开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的`镜像`中,然后发布到任何流行的 `Linux`或`Window`操作系统的机器上,也可以实现`虚拟化`。容器是完全使用`沙箱`机制,相互之间不会有任何接口。
对象的生命周期: - 全局对象在程序启动时分配,结束时销毁。 - 局部对象在进入程序块时创建,离开块时销毁。 - 局部`static`对象在第一次使用前分配,在程序结束时销毁。 - 动态分配对象:只能显式地被释放。
关联容器中的元素`按关键字`来保存和访问 - 顺序容器中的元素按他们在`容器中的位置`来保存和访问 - 关联容器与顺序容器许多行为相同,但是有着根本不同,不同之处反应关键字作用
♦️第10章 泛型算法 - 泛型算法是提供一个算法,对于不同类型的容器和不同类型的元素。因此叫做泛化。
**顺序容器**(sequential container):为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。 - 顺序容器都提供了`快速顺序访问元素`的能力。 - `所有容器都提供高效的动态内存管理`
**istream**:输入流类型,提供输入操作。 - **ostream**:输出流类型,提供输出操作 - **cin**:一个`istream`对象,从标准输入读取数据。 - **cout**:一个`ostream`对象,向标准输出写入数据。 - **cerr**:一个`ostream`对象,向标准错误写入消息。 - **>>运算符**:用来从一个`istream`对象中读取输入数据。 - **<<运算符**:用来向一个`ostream`对象中写入输出数据。 - **getline函数**:从一个给定的`istream`对象中读取一行数据,存入到一个给定的`string`对象中
通过调用`运算符 () `来执行函数。 **函数调用完成俩项工作:** - `用实参初始化函数对应的形参。` - `将控制器转移给被调用函数。` **此时主调函数被中断,被调函数开始执行。**
**运算对象转换** - `小整数类型(如bool、char、short等)通常会被提升成较大的整数类型,主要是 int 型` - 一般在进行二元运算符时,即使俩个数类型不一样,只要他们可以相互准换为同一个类型就可以。 - 运算符作用于类类型的运算对象时,用户可以自行定义其含义。这种做法称之为`重载运算符`
String、vector是俩种最重要的标准库类型,String支持`可变长字符串`,vector支持`可变长的集合` 迭代器是一种与 string 和 vector 配套的标准库类型。常用于访问string中的字符或vector中的元素 内置数组是一种基础的类型,string和vector都是对它的某种抽象。
概述 c ++定义了几种基本的内置类型(如字符、整型、浮点数等),同时提供自动以数据类型的机制。 ## 🍮2.1 基本内置类型 基本内置类型包括算数类型和空类型。算数类型包括字符、整型数、浮点数和布尔值。
背包问题 - 一共有N件物品,背包容量为V,物品有俩个属性,一个是体积一个是价值(类似在一个宝岛上,你有一个背包,它只能装满这个背包,小岛上有很多金子,各种体积的,而且每个金子纯度不一样,看最后怎么装才会使得背包中的金子价值最高) **四种背包问题** - 0 1 背包 每件物品最多只用一次, - 完全背包 每件物品有无线个 - 多重背包 每个物品不一样,每个物品最多有有S<sub>i</sub>个——朴素版和优化版 - 分组背包 有水果,汽车,人等,每一种里面最多只能选择一个
思路 - 因为所有的`边长都为1`,所以可以使用`宽度优先搜索`的思想,每当队列pop出一个元素时,将其距离为1的节点都加到队列中(层次遍历思想) - `st[]`标记各个节点有没有走过,`d[]`保存1号节点到各个节点的距离,初始时都为-1。
## 思路 - 用 `g[n][m] `存储地图,`d[n][m]` 存储起点到 n,m 的距离。 - 从起点开始广度优先遍历地图。 - 当地图遍历完,就求出了起点到各个点的距离,输出`d[n][m]`即可。
# 概述 - DFS:深度优先遍历,从一条路径走到叶节点,然后回溯,继续遍历(不撞南墙不回头) - BFS:广度优先遍历,从根节点,一层一层的遍历,每一层把所有的节点都遍历完成。 ## 递归思想 - 递归在于不断调用自己的函数,层层深入,直到遇到递归终止条件后层层回溯,其思想与dfs的思想不谋而合;因此,可以使用递归来实现dfs。 - 递归的进入比较容易理解,但是递归的回溯是在计算机底层执行的,我们无法看到。因此这是理解递归的唯一一个难点。
最大异或对就是在给定的数中,找到俩个数使得,这俩个数异或后的结果最大。 - 一般采用`暴力法`和`字典树`的方法。
表达式求值(中缀) **前提准备** 需要开辟`俩个栈`,一个用于`存放数字`,另一个用于`存放运算符`。 需要用到`unordered_map`用来存放`运算符的优先级`。
**用到字符串的地方一般可以用KMP算法。用KMP算法的一般都可以用字符串哈希。代码更简单。**(特殊的哈希方式,字符串前缀哈希法) - 把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。(`比较俩个区间字符串前缀是否相等就变成了比较俩个区间字符串哈希是否相同`) ### 核心 - `以一个K进制的角度,来吧字符串看成数字。`
模拟散列表 **概述** - `哈希表`又称`散列表`,一般由`Hash函数(散列函数)`与`链表`结构共同实现。 **用途** - 添加元素 - 通过遍历来查找相应元素。(之所以用哈希是因为它的时间复杂度接近O(1)) **思路** - 将一个比较`复杂的数据结构`映射到下标从`0~N`的容易维护的值域内。因为值域比较简单、范围小、就会产生`不同的原始值信息被Hash函数映射为相同的值`,因此要处理这种冲突。 - 处理冲突的办法有俩种:`拉链法`和`开放寻址法(蹲坑法)`
堆排序 ### 堆性质: - 堆是一个`完全二叉树` - 堆中某个节点的值`总是不大于或不小于`其父节点的值 - 堆的每个结点的值都`小于或等于其左右孩子结点`,称为`小根堆` - 堆的每个结点的值都`大于或等于其左右孩子结点`,称为`大根堆`
**用途**: - 将俩个集合合并 - 询问俩个元素是否在一个集合当中 **基本原理**: - 每个集合用一棵树来表示。树根的编号就是整个集合的编号,每个节点存储它的父节点,`p[x]`表示x的父节点。
**思路:** - 因为BF算法是一位一位的比较,所以时间复杂度比较高,KMP是通过`减少比较次数,来进行优化`. - BF是匹配不成功只移动一位,而KMP算法匹配不成功,`移动多位`,具体移动几位,需要查`前缀表`。
**原因**:在笔试当中,通常可以使用`结构体+指针`的方式实现,链表,但是由于每次都需要`new一个新节点`,所以会导致时间超时,或者可以`直接一次性new出很多节点`,但是这样做就和用`数组模拟链表`差不多了.
离散化 - 假设一共有10<sup>5</sup>个数,每个数的值域是0~10<sup>9</sup>,有些题目可能会使用这些值下标来做,但是我们如果开一个长度是10<sup>9</sup>数组是不现实的。这时候就需要用到`映射`。 - 我们需要把这个序列映射到从1开始的`连续自然数`,这个过程就叫离散化。
. 最大连续不重复子序列
思路: >计算子矩阵的和,例如以(x1,y1)为左上角,(x2,y2)为右上角的子矩阵的和为多少。 >## 需要解决俩个问题 >1. s [ i , j ]如何计算 >一行一行的计算 >```c >S[i,j] = S[i-1,j] + S[i,j-1] - S[i-1,j-1] + a[i,j]
思路: > - 高精度整数除以低精度的整数,商为C,余数为r。 > - 从高位依次除以低精度整数。商(C)存在数组中,`r * 10 + 后一位`,继续除以低精度整数。一直循环结束。 > - 去掉前导0
高精度整数乘以低精度的整数,将`较小的数看成整体`,高精度整数的每一位,依次乘以低精度整数 >- 下一位与小的整数相乘,并且再加上进位。 > - 去掉前导0,因为结果可能是0123456
vector:动态数组(可变长数组,倍增的思想) size() 返回元素的个数(所有的SLT容器都有,O(1)) empty() 返回是否为空 (所有的SLT容器都有) clear() 清空 front()/back() 返回vector第一个/最后一个数 push_back()/pop_back() 在vector最后插入一个数/把最后一个元素删除 begin()/end() 迭代器,begin
vector就是一个模板类,其基类什么也没干`vector<int> v;`这样的声明,只不过是调用了基类的无参构造,它什么也没干。也没有动态分配内存。 * 如果vector在构造的时候指定容器大小,那么声明时就会申请动态内存,但如果构造是默认构造,并不会申请动态内存。
**页面置换算法** - 功能与目标 - 实验设置与评价方法 - `局部页面置换算法` - 最优页面置换算法(OPT,optimal) - 先进先出算法(FIFO) - 最近最久未使用算法(LRU,Least Recently Used) - 时钟页面置换算法(Clock) - 最不常用算法(LFU, Least Frequently Used) - Belady现象 - `全局页面置换算法` - 工作集模型 - 工作集页置换算法 - 缺页率置换算法
题目描述 : 页面大小为4k, 分配给每个进程的物理页面是1. 在一个进程中, 定义了如下的二维数组 int A[1024][1024]. 该数组按行存放在内存, 每一行放在一个页面中. 考虑一下程序的编写方法对缺页率的影响?
第三章介绍的是`连续内存管理`, 即 : 操作系统加载到内存以及程序加载到内存中时, 需要为其分配一块连续的空闲(内存)块. 但是容易出现碎片问题, 这一章介绍的非连续内存分配可以有效的减少碎片的出现.
简介: 本专栏主要讲解操作系统的相关知识,包括内存管理、虚拟内存、IO多路复用、进线程、死锁、磁盘调度 本节主要讲解 操作系统—物理内存管理
🌗1. 启动 作用解析 Disk : 存放OS和Bootloader BIOS : 基于I/O处理系统(主要是计算机开机后,能够检查各种外设,然后加载软件执行) Bootloader : 加载OS,将OS从磁盘放入内存 注意:os最开始不是放到内存中的,而是放到disk(硬盘)中,由bios提供支持 开机流程 BIOS 开机后,寻找显卡和执行BIOS (此时, CS : IP = 0xF000 : 0xFFF0, CS/IP 两个寄存器) 将Bootloader从磁盘的引导扇区加载到0x7C00 (Bootloader一共占用512M字节的内存) 跳转到 CS : IP = 0
1.介绍 基本概述及原理 操作系统介绍 中断及系统调用 内存管理 进程及线程 调度 同步 文件系统 I/O子系统