- 博客(54)
- 收藏
- 关注
原创 沥川的算法学习笔记:基础算法(4)----前缀和与差分
二维前缀和算法是前缀和思想的扩展,用于高效计算矩阵中某个子矩阵的元素之和。它通过预处理构造一个二维前缀和数组,使得每次查询子矩阵的和可以在 O(1)时间内完成。前缀和(Prefix Sum)是一种常见的算法思想,通常用于快速计算数组中某个区间的元素之和。,假设为2,1,3,6,4,要求l到r的区间范围内的l到r个数的和。s[r]-s[l-1]即为第l个元素到第r个元素的和。l到r的区间范围内的就等于s[r]-s[l-1],其中s[i]=s[i-1]+a[i]
2024-12-06 21:25:18
1002
原创 跨平台应用开发框架(4)----Qt(系统篇)
在 Qt 中,事件(Event)是对象之间进行通信的一种方式。当用户与应用程序进行交互(如点击鼠标、按下键盘按键)或者系统发生某些状况(如定时器触发、窗口大小改变)时,Qt 会生成相应的事件,并将这些事件发送到相关的对象进行处理。
2024-11-29 21:26:19
922
1
原创 跨平台应用开发框架(3)-----Qt(样式篇)
1.QSS1.QSSQSS 的功能类似于网页开发中的 CSS(层叠样式表),它允许开发者通过一种声明式的语法来控制界面元素的外观,包括颜色、字体、边框、背景等诸多方面。1.基本语法2.QSS设置方式1.指定控件样式设置给widget设置样式2.全局样式设置通过QApplication的setStyleSheet方法设置全局样式1.样式的层叠特性全局样式给控件设置了属性1,指定控件样式设置了属性2,这两个属性都会产生作用。
2024-11-27 14:20:04
1209
原创 跨平台应用开发框架(2)----Qt(窗口篇)
QMainWindow 是⼀个为用户提供主窗口程序的类,继承自QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中心部件(central widget),它是许多应⽤程序的基础,如⽂本编辑器,图片编辑器等。它是⼀个可移动的组件,它的元素可以是各种窗⼝组件,它的元素通常以图标按钮的方式存在。方式二:在堆上动态创建。
2024-11-25 16:11:29
825
原创 跨平台应用开发框架(1)----Qt(组件篇)
丰富的控件和布局:Qt 提供了一套丰富的 GUI 控件(如按钮、文本框、表格、树形控件等)和布局管理器,使得开发者可以快速构建具有丰富界面的应用程序。图形和多媒体支持:Qt 提供强大的图形绘制功能(如 2D 图形、图像处理等),同时还支持音频、视频和动画等多媒体功能。Qt Creator:一个强大的集成开发环境(IDE),专为 Qt 开发设计,支持调试、代码补全、版本控制等功能。性能和扩展性:Qt 经过多年的优化,具有良好的性能,并且易于扩展,支持与 C++ 代码、第三方库等集成。
2024-11-24 16:03:37
1966
2
原创 沥川的算法学习笔记:基础算法(3)----高精度算法
高精度除法(div): 这个函数接受一个整数向量 A 和一个整数 b,返回它们的商和余数。在每一步中,它将被除数的一部分与除数进行比较,确定可以整除的最大倍数。高精度加法(add): 这个函数接受两个整数向量 A 和 B,返回它们的和。高精度减法(sub): 这个函数接受两个整数向量 A 和 B,返回它们的差。高精度乘法(mul): 这个函数接受一个整数向量 A 和一个整数 b,返回它们的乘积。函数首先将 A 中的每个元素与 b 相乘,并将结果累加到结果向量 C 中。然后,它去除结果中前导的零。
2024-11-22 21:41:52
320
原创 高效序列化工具(1)-----Protobuf
是由 Google 开发的一种语言中立、平台中立、可扩展的序列化结构数据格式。Protobuf 可以在不同的语言(如 C++、Java、Python 等)之间高效地交换数据。:Protobuf 支持多种编程语言,如 C++、Java、Python、Go、Ruby、C# 等,可以在不同语言的应用程序之间进行数据交换。:通过一种专用的 IDL(接口定义语言)定义数据结构,使得数据序列化和反序列化过程变得简单。:生成的代码包含序列化(将对象转换为字节流)和反序列化(将字节流恢复为对象)的逻辑。
2024-11-21 19:52:58
816
原创 非关系型数据库(1)---MongoDB
MongoDB是一个基于文档的NoSQL数据库,它使用JSON-like的BSON格式来存储数据。MongoDB的设计旨在提供高性能、高可用性和易于扩展的特点,特别适合处理大量数据和高并发的数据访问需求。在MongoDB中,对数据库本身的操作包括创建数据库、切换数据库、删除数据库以及查看数据库信息等。如果数据库不存在,则会创建一个新的数据库。命令可以删除当前数据库。命令可以查看当前数据库的统计信息,例如数据大小、索引大小、文档数量等。:数据存储在类似JSON的文档中,每个文档都可以有不同的字段和结构。
2024-11-07 14:41:53
1358
原创 沥川的算法学习笔记:基础算法(2)----归并排序
具体的方法是在合并两个有序子数组的步骤中,当将左子数组的元素放入临时数组时,如果右子数组中还剩余的元素比当前的左子数组元素要小,则说明存在逆序对。统计逆序对的数量,每次发现逆序对时,将逆序对的数量加上右子数组当前元素的位置与左子数组剩余元素的数量,即逆序对的数量 += len(left) - left_pointer。归并排序是一种常见的排序算法,它的基本思想是将一个数组划分成两个子数组,然后分别对子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。合并两个有序的子数组,得到一个更大的有序数组。
2024-11-01 15:00:33
471
原创 关系型数据库(1)----MySQL(初阶)
索引是一个排序的列表,存储着索引的值和包含该值的数据所在行的物理地址。存储引擎层是 MySQL 的底层,负责数据的存储和提取。:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。语句更新视图中的数据。但是,更新视图有一些限制,例如,如果视图是基于多个表创建的,或者包含聚合函数、子查询等,则可能无法更新视图。:提供 SQL 命令的接口,包括内置函数(日期、时间、数学和加密函数等)和跨存储引擎的功能(如存储过程、触发器、视图等)。
2024-10-25 16:44:07
1436
3
原创 反向代理服务器---NGINX
用户的请求首先经过VPN服务器,然后由VPN服务器转发给目标服务器,目标服务器返回的响应也会经过VPN服务器再传递给客户端。正向代理的主要作用是隐藏客户端的真实IP地址和身份,提供访问控制和安全性,以及加速网络访问。此外,正向代理还可以对客户端的请求进行缓存,减轻服务器负载,并提供缓存加速功能。反向代理(Reverse Proxy)是一种代理服务器的工作方式,它接收客户端的连接请求,然后将请求转发给内部网络的服务器。与传统的正向代理不同,正向代理代表客户端向服务器发送请求,而反向代理则代表服务器接收请求。
2024-10-25 15:51:05
930
原创 高效容器化技术(3)---docker镜像仓库
Docker镜像仓库是存储和管理Docker镜像的地方。Docker Registry:Docker官方提供的镜像仓库服务,用户可以在本地搭建私有仓库,用于存储和共享自己的镜像。Docker Hub:Docker官方提供的公共仓库,包含了大量的官方和社区维护的公共镜像,用户可以自由下载和使用。Quay:由CoreOS开发的容器镜像仓库,提供了可靠的镜像构建、存储和分发功能,并支持私有和公共仓库。该命令用于删除本地已有的镜像,包括从镜像仓库中下载的镜像和通过构建Dockerfile生成的镜像。
2024-10-19 18:06:42
1109
原创 高效容器化技术(2)---docker的安装
在安装Docker之前,首先需要检查操作系统的版本是否支持Docker。Docker要求操作系统为64位版本,内核版本为3.10以上。其中,"镜像源地址"是你要使用的镜像源的地址,可以查找合适的镜像源地址,比如阿里云、京东云等提供的镜像源地址。完成以上步骤后,Docker将从你配置的镜像源地址下载镜像。出现docker版本,说明你的docker已经成功安装了!如果文件不存在,可以创建一个新文件。添加Docker软件源。1.docker的安装。1.docker的安装。
2024-10-18 16:18:20
645
原创 计算机网络自顶向下(4)---应用层HTTP协议
HTTP协议规定了请求方法(GET、POST、PUT、DELETE等)、请求头部、请求体、响应状态码、响应头部等一系列规范,使得客户端和服务器能够进行有效的通信。通过发送HTTP请求,客户端可以向服务器请求特定的资源,如HTML页面、图片、视频等,或者执行特定的操作,如提交表单数据、更新服务器上的数据等。请求头:包含关于客户端和请求的附加信息,如User-Agent(客户端类型)、Host(请求的主机名)、Content-Type(请求体的类型)等。请求行:包含请求方法、请求的URL和HTTP协议的版本。
2024-10-18 15:10:22
1088
1
原创 沥川的算法学习笔记:基础算法(1)----快速排序
快速排序的基本思想是选择一个基准元素,将数组分成两个子数组,其中一个子数组的元素都小于等于基准元素,另一个子数组的元素都大于等于基准元素,然后对这两个子数组递归地应用快速排序算法。将数组分成两个子数组,左边的子数组中的元素都小于等于基准元素,右边的子数组中的元素都大于等于基准元素。最坏情况:如果数组已经有序或接近有序,并且每次选择第一个或最后一个元素作为基准元素,则快速排序的时间复杂度会退化为O(n^2),这是因为每次划分只能将数组分成两个部分,其中一个部分为空,没有减少问题的规模。
2024-10-17 20:13:03
602
原创 计算机网络自顶向下(3)---TCPsocket
socket()函数:创建一个新的套接字,返回一个套接字描述符(file descriptor)。accept()函数:接受客户端的连接请求,并返回一个新的套接字描述符,用于与客户端进行通信。type参数指定套接字的类型,如SOCK_STREAM表示TCP套接字、SOCK_DGRAM表示UDP套接字。accept()函数:接受客户端的连接请求,并返回一个新的套接字描述符,用于与客户端进行通信。socket()函数:用于创建一个新的套接字,返回一个套接字描述符(文件描述符)。
2024-10-16 16:35:48
1070
1
原创 前端编程艺术(5)---Vue3(从零基础到项目开发)
Vue.js 遵循组件化架构,这意味着用户界面被划分为小型、可重用的组件,可以轻松地组合这些组件来构建复杂的界面。是Vue 3中的一个全局API,用于创建一个包装对象,使其变成响应式数据。函数是Vue 3中的一个全局API,用于创建响应式数据。该代理对象会拦截对数据的访问和修改,以实现响应式的效果。函数可以将普通的JavaScript对象转换为响应式的数据对象,这意味着当数据发生变化时,相关的视图会自动更新以反映新的数据。对象本身是一个响应式的代理对象,它会拦截对值的访问和修改,以实现响应式的效果。
2024-10-14 15:54:02
2460
4
原创 前端编程艺术(4)---JavaScript进阶(vue前置知识)
Promise.race():接受一个Promise对象的数组,并返回一个新的Promise对象,该新Promise对象在任何一个输入Promise对象成功解析或拒绝后就会解析或拒绝。Promise.all():接受一个Promise对象的数组,并返回一个新的Promise对象,该新Promise对象在所有的输入Promise对象都成功解析后才会成功解析。原始的模块化方法:通过使用全局对象(如window对象)来定义和访问模块,将模块的代码放在不同的script标签中。
2024-10-05 19:38:47
1544
原创 前端编程艺术(3)---JavaScript
JavaScript是一种脚本编程语言,通常用于为网页增加交互性和动态效果。它是一种高级语言,可以在客户端(即网页浏览器)和服务器端运行。JavaScript的设计目标是让网页和用户能够交互,动态地改变内容、样式和行为。JavaScript的语法和结构与其他编程语言,如C语言和Java类似,易于学习和理解。它不需要编译,可以直接在网页中嵌入使用,因此被广泛应用于网页开发。JavaScript可以用来操作网页中的HTML元素、处理用户输入、发送网络请求、验证表单、创建动画效果等。
2024-10-05 17:21:58
1618
1
原创 前端编程艺术(2)----CSS
1.CSSCSS,全称为层叠样式表(Cascading Style Sheets),是一种用来控制网页布局和样式的标记语言。它与HTML结合使用,通过为HTML元素应用样式来美化和格式化网页。使用CSS,可以将网页的布局、颜色、字体、背景、边框等各个方面进行精确控制,从而使网页呈现出专业、统一和美观的外观。CSS通过选择器和声明来定义样式,选择器用于选中要应用样式的HTML元素,声明则定义元素的样式属性和值。2.CSS引入在HTML文件中引入CSS有三种方式:内部样式表、外部样式表和行内样式。
2024-10-02 14:30:53
1720
原创 计算机网络自顶向下(2)----UDPsocket
Socket 提供了一种标准的编程接口,使得应用程序可以使用不同的协议(如 TCP、UDP)进行数据传输。是Linux网络编程中的一个系统调用,用于向一个指定的地址发送数据。这个系统调用通常用于UDP协议,因为UDP是无连接的,所以需要在每次发送数据时指定目标地址。通过套接字,应用程序可以使用不同的协议(如TCP、UDP)进行数据的传输。它是操作系统提供的一种接口,通过该接口,应用程序可以通过网络连接进行数据的传输和接收。是一个系统调用,用于从(已连接的或未连接的)socket接收数据。
2024-09-30 20:51:41
550
原创 前端编程艺术(1)---HTML
HTML(HyperText Markup Language,超文本标记语言)是一种用于创建网页的标准标记语言。它描述了一个网站的结构骨架,使得浏览器能够展示具有特定格式的文本、链接、图片和其他内容。:主体元素,包含可见的页面内容,如文本、图片、视频、游戏、可播放的音频等。:头部元素,包含元信息,如字符集、页面标题、样式表链接、脚本链接等。标签:HTML标签用于标记文本,以便浏览器知道如何渲染它们。属性:提供关于元素的额外信息,通常在开始标签中规定。:根元素,包裹所有其他HTML元素。
2024-09-30 14:01:51
1340
原创 C++番外篇-------排序算法总结
1.冒泡排序1.冒泡排序冒泡排序是一种简单的排序算法,它通过重复遍历要排序的列表,依次比较每对相邻项,并在必要时交换它们,从而使较大的元素逐渐“浮”到列表的顶部,而较小的元素则“沉”到底部。以下是冒泡排序的基本步骤:1. 从列表的第一个元素开始,依次比较相邻的两个元素。2. 如果顺序不正确(例如,前一个元素大于后一个元素),则交换它们。3. 继续进行这样的遍历和比较,直到到达列表的末尾。4. 重复以上步骤,直到整个列表都被排序。2.选择排序。
2024-09-29 22:05:20
855
1
原创 计算机网络自顶向下(1)---网络基础
广域网通常通过公共的通信线路,如电话线、光纤、卫星等建立起连接,可以实现跨地区、跨国家的通信和数据传输。局域网(Local Area Network,LAN)是指在较小地理范围内,由计算机和终端设备相互连接而成的网络。网络协议是网络通信中所使用的一套规则和约定,用于确定数据如何在网络中传输、路由和接收。而广域网的传输速率受到地理距离和网络基础设施的限制,一般较慢。而广域网的建设和维护成本较高,需要更多的硬件设备和专业人员。网络分层结构是指将网络的功能划分为不同的层次,每个层次负责不同的任务和功能。
2024-09-28 15:12:44
662
原创 从零开始学习Linux(14)---线程池
如果锁不可用,线程就重复检查,直到锁可用为止。例如,假设线程A持有资源1并等待资源2,线程B持有资源2并等待资源1,这时线程A和线程B都会被阻塞,因为它们都在等待对方释放资源,而对方又不会释放资源,从而形成了一个循环等待链。例如,一个全局锁被用来保护一个共享资源和一个私有资源,如果一个线程在访问私有资源时持有全局锁,那么其他线程在访问共享资源时也将无法获取锁,从而导致死锁。例如,一个函数使用了一个外部锁来访问一个资源,如果该函数在执行过程中被另一个线程调用,而该线程也试图访问相同的资源,可能会导致死锁。
2024-09-22 16:31:47
810
原创 从零开始学习Linux(13)---多线程
pthread_create是 POSIX 线程(pthread)库中的一个函数,用于在 POSIX 兼容的操作系统中创建新的线程。地址空间是计算机内存管理中的一个基本概念,它指的是一个程序在运行时可以访问的内存地址的集合。pthread_exit是 POSIX 线程(pthread)库中的一个函数,用于使当前线程立即终止并返回指定的值。:指的是实际的物理内存地址,即内存条上的每一个存储单元都有一个唯一的物理地址。线程是进程内部的一个执行分支,线程是CPU调度的基本单位。:这是要取消的线程的线程 ID。
2024-09-21 12:57:24
1186
原创 高效容器化技术(1)---容器化技术简介
在容器化中,这用于创建容器的文件系统,使得容器可以在不影响宿主机文件系统的情况下拥有自己的文件系统。控制组是Linux内核的另一个特性,它允许限制、记录和隔离进程组使用的物理资源(如CPU、内存、磁盘I/O等)。容器镜像是容器的静态表示,它包含了容器运行所需的所有文件和元数据。镜像是分层构建的,每一层代表了对文件系统的一组更改。:容器化确保了从开发到测试再到生产环境的一致性,减少了“在我的机器上可以运行”的问题。:容器可以在任何支持容器技术的操作系统上运行,这使得应用程序的迁移和部署变得非常简单。
2024-09-17 18:20:30
489
原创 从零开始学习Linux(12)---进程间通信(信号量与信号)
信号是操作系统提供的让用户(进程)给其他进程发送异步信息的一种方式,Linux定义了一系列的信号,每个信号都有一个唯一的编号和一个默认的行为。在并发编程中,当多个进程或线程需要访问共享资源时,信号量用来确保资源在同一时刻只被一个进程或线程访问,从而避免竞争条件。:如果信号量的值大于零,则将其减一;否则,进程或线程会被阻塞,直到信号量值变为正。:信号量是一个非负整数,用来表示可用的资源的数量。:其值可以是任何非负整数,用于表示资源的可用数量。:增加信号量的值,并唤醒等待的进程或线程。
2024-09-16 20:17:55
929
1
原创 从零开始学习Linux(11)----进程间通信(管道和共享内存)
往往需要多个进程协同,共同完成一些事情一个进程把自己的数据,能够交给另一个进程。进程间通信的本质:先让不同的进程,看到同一份资源(一般都是要由OS提供)基于文件的,让不同进程看到同一份资源的通信方式,叫做管道!管道只能被设计成为单向通信2.管道。
2024-06-28 21:10:32
457
2
原创 从零开始学习Linux(10)----动静态库
动态库加载后,会被映射到该进程的地址空间中。具体来说,是先在页表中填写好对应虚拟地址和物理地址之间的映射关系,才被映射到进程地址空间中的共享区中。如果此时另一个进程也要加载该动态库,只需要填写它的页表的映射关系即可,不需要再从磁盘中加载一份动态库代码和数据,如果所需库不在内存中才需要加载。这样就保证了一个动态库最多只在内存中存在一份,大大节省了内存开销。当动态库被加载时,它的代码和数据会被加载到物理内存中。将源文件编译为.o文件。fPIC为产生位置无关码。1.站在系统角度理解。
2024-06-25 11:16:03
1041
1
原创 从零开始学习Linux(9)----文件系统
磁盘,SSD,OS要不要管理一下磁盘上的文件呢?我们一直在说的缓冲区和内核中的缓冲区,没关系(尽管他有),是语言层面的缓冲区,C语言自带缓冲区。如果向显示器进行打印,刷新方案就是行,对test.txt刷新策略,立即变成了全缓冲,b.访问文件之前,都得先打开,修改文件,都是通过执行代码的方式完成修改,调用系统调用是又成本的,时间&&空间,有效的减少C接口的使用效率。系统中是不是所有得文件都被打开了呢?f.系统中是不是所有的文件都被进程打开了?3.全缓冲,全部刷新---普通文件,缓冲区被写满,才刷新。
2024-06-03 16:28:35
1078
2
原创 从零开始学习Linux(8)----自定义shell
shell从用户读入字符串“ls”,shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序,并等待这个进程结束。5. 父进程等待子进程退出(wait)3. 建立一个子进程(fork)4. 替换子进程(execvp)
2024-05-14 10:39:28
313
原创 从零开始学习Linux(6)----进程控制
在上面的演示中,为什么我们不能像ls命令一样执行而是./的方式来执行,这时需要将你的程序所在的路径添加到环境变量中。我们可以通过不同的选项,让我们的同一个程序执行它内部不同的功能。命令行参数时Linux指令的基础。
2024-05-10 14:55:25
1164
原创 从零开始学习Linux(5)----进程
本质是设备之间会进行数据的来回拷贝,拷贝的整体速度,是决定计算机效率的重要指标。引入内存把效率问题转化为了软件问题。CPU只和内存打交道,外设只和内存打交道。2.操作系统任何计算机系统都包含一个基本的程序集合,称为操作系统(os),第一个被加载的软件是操作系统,操作系统是一个进行软硬件资源管理的软件。操作系统包括:1.内核(进程管理,内存管理,文件管理,驱动管理)2.其他程序(函数库,shell程序等)设计操作系统的目的:1.与硬件交互,管理所有的软硬件资源。
2024-04-22 15:47:15
958
1
原创 从零开始学习Linux(4)----yum和vim
LInux gcc出来的二进制程序默认是release模式,要使用gdb调试,必须在源代码生成二进制程序时加上-g选项。vim是一个多模式的编辑器,vim里面有很多的子命令,来编写代码,主要有命令模式,插入模式和底行模式三种模式。yum是我们Linux预装的一个指令,搜索,下载,安装对应的软件,相当与Linux的应用商店。gcc检查代码的规范性,语法错误,确定代码实际要做的工作,然后将代码翻译为汇编语言。Linux中我们要进行工具/指令/程序,安装,检查卸载等,需要yum的软件。
2024-04-19 16:21:38
1012
1
原创 从零开始学习Linux(3)----权限
Linux用户:1.root,超级管理员2.非root,XXX,普通用户命令:su[用户名]功能:切换用户。su -:是指以root的身份重新登录一次。普通用户切换root需要输入密码,root切换普通密码无需输入密码。普通用户切换另一个普通用户,需要对方的密码。sudo 命令:对该命令进行提权,以root的身份执行该命令。注意。
2024-04-18 19:18:29
1023
4
原创 从零开始学习Linux(2)----基本命令(2)
head [参数]... [文件]...head用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。-n
2024-04-15 16:18:37
998
5
原创 从零开始学C++(9)----C++11新特性
在上述代码中,使用auto定义了变量x,并赋值为10,则变量x的类型由它的初始化值决定。由于编译器根据初始化值推导并确定变量的类型,因此auto修饰的变量必须初始化。除了修饰变量,auto还可作为函数的返回值。在C++11标准中,auto被赋予了新的功能,使用它可以让编译器自动推导出变量的类型。
2024-04-14 15:30:25
1203
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人