自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 【Go】-基于Gin框架的博客项目

这是Gin框架的Blog小demo,基本实现了登录注册,社区,发帖,投票功能,一些拓展的功能没有实现,但是其核心对于入门Gin来说,是不错的练习。

2024-10-30 21:31:30 654

原创 【Go】-基于Gin框架的IM通信项目

基于Gin框架的IM即时通讯小demo,实现了用户注册,添加好友,创建和加入群聊;好友聊天,群聊天;可以自定义个人信息,群信息;在聊天中可以发送文字、图片、表情、语音。这是Gin框架的IM小demo,基本实现了聊天功能,一些拓展的功能没有实现,但是其核心对于入门Gin和Websocket通信来说,是不错的练习。

2024-09-26 22:30:23 1053

原创 【Go】-viper库的使用

配置管理解析库,是由大神开发,他在google领导着golang的产品开发,他也是gohugo.io的创始人之一,命令行解析库cobra开发者。总之,他在golang领域是专家,很牛的一个人。viper是一个配置管理的解决方案,它能够从 json,toml,ini,yaml,hcl,env 等多种格式文件中,读取配置内容,它还能从一些远程配置中心读取配置文件,如consul,etcd等;它还能够监听文件的内容变化。功能介绍读取 json,toml,ini,yaml,hcl,env 等格式的文件内容。

2024-09-25 20:53:42 1234

原创 【Go】-Websocket的使用

可以理解为实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。轮询、长轮询(comet)、长连接(SSE)、WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、长轮询(comet)、长连接(SSE);

2024-09-25 20:17:13 1277

原创 【Go】-log库的使用

Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。Go内置的log库功能有限,例如无法满足记录不同级别日志的情况,我们在实际的项目中根据自己的需要选择使用第三方的日志库,如logruszap等。

2024-09-19 21:14:45 820

原创 【Go】-context库的使用

当截止日过期时,当调用返回的cancel函数时,或者当父上下文的Done通道关闭时,返回上下文的Done通道将被关闭,以最先发生的情况为准。取消此上下文将释放与其相关的资源,因此代码应该在此上下文中运行的操作完成后立即调用cancel,通常用于数据库或者网络连接的超时控制。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。取消此上下文将释放与其关联的资源,因此代码应该在此上下文中运行的操作完成后立即调用cancel。

2024-09-13 20:40:29 966

原创 【算法】-单调队列

说到单调队列,其实就是一个双端队列, 顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进行操作。其内部元素在队列内维持单调特性(递增或递减),类似单调栈,但是与单调栈FILO不同的是队列的FIFO的特性,配合滑动窗口的思想,可以解决区间内最值的问题。

2024-09-13 19:33:31 1065

原创 【Go】-go-redis库的使用

Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外,通过复制、持久化和客户端分片等特性,我们可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。

2024-09-12 22:16:01 1400

原创 【Go】-sqlx库的使用

在项目中我们通常可能会使用连接MySQL数据库。sqlx可以认为是Go语言内置的超集,它在优秀的内置基础上提供了一组扩展。这些扩展中除了大家常用来查询的和外还有很多其他强大的功能。

2024-09-11 21:35:19 1381

原创 【Go】-基于Gin和GORM的小清单项目

knoci/list: 基于Gin的待办清单小项目 (github.com)一个仿照github/Q1mi/bubble 做的一个gin框架练习这个项目是Gin和GORM的非常非常简单的小项目,适合新手入门。

2024-09-11 19:58:28 1236

原创 【Go】-Gin框架

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。如果你是性能和高效的追求者, 你会爱上Gin。在Gin框架中,SetFuncMap方法用于为模板渲染设置自定义的函数映射。这允许你在模板中使用自定义的函数,这些函数可以执行复杂的逻辑或操作,从而增强模板的灵活性和功能。:这是一个映射,键是字符串(函数名),值是可调用的函数func。这些函数可以在模板中被调用。定义一个不转义相应内容的safe},})

2024-09-10 21:37:16 1742

原创 【中间件】-容器编排平台Kubernetes简介

Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。Kubernetes这个名字源于希腊语,意为“舵手”或“飞行员”。K8s 这个缩写是因为 K 和 s 之间有 8 个字符的关系。Google 在 2014 年开源了 Kubernetes 项目。

2024-09-08 20:48:24 1257

原创 【Linux系统编程】-信号&进程间通信

定义:异步操作是指在执行一个任务时,调用者不需要等待任务完成,可以继续执行其他操作。特点:非阻塞:调用者在任务执行期间不会被阻塞,可以继续执行其他任务。并发执行:多个任务可以并发执行,提高资源利用率。复杂性:由于任务是并发执行的,可能涉及到并发控制和状态管理,逻辑相对复杂。处理方法:查询法,通知法。

