『离散数学』集合论:二元关系
本篇源于 B 站的【离散数学】3.5h让你离散数学不挂科,感谢老师!
概念
补充:
LAL_{A}LA 小于等于关系
DAD_{A}DA 整除关系
R⊆R_{\subseteq}R⊆ 包含关系
补充:关系的运算
domRdomRdomR:定义域
ranRranRranR:值域
fldRfldRfldR:域,等于定义域并上值域
R−1R^{-1}R−1:R 的逆
F∘GF\circ GF∘G:复合关系
例:设 F={<3,3>,<6,2>},G={<2,3>}F = \{<3,3>,<6,2>\},G = \{<2,3>\}F={<3,3>,<6,2>},G={<2,3>}
F−1={<3,3>,<2,6>}F^{-1} = \{<3,3>,<2,6>\}F−1={<3,3>,<2,6>}
F∘G=<6,3>F\circ G = {<6,3>}F∘G=<6,3>(6->2->3)
R↾AR↾AR↾A:R 在 A 上的限制
R 中满足第一个元素,都是来源于 A 集合的有序对
R[A]R[A]R[A]:A 在 R 上的像
R 中满足第一个元素,都是来源于 A 集合的有序对的第二个元素
例:设 R={<1,2>,<1,3>,<2,2>,<2,4>,<3, ...
『离散数学』集合论:集合代数
本篇源于 B 站的【离散数学】3.5h让你离散数学不挂科,感谢老师!
集合的基本运算
集合相对(包含)的证明
集合运算的重要恒等式
包含排斥原理
(集合上画一根横线是补集的意思)
『字节青训营-3rd』L7:从需求到上线全流程
第七节:从需求到上线全流程
这一节的内容是讲作为一个大企的后端人,平时的工作是怎样进行的
印象很深的地方就是按照跑火车的节奏每周先拿开会需求,开发,上线测试,再开会、开发…还是很有意思的
正经的笔记真的没时间做,下面就备份一手学习资料吧(其实也基本能囊括上课讲的内容了)
概述
课程背景: 作为后端研发同学,在一个完整的需求交付周期内究竟要做哪些事情?在各个阶段需要跟不同的角色和平台打交道。介绍常见的研发模式和迭代流程,以实际的例子让同学感受一下后端研发的日常,能够提升大家在团队中协作的能力。
课程目标:
提升对流程的认知
熟悉在公司大团队中协作开发
对职业生涯的日常有更直观的理解
课前 (必须)
词汇表
分类
英文
中文
解释
研发模式
Waterfall Model
瀑布模型
瀑布模型(Waterfall Model)最早强调软件或系统开发应有完整之周期,且必须完整的经历周期之每一开发阶段,并系统化的考量分析与设计的技术、时间与资源之投入等。由于该模式强调系统开发过程需有完整的规划、分析、设计、测试及文件等管理与控制,因此能有效的确保系统质量,它已经成为软体业界大多数软件开发的最初标准
The Scaled Agile Framework(SAFe)
规模化敏捷框架
Scrum
Scrum
在软件工程中,Scrum是以经验过程为依据,采用迭代、增量的方法来提高产品开发的可预见性并控制风险的理论,Scrum不是一种过程,也不是一项构建产品的技术,而是一个框架,在Scrum框架中可以应用各种过程和技术,Scrum的作用是让开发实践方法的相对功效显现 ...
『字节青训营-3rd』L6:实战项目 - Go 语言笔记服务
第六节:实战项目 - Go 语言笔记服务
讲得内容就是大概地过了一下这个项目,因为内容太多就把学习手册贴这了
这个项目用到了很多新东西,例如RPC 框架, kitex 和链路追踪
我基本上是走马观花地看了一下,真要掌握还得自己写一遍
一、课程背景与目标
课程背景
在大家已经学完前 5节 Go 原理与实践课程的基础上,通过项目实战帮助大家把前面学过的知识应用起来
课程目标
将前面所学的知识应用到项目中
熟悉项目的代码,可以将项目正常运行
熟悉 Kitex/Gorm 的使用
二、课前了解
安装 Docker/Postman/Git
安装 Minikube 或 Docker Desktop 安装教程
可以使用 Minikube 或者使用 Docker Desktop 启动 Docker
安装 Postman
安装 Git 安装教程
Kitex 初体验
通过阅读 www.cloudwego.io/zh/docs/kit… 尝试运行 Kitex 的示例代码
kitex 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2
Gorm 初体验
通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码
了解 Etcd和Opentracing
了解 etcd 是什么以及 opentracing 是什么
三、项目介绍
项目简介
EasyNote 提供了一套比较完整的笔记后端API服务.
项目地址 github.com/cloudwego/k…
推荐版本 Golang >= 1.1 ...
『算法拾遗』问题规模与时间复杂度
本篇节选于《算法竞赛:从入门到进阶》第二章:算法复杂度
竞赛题目的限制时间一般是 1s ,目前普通计算机的计算速度是每秒千万次,故可推导出以下结论
算法的时间复杂度
能解决的最大问题规模
O(n!)O(n!)O(n!)
111111
O(2n)O(2^{n})O(2n)
252525
O(n2)O(n^{2})O(n2)
500050005000
O(nlog2n)O(n\log _{2}n)O(nlog2n)
10610^{6}106
O(n)O(n)O(n)
10710^{7}107
O(log2n)O(\log _{2}n)O(log2n)
> 10810^{8}108
『字节青训营-3rd』L5:设计模式之 Database/SQL 与 GORM 实践
【Go 语言原理与实践学习资料(下)】第三届字节跳动青训营 - 后端专场
本节课讲得东西很多,然后我太菜很多东西都听不懂,所以还是建议去看原视频吧 ☺️
理解 Database/SQL
目标:通过统一的接口去操作不一样的数据库
Database/SQL 是一个在应用程序和数据库的中间层,暴露给应用的接口是相同的,只需更改连接接口和操作接口就可以连接不同的数据库
GORM 使用简介
设计简洁、功能强大、自由扩展的全功能 ORM
GORM 设计原理
GORM 最佳实践
『字节青训营-3rd』L4:高性能 Go 语言发行版优化与落地实践
相关链接【Go 语言原理与实践学习资料(下)】第三届字节跳动青训营 - 后端专场
自动内存管理
降低开发负担、解决安全性问题
三个任务:
为对象分配空间
找到存活对象
回收死亡对象的内存空间
相关概念
名词
Mutator: 业务线程,分配新对象,修改对象指向关系(用户启动的线程)
Collector: GC 线程,找到存活对象,回收死亡对象的内存空间
Serial GC: 只有一个 collector(暂停所有 Mutator ,回收后再继续运行)
Parallel GC: 并行 GC,支持多个 collectors 同时回收的 GC 算法(暂停时多个有多个回收线程)
Concurrent GC: 并发 GC,支持 mutator(s) 和 collector(s) 同时执行的 GC 算法
Collectors 必须感知对象指向关系的改变!
评价 GC 算法
安全(不能回收存活的对象)
吞吐率(花在 GC 上的时间)
暂停时间
内存开销
算法1: 追踪垃圾回收
对象被回收的条件:指针指向关系不可达的对象
从根对象出发,遍历并标记所有可达的对象,最后清理剩下的对象
清理的策略:
Copying GC :把存活的对象分配到其他空间
Mark-sweep GC: 将死亡对象的内存标记为可分配
Mark-compact GC: 原地移动整理存活对象
分代 GC (Generational GC)
基于事实:很多对象分配出来后很快就不再使用了
每个对象都有年龄:经过 GC 的次数
然后把老的和年轻的分开,制定不同的 GC 策略
年轻代
由 ...
『字节青训营-3rd』L3:高质量编程与性能调优实战
相关链接配套实例代码:https://github.com/wolfogre/go-pprof-practice
【Go 语言原理与实践学习资料(上)】第三届字节跳动青训营 - 后端专场
前情提要:
高质量编程
高质量编程简介
什么是高质量:编写的代码能够达到正确可靠、简洁清晰的目标
各种边界条件是否考虑完备
异常情况处理,稳定性保证
易读易维护
编程原则:
简单性
可读性
团队生产力
编码规范
如何编写高质量 Go 代码
代码格式
注释
命名规范
控制流程
错误和异常处理
代码格式
推荐使用 gofmt 等工具自动格式化代码
gofmt
官方的自动格式化工具
goimports
能自动控制库的引用
注释
注释应该做的
解释代码作用(适合注释公共符号)
解释代码是如何做的(适合注释实现过程)
解释代码实现的原因(适合解释代码的外部因素,提供额外上下文)
解释代码什么情况会出错(适合解释代码的限制条件)
公共符号始终要注释
包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释
任何既不明显也不简短的公共功能必须予以注释
无论长度或复杂程度如何,对库中的任何函数必须进行注释
有一个例外,不需要注释实现接口的方法
小结
代码是最好的注释
注释应该提供代码未表达出的上下文信息
命名
variable
简洁胜于冗长
缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
例如使用 ServeHTTP 而不是 ServeHttp
使用 XMLHTTPRequest 或者 xmlHTTPRequest
变量 ...
『Others』Windows 如何备份驱动文件
今天太忙了,随便水一篇博客
使用如下命令即可(别忘了管理员)
1dism /online /export-driver /destination:[备份路径]
例:
1dism /online /export-driver /destination:D:\tmp
『字节青训营-3rd』L2:Go 语言上手 - 工程实践
前情提要:
没错,这是昨天上午的课,但是昨天太忙了就一直拖到现在来写了 (其实今天也很忙)
配套实例代码:https://github.com/Moonlight-Zhao/go-project-example/tree/V0
这堂课主要学习企业实际项目开发中所涉及到的一系列知识点
语言进阶 - 协程
并发 VS 并行
并发:多线程程序在一个核的 CPU 上运行
并行:多线程程序在多个核的 CPU 上运行
(Go 可以重复发挥多核优势,高效运行)
Goroutine
线程:内核态,线程跑多个协程,栈 MB 级别
协程:用户态,轻量级线程,栈 KB 级别
一个简单的线程例子,快速打印 hello goroutine 0 ~ 4 :
12345678910func hello(i int) { println("hello goroutine :" + fmt.Sprint(i))}func HelloGoRoutine() { for i := 0; i < 5; i++ { go hello(i) // 使用 go 关键字开启协程 } time.Sleep(time.Second * 1) // 保证子协程执行完毕之前,主函数不退出,后面会有更好的方式}
可以看到不是按照顺序输出的,所以其实是并行输出的
协程间通信:CSP(Communicating Sequential Processes)
Go 提倡使用通道来实现协程间通信(通过通信共享内存)
当然,Go ...
『赛后感想』2022 计算机学院 Debug 杯程序设计大赛
相关链接随着阵阵花香,Debug杯来啦||计算机学院Debug杯程序设计大赛如期而至
呼~ 烧了我一下午脑细胞的比赛终于结束了
真的是累死了,比完之后眼睛痛,头也晕,腰也酸,关键是好好的睡午觉的时候要去比赛,简直要了我的命
来,来听我讲讲我今天的心路历程
中午出发前往赛场
时间来到 1:30 ,进入比赛,开始做题
T1
首先是第一题
一看就是纸老虎,前面大段大段的都是唬你的废话,直接找因子然后套公式就行了
因为找一个数的因子应该比较简单,所以我打算交给 Copliot 做,注释一写出来,代码直接就生成了,简直不要太爽
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include <bits/stdc++.h>#define ll long longusing namespace std;//int g(ll x){ if (x == 1) return 1; else return 0;}int main(){ // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); //求一个数的所有因子 int m; cin >> ...
『字节青训营-3rd』L1:Go 语言上手 - 基础语言
前情提要:
配套实例代码: https://github.com/wangkechun/go-by-example
简介
什么是 Go 语言
高性能、高并发
语法简单、学习曲线平缓
丰富的标准库
完善的工具链
静态编译
快速编译
跨平台
垃圾回收
哪些公司在使用 Go 语言
那必是很多呀~(略)
字节跳动为什么全面拥抱 Go 语言
Python 性能不好
C++ 不适合在线 Web 业务
早期团队非 Java 背景
部署简单,学习成本低
内部 RPC 和 HTTP 框架的推广
入门
开发环境
略
基础语法
这块就是查缺补漏了,仅挑选我认为有必要再温习的部分
[16] 字符串格式化
首先,最常用的是 Println() ,它的作用是打印变量并换行
Go 中也是有 Printf() 的,与 C 中的相比更加智能,你可以用 %v 来自动判断类型,而无需纠结整型用 %d ,实行用 %f 之类的
使用 %+v 可以打印详细信息,而 %#v 则可以更加详细
保留位数的浮点数与 C 中的做法相同
12345678910111213141516171819202122232425package mainimport "fmt"type point struct { x, y int}func main() { s := "hello" n := 123 p := point{1, 2} fmt.Println(s, n) // hello 123 fmt.Println(p) // & ...
『C++』标准模板库(STL)之算法篇
STL 里除了上一篇中的那些好用的容器之外,还提供了大量基于迭代器的非成员模板函数,能大量简化我们的编程工作
这些模板函数都在 algorithm 头文件里(翻译为算法)
所以我们需要先引入这个头文件 #include <algorithm> ,同时不要忘记指定命名空间,例如 using namespace std;
max(x,y) 、 min(x,y) 、 abs(x) 和 swap(x,y)
这四个一起讲
如你所见,这几个分别用来求最大值,最小值,绝对值,还有交换两个变量
对于两个求最值的 x 和 y 不仅可以是整型,还可以是实型
但是 abs() 只能用于整型,实型要用 fabs()
而对于 swap(),基本上所有地方都能用上
不过在比赛的话还是建议自己写函数覆盖掉,STL 里的没自己写的块
当然,你可能说使用宏不会更快吗?
12#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))
我只能说尽量不要用宏,绝对值用用还行,最大值和最小值千万别用(别问我是怎么知道的)
reverse(s,t)
reverse(s,t) 可以将数组指针在 s~t 之间的元素,或容器的迭代器在 s~t 范围内的所有元素进行反转(老规矩,左闭右开)
12345678910int a[10] = {10, 11, 12, 13, 14, 15};reverse(a, a + 4); //将 a[0] 到 a[3] 这4个元素反转for (int i = 0; i &l ...
『C++』标准模板库(STL)之容器篇
鄙人认为 C++ 相比 C 最大的更新就是内置的 STL 了,里面封装了一堆好用的容器,而不用关心其内部实现的原理和具体代码,十分方便快捷,除了容器外还有一堆算法,这个在下一篇会讲
本文仅记录我认为比较常用的容器,例如 pair 这种比较鸡肋的就不记录了
注意:使用 STL 必须要定义命名空间,例如using namespace std;
Vector
vector 直译为“向量”,但是一般当成可变长的数组用
众所周知,C/C++ 中的数组一旦定义就无法改变长度,而 vector 就可以解决这个问题,但是代价也是明显的:运行速度更慢
记得使用 #include <vector> 来引入头文件
定义
1vector<typename> name;
以上定义相当于定义了一个一维数组 name[size] ,但是 size 不确定,其长度可以根据需要而变化。其中 typename 可以是任何基本类型,例如 int、 double 、char 、结构体等,也可以套娃 STL 标准容器,例如 vector 、 queue 等
访问
使用下标
这就像是访问传统的数组一样,非常方便,例:
12vector<int> v;printf("%d ",v[index]);
注意:
不能越界,不然会报错
这种方法仅限于访问,不能通过它来修改
使用迭代器
可以将迭代器(iterator)理解为一种类似指针的变量。其定义为:vector<typename>::iterator it; ,例:
12vector<int&g ...
Golang 语法速通指南(五)复合数据类型之数组
首先,在 Go 中数组基本用不上,一般用的都是切片(slice)
因为 Go 与 C 中的数组有一个很大的不同,这个下面会讲,先说一些基本的东西
声明
这个应该很好理解
1var a [3]int // array of 3 integers
初始化
基础的写法
123var q [3]int = [3]int{1, 2, 3}var r [3]int = [3]int{1, 2}fmt.Println(r[2]) // "0"
根据元素个数确定长度
12q := [...]int{1, 2, 3}fmt.Printf("%T\n", q) // "[3]int"
注意不是 []int{1, 2, 3} ,这是切片的写法
使用索引和对应值初始化
这是一种 C 里没有的方法,算是一种改进
1r := [...]int{99: -1}
定义了一个含有 100 个元素的数组 r,最后一个元素被初始化为 -1,其它元素都是用 0 初始化
求长度
使用 len() 函数
12var a [3]int // array of 3 integersfmt.Println(a[len(a)-1]) // print the last element, a[2]
for 遍历
Go 中的 for 基本就和 Python 中的一模一样,分别返回下标和值
1234// Print the ind ...
『Others』TIM和微信如何备份聊天记录
很多情况下都有备份社交软件聊天记录的需求,这里总结了 TIM 和 微信 的备份方法
如果你想问 QQ 的话,其实跟 TIM 是大同小异的
总的来说,聊天记录有在手机上的,也有在 PC 上的,所以本文分为两个部分
移动端
TIM
首先在 PC 端主界面的 『菜单』 中找到 『备份与恢复』 -> 『备份至电脑』
然后你就可以开始操作了
微信
这个和 TIM 差别不大,在 PC 端的『菜单』中找到『备份与恢复』
之后也是类似的操作
PC 端
TIM
这里可以分为使用官方的途径,或者自己手动备份
官方入口
首先在任意聊天记录打开 『消息管理器』
然后在右上角的箭头处找到 『导出全部消息记录』
导出时不知道为什么我需要操作两次才能生成文件,可能是打包也需要点时间
不过我导出来只有大概 1G ,我怀疑只有部分的数据,个人还是建议下面的方法
简单粗暴的方法
这就属于手动备份了,在文件资源管理器中打开你的 文档 文件夹,找到 Tencent Files,所有的聊天记录及文件都在这里(如果你没有改过设置的话)
还原时将其手动复制到相同位置即可
微信
对于微信,目前我没有找到官方入口,所以只有手动备份一种方法
PS:手动备份本人在 Windows Sandbox 中亲测有效