自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 golang每日一题(字母异位词分组)

其实这道题从另一个思路来看,问题就迎刃而解了,找出每组字母相同并且字母个数也相同的元素,例如 [“nat”] 和 [“tan”] 这两组元素的大小和字母都相同。我们可以对元素的字母进行排序,然后对这些排序后的元素进行对比,看他是否和数组中的其他元素相等。这时可以借用散列表map,因为map的键是进行哈希的,所以同一个字母哈希的结果是相同的,也就是他们会有同一个键,这样我们可以把具有相同的键的元素,存到一个数组中,然后再把数组返回即可。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

2024-04-02 23:56:02 373

原创 应用层的http和https协议

前面我们已经了解到了,每次http请求都需要建立一个连接,创建连接的过程不但会消耗时间还会消耗资源,如果想要减少时间和资源的消耗,那就应该重用连接,所以http1.1中引用了重用连接的机制,在请求头中加入keep-live,即保持长连接,连接相应完不关闭,继续重用。因为长连接的存在,发送一次请求后并不会关闭TCP连接,所以可以不等第一次请求的响应,这大大减少了请求的队头阻塞,但是服务器必须按照接受请求的顺序来处理响应,如果一个连接的请求处理较长,那么后面的请求都要排队等待,响应的队头阻塞依旧存在。

2024-04-02 22:36:07 749

原创 深入了解Golang atomic原子操作

并发是指在同一时间间隔内,多个任务(线程、进程或活动)同时存在和执行的状态,在同一个时间点多个任务同时进行,当一个 CPU 在访问数据时,其他 CPU 可能同时在访问同一块数据或者相关的数据,如果其中一个 CPU 修改了数据并且写回了内存,其他 CPU 的缓存并不会立即更新,而是需要等待一定的时间或者触发特定的机制来使得缓存中的数据失效。这就可能导致其他 CPU 继续使用旧的数据,从而引发并发性问题,如数据不一致、程序错误等。

2024-02-20 17:23:29 1402 1

原创 Golang context 万字解析实现原理

如果 parent 没有实现afterFuncer接口,则启动一个协程,通过多路复用的方式监控 parent 状态,如果终止,则同时终止子 context,并把parent 的 err传递给子context,如果孩子终止则直接跳过,因为不影响parent。如果parent 是 cancelCtx 的类型,则加锁,并将子 context 添加到 parent 的 children map 当中,假如以后父context取消,可以直接用children map 取消所有的子context。

2024-02-05 12:12:46 1318 2

原创 Go实现LRU算法

LRU是内存淘汰策略,LRU (Least recently used:最近最少使用)算法在缓存写满的时候,会根据所有数据的访问记录,淘汰掉未来被访问几率最低的数据。也就是说该算法认为,最近被访问过的数据,在将来被访问的几率最大。双链表的话,那查询的时间复杂度不就是O(n)了,那应该怎么办,于是可以用双链表加Map的方式进行插入和查询,在插入的时候,把key,value 存到map中,那么这样查询的时候时间复杂读不就是O(n)了。,如果读取链表中的元素,他就会加载到。如果内存被读满,那么他就会。

2024-01-24 18:48:49 656

原创 Go实现双链表

直接通过root就可以看首位节点// Front 返回双链表的第一个元素地址return nil// Back 返回双链表的做后一个元素地址return nil。

2024-01-19 14:10:44 598

原创 Go实现单链表(并发安全)

上个章节我们实现了并发不安全的链表,这次我们实现并发安全的链表,以及增加了,首尾节点,更加方便的插入和查询。想必大家现在已经有了大概的思路了,下面的代码实现和上一章节差不多,但是更加巧妙的运用了head,tail指针,具体的思想可以把代码debug下了解他的思路。

2024-01-16 11:39:46 636

原创 Go实现单链表(并发不安全)

我们添加元素的时候,肯定要先创建一个空节点,然后判断其节点的长度是否为0,如果为零就把插入的元素添加到data中,如果不为零,创建一个node节点,把元素添加到node节点的data中,然后把根节点的元素指向node节点中的headNode 中,这样node就成了根节点了,然后在把根节点的地址指向链表。在指定位置插入的时候,我们要先判断异常情况,就是插入的指针一定要在节点长度的范围内,当插入的指针为1的时候也是特殊情况,他并不需要遍历,直接把根节点指向node的next,然后再把node指向根节点即可。