2024-08-01 16:34:13 738

原创 【Linux系统编程】-多路IO&套接字

socket提供了`stream` `datagram` 两种通信机制,即流socket和数据包socket,流socket基于TCP协议,是一个有序、可靠、双向字节刘的通道,传输数据不会丢失、不会重复、顺序也不会错乱,数据包socket基于UDP协议,不需要建立和尉迟连接,可能会丢失或错乱。epfd 是 epoll 实例的文件描述符,events 是一个数组,用于接收触发的事件,maxevents 是数组的大小,timeout 是等待时间(单位为毫秒),0 表示立即返回,-1 表示无限等待。

2024-08-01 15:22:28 751

原创 【Linux系统编程】-线程

当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。该函数用于向指定的线程发送信号。线程的本质就是一个正在运行的函数 ,线程没有主次之分(main函数 也只是一个main线程),多个线程之间共享内存,线程的调度取决于调度器的测略。线程从启动例程返回,返回值就是线程的退出码,线程可以被同一进程的其他线程取消,线程调用`pthread_exit()`函数。

2024-07-29 11:00:13 907

原创 【Linux系统编程】-进程

进程(程序)是存储在存储介质(硬盘)上的一段代码,它在运行时被加载到内存空间(RAM)中。CPU会为进程分配一块地址空间,这块地址空间是虚拟的,并且可能与其他进程共享(mmap)。操作系统会将文件的物理扇区映射到进程的虚拟地址空间,而内存管理单元(MMU)负责处理虚拟地址到物理地址的转换。进程通过操作系统提供的API(应用程序编程接口)来执行任务。进程的执行是通过CPU的寄存器来控制的。

2024-07-24 12:02:50 683

原创 【Linux系统编程】-文件系统

在操作系统的世界中,文件系统扮演着至关重要的角色,它负责管理磁盘上的数据,提供数据持久化和访问的机制。Linux文件系统,以其强大的灵活性和高性能,成为了许多系统管理员和开发者的首选。本文将从底层角度,深入探讨Linux文件系统的内部工作原理。

2024-07-24 11:02:14 647

原创 【中间件】-消息队列Kafka简介

消息消息(Message):是队列系统中的基本数据单元,可以包含文本、二进制数据或序列化的对象。消息队列kafka 是消息队列,像消息队列投递消息的是生产者,消费消息的是消费者。增加生产者和消费者的实例个数可以提升系统吞吐。多个消费者可以组成一个消费者组,不同消费者组维护自己的消费进度,互不打搅。

2024-07-20 20:44:08 860

原创 【Linux系统编程】-标准IO&系统调用IO

缓冲区是一种数据存储机制,用于在数据传输或处理过程中暂存数据,主要作用是合并系统调用,可以通过setbuf更改。

2024-07-18 19:35:13 991

原创 【算法】-扫描线

在计算几何中,扫描线算法(scan line algorithm)一般用来解决几何图形的面积交并,周长交并问题,扫描线算法的核心思想是利用扫描线(通常是水平线或垂直线)在几何空间中“扫描”对象,以确定哪些对象与扫描线相交。下面我们就来通过求矩形的面积并来介绍扫描线算法。先来看看怎么求下面图形的面积并:传统算法是两个矩形面积相加减去重合的面积:但是这样算非常的耗费时间,因为每个矩形都需要两两配对,查看互相之间是否有交集。那么我们接下来就想着把矩形分成三部分:于是现在就变成了。

2024-05-30 22:39:06 2531 1

原创 【数据结构】-线段树

线段树(Segment Tree)是一种数据结构,它主要用于维护区间信息(要求满足结合律),它可以实现 𝑂(log⁡𝑛) 的区间修改,还可以同时支持多种操作(加、乘)。从数据结构的角度来说,线段树是用一个完全二叉树来存储对应于其每一个区间(segment)的数据。该二叉树的每一个结点中保存着相对应于这一个区间的信息。同时,线段树所使用的这个二叉树是用一个数组保存的,与堆(Heap)的实现方式相同。例如,给定一个长度为N的数组arr,其所对应的线段树TT的根结点代表整个数组所在的区间对应的信息,及。

2024-05-19 21:39:39 1677 1

原创 算法学习(7)-树

