自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构STL——golang实现独立请求singleFlight

github仓库存储地址:https://github.com/hlccd/goSTL概述​ singleFlight,独立请求,用于做并发控制,常用于防止缓存击穿。​ 对于缓存来说,它一般会有一个过期时间,过期后进行删除,当在删除后的短时间内,如果突然出现了一大批对该数据的并发请求,次数他们都没有从缓存中读取到数据,然后集体涌入数据库中进行IO,引起数据库过载造成故障。​ 为了解决这个问题,可以通过给一组相同的请求添加一个可重入锁,即对于拥有同一个关键词的请求来说,可以视为一组相同的请求,此

2021-12-29 00:22:48 440

原创 数据结构STL——golang实现布隆过滤器bloomFilter

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 布隆过滤器(bloom filter),它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于寻找一个元素是否在一个集合中,但由于元素的通过hash映射转化到集合内的,所以存在误差,即可以百分百判断其不存在,但不能确定其一定存在。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。原理​ 如果想要判断一个元素是不是在一个集合里,除了可以将所有元素保存起来

2021-12-28 22:43:13 740

原创 数据结构STL——golang实现一致性哈希consistentHash

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 一致性哈希(consistent hash),与一致性哈希相对的是不一致性哈希,但常见的所有的哈希几乎都是不一致的,即哈希桶的容量的不固定的,可以根据需求进行扩容和缩容,不一致性哈希可以提高空间的利用率,但相应的,当进行扩容和缩容操作时需要对桶内存储的所有元素重新计算哈希值,这在某些情况是十分麻烦的事情,特别是在分布式存储的环境下,此时每个哈希结点就相当于一个机器,文件分布在哪台机器由哈希算法来决定,这个系统

2021-12-27 11:59:21 619

原创 数据结构STL——golang实现前缀基数树radix

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 前缀基数树(Radix),又叫基数树,是前缀树的一种变种。​ 它和前缀树不同的地方在于,它前缀树是将一个string按char进行分段保存,而基数树是将多个char设为一层,然后将string进行分层保存,一般利用**‘/’**作为分层标识。​ 它可用于string的存储和索引,当加上模糊匹配时也可用于实现动态路由。原理​ 本次实现的前缀基数树的每个结点分别存储一层的string,终结点存储整个

2021-12-26 17:32:33 681

原创 数据结构STL——golang实现最近最少使用链lru

github仓库存储地址:https://github.com/hlccd/goSTL概述​ LRU-Least Recently Used,最近最少使用链结构,相对于仅考虑时间因素的FIFO和仅考虑访问频率的LFU,LRU算法可以认为是相对平衡的一种淘汰算法,LRU认为,如果数据最近被访问过,那么将来被访问的概率也会更高,LRU 算法的实现非常简单,维护一个队列,如果某条记录被访问了,则移动到队尾,那么队首则是最近最少访问的数据,淘汰该条记录即可。​ 它适用于作为一个cache缓存,去保存带有索

2021-12-26 17:32:00 221

原创 数据结构STL——golang实现字典查找树trie

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 单词查找树(Tire),又叫前缀树,字典树,是一种有序多叉树。不同于之前实现的二叉搜,它是一个具有多个分叉的树的结构,同时,树结点和其子结点之间并无大小关系,只存在前缀关系,即其父结点是其子结点的前缀,一般用于存储string类型,对于string类型的增删查效率极高,其增删查时间等价于string的长度。原理​ 本次实现的单词查找树的每个结点共有64个分叉,即‘a’‘z’,‘A’‘Z’,‘0’~‘9’

2021-12-26 17:31:39 587

原创 数据结构STL——golang实现哈希映射hashMap

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 哈希映射(hash map),它是一个两层结构,即第一层以动态数组作为桶去存储元素,第二层存储hash值冲突的元素。​ 对于插入其中的任意一个元素来说,都可以计算其key的hash值然后将其映射到桶内对应位置,随后再插入即可。​ hash映射最大的特点在于其查找、插入和删除都是O(1)的,但可能存在扩容和缩容的问题,此时其时间开销会增加。原理​ 对于哈希映射来说,它需要做的主要是对key进行ha

2021-12-25 17:58:41 860