2024-01-15 19:31:39 993

原创 Go实现递归算法

这两个条件共同确保递归算法在合适的时候停止,并且在进行递归时问题规模逐渐减小。基线条件提供了终止递归的条件,而递归条件提供了问题继续分解的规则。在编写递归函数时,正确定义这两个条件非常关键,以确保算法的正确性和有效性。在递归算法中其实就是两个条件:基线条件(Base Case)和递归条件(Recursive Case)。哪些问题我们可以考虑使用递归来解决呢?即递归的应用场景一般有哪些呢?下章节我将讲解二分查找树,二分查找树也是用到了递归算法。递归实现斐波那契数列,就是前两个数加起来等于第三个数。

2024-01-11 14:23:39 557

原创 Go 实现二分查找

二分查找(Binary Search)是一种用于在有序数组中查找特定元素的高效算法。它的基本思想是通过反复将有序数组分成两半,确定目标元素可能存在的范围,然后逐步缩小这个范围直到找到目标元素或确定目标元素不存在。这个算法的时间复杂度是 O(log n),其中 n 是数组的长度。在有序数组中,二分查找是一种非常高效的查找算法。如果循环结束时仍未找到目标元素,说明目标元素不存在于数组中,返回 -1。以下是一个简单的二分查找的示例代码(假设数组。,初始时分别指向数组的起始和结束位置。时,继续执行以下步骤。

2024-01-10 17:17:34 631

原创 Go 每日一题(二)

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:5, nums = [0,1,2,3,4]输出:2, nums = [1,2,_]输入:nums = [1,1,2]

2024-01-09 15:30:54 441

原创 Mysql 进阶 (三):索引结构

索引就好比书籍的目录,能够快速指引我们找到特定内容的位置。在数据库中建立索引的目的是为了迅速定位特定值和字段,因为如果没有索引,数据库就得从头到尾逐行扫描整个表,直到找到符合条件的数据。随着表中数据量的增加,这种扫描方式会变得越来越慢,效率会受到明显的影响,索引其实就相当于字典中的目录。

2023-12-26 16:48:52 973

原创 Go 每日一题(一)

Go运⾏的时候包涵⼀个⾃⼰的调度器,这个调度器使⽤⼀个称为⼀个M:N调度技术, m个goroutine到n 个os线程 (可以⽤GOMAXPROCS来控制n的数量), Go的调度器不是由硬件时钟来定期触发的,⽽是 由特定的go语⾔结构 来触发的,他不需要切换到内核语境,所以调度⼀个goroutine⽐调度⼀个线程的 成本低很多。这种线程切换需要⼀个完整的上下⽂切换:即保存⼀个线程 的状态到 内存,再恢复另外⼀个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。

2023-12-25 09:31:36 933

原创 Go interface详解

Interface 使用场景依赖注入是一种设计模式,它可以减少类之间的耦合,提高代码的可维护性和可测试性。依赖注入的基本思想是,不让类自己创建它所依赖的对象,而是通过外部的方式(如构造函数、参数、属性等)将依赖的对象传递(或注入)给类。这样,类就不需要知道依赖对象的具体实现,只需要调用它们的接口方法。依赖注入有以下好处:

2023-12-23 22:56:04 1633

原创 Mysql进阶(二):MVCC详解

当前读:  当前读,读取的是最新版本, 但是读的时候不允许写,写的时候也不允许读,并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题,下面的操作都是当前读,不加锁的都是快照读。select...lock in share mode (共享读锁)例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录2.快照读。

2023-12-20 15:19:53 1005

原创 mysql 进阶(一):整体逻辑架构

MySQL的逻辑架构分为三层:连接层、服务层和存储引擎层,连接层主要负责连接处理、授权认证、安全防护等,服务层用于处理核心服务,如标准的SQL接口、查询解析、SQL优化和统计、全局的和引擎依赖的缓存与缓冲器等等, 存储引擎层负责实际的MySQL数据的存储与提取,服务器通过API与存储引擎进行通信1,MySQL最重要、最与众不同的特性就是它的存储引擎架构,这种架构将查询处理、其他系统任务、数据的存储与提取三部分分离。: 并发执行的事务之间是相互隔离的,一个事务的执行不应影响其他事务的执行。

2023-12-15 12:54:41 1295

空空如也

空空如也

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

TA关注的人

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