第一步选取任意3个数, 比如说是前3个, 将这3个数建成最小堆, 然后从第4个数开始, 与堆顶的数比较, 如果比堆顶的数要小, 那么这个数就不要, 如果比堆顶的数要大, 则舍弃当前堆顶而将这个数做为新的堆顶, 并再去维护堆, 用同样的方法去处理第5~10个数)从小到大排序的时候不建立最小堆而建立最大堆, 最大堆建立好后, 最大的元素在h[1],因为我们的需求是从小到大排序, 希望最大的放在最后。二叉树的特点是每个结点最多有两个儿子, 左边的叫做左儿子,右边的叫做右儿子, 或者说每个结点最多有两棵于树。

2024-05-15 22:16:26 991

原创 【算法】-动态规划之01背包和完全背包

有N件物品和一个最多能被重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。这是标准的背包问题,一开始我们可以尝试暴力的解法,每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!在下面的讲解中,我举一个例子:背包最大重量为4。物品为:重量 价值。

2024-05-12 22:11:54 681

原创 算法学习(6)-最短路径

现在回到问题:如何求任意两点之间的最短路径呢?通过之前的学习, 我们知道通过深度或广度优先搜索可以求出两点之间的最短路径。所以进行n^2遍深度或广度优先搜索, 即对每两个点都进行一次深度或广度优先搜索, 便可以求得任慈两点之间的最短路径。可是还有没有别的方法呢?当任意两点之间不允许经过第三个点时, 这些城市之间的最短路程就是初始路程,如下。接下来继续求在只允许经过1和2号两个顶点的情况下任意两点之间的最短路程。如何做呢?

2024-05-08 22:32:00 976

原创 【算法】-并查集

并查集是一种树形的数据结构,我们可以使用它来进行集合上的合并与查询等问题。合并:将两个集合合并成一个集合。查询:确定某个元素处于哪个集合。如图,{3,1,2,4,0,10}{3,1,2,4,0,10} 表示一个集合,{5,7,8,11}{5,7,8,11} 表示另一组集合。可以看出并查集是多叉树结构,我们用根节点来表示这个根节点所在的集合(即根节点作为集合的"代表元素")。

2024-05-07 19:49:04 964

原创 【机器学习】-K近邻算法(KNN)