原创 数据结构STL——golang实现平衡二叉查找树avlTree

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 自平衡二叉查找树(Self-Balancing Binary Search Tree),简称为平衡二叉树,一般以其发明者的名称缩写命名为avl树。​ 对于一颗平衡二叉树来说,一方面它需要满足二叉搜索树的性质,即父结点大于左结点小于右结点,另一方面,该树中每个结点的左右子结点的高度差不能超过1,即其平衡因子最大为1,当插入或删除结点后导致平衡因子超过1时,则需要通过旋转的方式对其进行调节。原理​ 对于

2021-12-25 17:58:09 464

原创 数据结构STL——golang实现树堆Treap

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 树堆(Treap)是一个比较特殊的结构,它同之前实现的二叉搜索树和完全二叉搜有着类似的性质,它即满足二叉搜索树的查找性质,又满足完全二叉树的极值处于堆顶的性质。​ 树堆由一个根节点和根节点下属的多层次的子结点构成,任意一个结点最多只能拥有两个子结点,即左右子结点。它的这一特性同二叉搜索树完全一致,但除此之外,它还有另一个特质:给每一个结点赋予一个随机的优先级,使得其在插入的时候,通过左右旋转的方式,保证其

2021-12-25 17:57:32 328

原创 数据结构STL——golang实现堆heap(完全二叉树)

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 本次采用完全二叉树Complete Binary Tree的形式实现堆。​ 堆(heap)是一类特殊的数据结构的统称,堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。​ 堆的主要特点为:它的父结点必然是小于或等于左右子结点(该文章叙述中使用小顶堆,大顶堆大小情况相反)。​ 在本次实践过程中使用完全二叉树实现。

2021-12-25 17:57:01 379