(1)计算已知类别数据集中的点与当前点之间的距离;(2)按照距离递增次序排序;(3)选取与当前点距离最小的k个点;(4)确定前k个点所在类别的出现频率;(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

2024-05-05 22:32:10 2640 6

原创 【数据结构】-AVL树

二叉排序树的形状取决于数据集,当二叉树的高度越小、结构越合理,搜索的性能就越好,时间复杂度 O(log2n)。G. M. Adelson-Velsky 和 E. M. Landis 在1962年的论文《An algorithm for the organization of information》中发表了一种名为AVL 树的数据结构,它就能很好地解决这个问题。AVL 树具有以下 2 个性质:左子树和右子树的深度之差的绝对值不超过 1;左子树和右子树通通都是 AVL 树。

2024-04-29 18:30:02 770

原创 算法学习(5)-图的遍历

使用深度优先搜索来遍历这个图的过程具体是:首先从一个未走到过的顶点作为起始顶点, 比如以1号顶点作为起点。沿1号顶点的边去尝试访问其它未走到过的顶点, 首先发现2 号顶点还没有走到过, 于是来到了2 号顶点。再以2 号顶点作为出发点继续尝试访问其它未走到过的顶点, 这样又来到了4号顶点。再以4 号顶点作为出发点继续尝试访问其它未走到过的顶点。但是, 此时沿4号顶点的边, 已经不能访问到其它未走到过的顶点了, 所以要返回到2号顶点。

2024-04-28 22:07:42 1017

原创 【数据结构】-图以及图的存储结构

图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图 𝐺 抽象地表示为一组顶点 𝑉 和一组边 𝐸 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。如果将顶点看作节点,将边看作连接各个节点的引用(指针),我们就可以将图看作一种从链表拓展而来的数据结构。如图 9-1 所示,相较于线性关系(链表)和分治关系(树),网络关系(图)的自由度更高,因而更为复杂。

2024-04-28 20:38:51 812

原创 算法学习(4)-搜索

具体的算法是:查找种子点周边的点, 将与种子点颜色相近的点(可以设置一个阙值)入队作为新种子, 并对新入队的种于也进行同样的扩展操作, 这样就选取了和最初种子相近颜色的区域。因为等于0的点是海洋, 小于0的点是已经被染色的小岛, 我们可以从(1,1)开始, 一直枚举到(n, m), 对每个点进行尝试染色。如果这个点符合所有的要求, 就对这个点进行下一步的扩展, 即dfs(tx,ty,step+1),注意这里是step+1, 因为一旦你从这个点开始继续往下尝试, 就意味着你的步数已经增加了1。

2024-04-25 21:09:10 1016 1

原创 【数据结构】-二叉搜索树(BST)

如图所示,二叉搜索树(binary search tree)满足以下条件。对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值。任意节点的左、右子树也是二叉搜索树,即同样满足条件1.。二分搜索树有着高效的插入、删除、查询操作。平均时间的时间复杂度为 O(log n),最差情况为 O(n)。二分搜索树与堆不同,不一定是完全二叉树,底层不容易直接用数组表示故采用链表来实现二分搜索树。只有在高频添加、低频查找删除数据的场景下,数组比二叉搜索树的效率更高。查找元素插入元素。

2024-04-23 21:31:26 1159

原创 算法学习(3)-枚举

枚举算法又叫做穷举绊法, 光听这名字是不是就觉得很暴力很暴力呢。首先还是从一个小学三年级的奥数题开始吧。小哼在数学课上遇到一道奥数题是这样的, 口3x6528=3口x8256, 在两个口内填入相同的数字使得等式成立。你可能觉得这个太简单了!用3行代码就可以搞定。这就是最简单的枚举算法。枚举算法的基本思想就是“ 有序地去尝试每一种可能“。现在小哼又遇到一个稍微复杂一点的奥数题, 口口口+口口口=口口口,将数字1~9分别。

2024-04-23 20:40:14 320

原创 算法学习(2)-栈、队列、链表

游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。在这个队列当中,新来的人总是站在队列的最后面,来得越早的人越靠前,也就越早能买到票,就是先来的人先服务,我们称为“先进先出”(First In First Out,FIFO)原则。队列是一种特 殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为“出队”,而在队列 的尾部(tail)进行插入操作,这称为“入队”。

2024-04-21 21:44:09 958 1

原创 算法学习(1)-排序

假设我们要从大到小排序5个同学的分数,分别是2分,3分,5分,5分和8分,满分10分,因此我们需要10个桶,不难得到桶排序中,桶的大小就是MaxSize+1,如果MaxSize很大,桶排序其实是很浪费空间的。这种排序方法我们暂且叫它“桶排序”。因为其实真正的桶排序要比这个复杂一些,,目前此算法已经能够满足我们的需求了。这个算法就好比有 11 个桶,编号从 0~10。每出现一个数,就在对应编号的桶中放一个 小旗子,最后只要数数每个桶中有几个小旗子就 OK 了。

2024-04-19 19:14:28 804 1

原创 【算法】-前缀和与差分

那么就可以把 preSum 的公式统一为,此时的 preSum[i] 表示 nums 中 iii 元素左边所有元素之和(不包含当前元素 iii)。​下面以 [1, 12, -5, -6, 50, 3] 为例,用动图讲解一下如何求 preSum。

2024-04-19 17:22:00 657 1

原创 【算法】-动态规划之线性DP股票问题

动态规划(Dynamic Programming),简称DP,是一种将一个复杂问题分解为多个简单的子问题求解的方法。将子问题的答案存储在记忆数据结构中,当子问题再次需要解决时,只需查表查看结果,而不需要再次重复计算,因此节约了计算时间。国外知乎 Quora 上一个帖子问应该怎样给四岁的孩子解释什么是动态规划,其中一个非常经典的回答如下:动态规划通常基于一个递推公式和一个或多个初始状态。当前问题的解可以分解为多个子问题解得出。使用动态规划只需要多项式时间复杂度,因为比回溯法和暴力法快很多。

2024-04-17 22:47:42 813 1

原创 【数据结构】-二叉树的遍历

二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。/* 二叉树节点结构体 */int val;// 节点值int height;// 节点高度// 左子节点指针// 右子节点指针} TreeNode;/* 构造函数 */int/* 二叉树节点结构体 */ typedef struct TreeNode {int val;

2024-04-16 22:31:46 820

原创 【算法】-单调栈

单调栈是栈数据结构的一种变形,在满足栈先进后出(FILO)的条件下,还要满足栈内元素遵循单调性。比如从栈底到栈顶元素保持递增的单调递增栈。

2024-04-14 20:51:30 988 1

原创 【算法】-KMP算法

KMP 是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法。Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法。

2024-04-14 20:33:20 590 1

原创 【数据结构】-链表排序

我们从数组中选择一个元素,我们把这个元素称之为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边, 所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。从中轴元素那里开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),接着我们通过递归的方式,让中轴元素 左边的数组和右边的数组也重复同样的操作,直到数组的大小为1,此时每个元素都处于有序的位置。:首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。

2024-04-11 21:39:22 2316 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除