原创 数据结构STL——golang实现二叉搜索树Binary Search Tree

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 二叉搜索树(Binary Search Tree)不同于之前使用的线性结构,它是一种通过离散的多个点以指针的形式连接起来的树形结构。​ 二叉树由一个根节点和根节点下属的多层次的子结点构成,任意一个结点最多只能拥有两个子结点,即左右子结点。基于此种特性,在实现二叉搜索树时,可以仅持有根节点,然后通过根节点去递归访问其子结点以实现寻找到所有结点的。​ 对于二叉搜索树,由于其中缀表达式是有序的,即从小到大(

2021-12-25 17:56:27 289

原创 数据结构STL——golang实现优先队列priority_queue

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 优先队列(priority_queue)它虽然名字上是被称之为队列,单它底层其实是以堆的方式实现的,而堆这个数据结构,它是通过建立一棵完全二叉树来进行实现的。它在逻辑上并非是一个线性结构,但由于二叉树可以用数组表示的特性,本次实现采用数组的形式实现,后续会再使用完全二叉搜实现一次。​ 堆或者说优先队列的主要特点为:它的父结点必然是小于或等于左右子结点(该文章叙述中使用小顶堆,大顶堆大小情况相反),同时,考

2021-12-25 17:55:53 907

原创 数据结构STL——golang实现栈stack

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 栈(stack)是一个线性容器,但不同于其他容器的特点在于,栈是仅仅支持从顶部插入和从顶部删除的操作,即单向删除和添加。​ 对于stack的实现,考虑到它是一个线性容器,并且其中的元素仅可通过顶部添加和删除即单项增删,所以可以考虑其底层使用动态数组的形式实现,考虑到动态数组需要自行对分配空间进行操作,同时它也类似于vector进行单项操作的情况,所以它的扩容缩容策略同vector一样,但不同点在于它只能使

2021-12-25 17:54:23 537

原创 数据结构STL——golang实现环ring

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 环(ring),是一种离散的环状线性结构,即首尾连接的线性结构,它是又多个分布在不同物理空间的结点,通过指针链接建立逻辑连接而形成的线性结构。​ 但不同的地方在于环本身没有首尾结点之分,甚至说,它没有首尾结点,它可以看作是将链表的首尾结点连接起来,即任何一个结点都可以看作是首节点也可以看作是尾结点,可以通过对环中任意一个结点向前或向后遍历得到全部结点。​ 同链表一样,它的所有结点之间都是相互分离的,基

2021-12-25 17:53:42 265

原创 数据结构STL——golang实现链表list

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 链表(list),是一种离散的线性结构,它是又多个分布在不同物理空间的结点,通过指针链接建立逻辑连接而形成的线性结构。​ 由于它的一个个结点相互之间是分离开的,所以它增加和删除结点的过程就会变得十分简单,只需要找到对应节点并将其增加/删除即可,同时修改该结点前后结点的指针以保证整个链表不断开即可,对整个链表的大多数元素来说几乎没有影响,适用于频繁增删的情况,但它也会频繁的分配空间。原理​ 对于一个线

2021-12-25 17:52:58 376

原创 数据结构STL——golang实现双向队列deque

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 双向队列(deque)是一个封装了动态大小数组的顺序容器。它同其他数据结构一样都可以承载任意类型的元素,但相比于队列来说,它不同的点主要在于,队列只能首部出尾部入,而双向队列可以在首部和尾部都进行出入操作。​ 对于deque的实现来说,虽然它也是一个线性容器,但考虑到它将会在首部和尾部同时实现增删操作,如果仍然使用动态数组的形式去实现,虽然也可以做出来,但在空间扩容缩容的时候,将会进行大量的数据复制的过程

2021-12-25 17:52:29 730

原创 数据结构STL——golang实现queue

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 队列(queue)是一个封装了动态大小数组的顺序容器。除了可以包含任意类型的元素外,更主要是的它满足FIFO的先进先出模式,对于一些排队问题可以考虑使用队列来存储。​ 对于queue的实现,由于它也是一个线性容器,底层依然可以考虑使用动态数组来实现,但它和vector仍有一定的不同,vector的冗余量主要是在尾部,毕竟vector要实现随机读取的话中间和首部不能有空余量,而对于queue来说,它的添加只

2021-10-20 22:54:20 989

原创 数据结构STL——golang实现vector

github仓库存储地址:https://github.com/hlccd/goSTL概述​ 向量(Vector)是一个封装了动态大小数组的顺序容器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。​ 对于vector的实现,考虑到它是一个线性容器,其中的元素可以通过下标在O(1)的时间复杂度直接获取访问,可以考虑底层使用数组的形式实现。由于vector可以动态的添加和删除元素,所以需要对数组进行动态分配以满足需求。​ 对于golang语

2021-10-20 22:50:33 811

原创 数据结构STL——golang实现bitmap

数据结构STL——golang实现bitmap概述原理用处实现结构定义接口集合NewInsert扩容策略Delete缩容策略CheckAllClear使用示例结果github仓库存储地址:https://github.com/hlccd/goSTL概述​ Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此可以极大的节省存储空间。原理​ 对于计算机来说,它可以分配的最小单位是一个字节即8位,一位有且仅有1和0两种表

2021-10-20 22:48:00 432

原创 数据结构STL——golang实现iterator

github仓库存储地址:GitHub - hlccd/goSTLIterator概述iterator模式:提供一种方法,使之能依次访问容器内的各个元素,而又不暴露该聚合物内部的表述方式。 STL的中心思想是将算法与数据结构分离,彼此独立设计,最后在用iterator将他们结合在一起,获得最大的适配性。由于golang官方未实现泛型,而interface存在可以替换为任意结构的特性,故而可以使用interface实现泛型。一个迭代器需要包括其存储的元素序列以及内部存储一个该迭代器当前指向

2021-10-19 00:42:18 349

原创 数据结构STL——golang实现comparator

Comparator概述对于某些存在大小比较的数据结构,如果每次都要特定的实现一些大小比较是十分繁琐的,特别是对于一些官方已经设定的类型,如果将基本类型引入数据结构中时需要实现其元素的比较会简单。同时,对于一些常用的函数,比如排序、查找、排序第n个以及寻找上下边界的函数,这些函数需要通过比较器进行配合实现,为了更进一步简化使用,可以在比较器中实现。定义对于一个比较器,除开基本类型外,必须传入比较函数,当然,基本数据类型也可以传入自定的比较函数进行覆盖,对于待使用的比较函数,需要传入两个元

2021-10-18 18:14:07 484

原创 计算机网络——HTTP响应全过程及优化

一次http网络请求的历程 发起请求 客户端/浏览器创建线程发起请求 DNS解析 查看host域名解析服务器 从根、顶级、权威的各级域名服务器中查询 创建链接 三次握手 TSL/SSL 慢启动 重定向 发送数据包 延迟 丢包 接受数据包 I/O 解析 关闭链接 四次挥手

2021-10-17 17:05:43 678

空空如也

空空如也

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

TA关注的人

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