数据结构
文章平均质量分 90
hlccd
这个作者很懒,什么都没留下…
展开
-
数据结构STL——golang实现独立请求singleFlight
github仓库存储地址:https://github.com/hlccd/goSTL概述 singleFlight,独立请求,用于做并发控制,常用于防止缓存击穿。 对于缓存来说,它一般会有一个过期时间,过期后进行删除,当在删除后的短时间内,如果突然出现了一大批对该数据的并发请求,次数他们都没有从缓存中读取到数据,然后集体涌入数据库中进行IO,引起数据库过载造成故障。 为了解决这个问题,可以通过给一组相同的请求添加一个可重入锁,即对于拥有同一个关键词的请求来说,可以视为一组相同的请求,此原创 2021-12-29 00:22:48 · 476 阅读 · 0 评论 -
数据结构STL——golang实现布隆过滤器bloomFilter
github仓库存储地址:https://github.com/hlccd/goSTL概述 布隆过滤器(bloom filter),它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于寻找一个元素是否在一个集合中,但由于元素的通过hash映射转化到集合内的,所以存在误差,即可以百分百判断其不存在,但不能确定其一定存在。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。原理 如果想要判断一个元素是不是在一个集合里,除了可以将所有元素保存起来原创 2021-12-28 22:43:13 · 802 阅读 · 0 评论 -
数据结构STL——golang实现一致性哈希consistentHash
github仓库存储地址:https://github.com/hlccd/goSTL概述 一致性哈希(consistent hash),与一致性哈希相对的是不一致性哈希,但常见的所有的哈希几乎都是不一致的,即哈希桶的容量的不固定的,可以根据需求进行扩容和缩容,不一致性哈希可以提高空间的利用率,但相应的,当进行扩容和缩容操作时需要对桶内存储的所有元素重新计算哈希值,这在某些情况是十分麻烦的事情,特别是在分布式存储的环境下,此时每个哈希结点就相当于一个机器,文件分布在哪台机器由哈希算法来决定,这个系统原创 2021-12-27 11:59:21 · 673 阅读 · 0 评论 -
数据结构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 · 940 阅读 · 0 评论 -
数据结构STL——golang实现平衡二叉查找树avlTree
github仓库存储地址:https://github.com/hlccd/goSTL概述 自平衡二叉查找树(Self-Balancing Binary Search Tree),简称为平衡二叉树,一般以其发明者的名称缩写命名为avl树。 对于一颗平衡二叉树来说,一方面它需要满足二叉搜索树的性质,即父结点大于左结点小于右结点,另一方面,该树中每个结点的左右子结点的高度差不能超过1,即其平衡因子最大为1,当插入或删除结点后导致平衡因子超过1时,则需要通过旋转的方式对其进行调节。原理 对于原创 2021-12-25 17:58:09 · 525 阅读 · 0 评论 -
数据结构STL——golang实现树堆Treap
github仓库存储地址:https://github.com/hlccd/goSTL概述 树堆(Treap)是一个比较特殊的结构,它同之前实现的二叉搜索树和完全二叉搜有着类似的性质,它即满足二叉搜索树的查找性质,又满足完全二叉树的极值处于堆顶的性质。 树堆由一个根节点和根节点下属的多层次的子结点构成,任意一个结点最多只能拥有两个子结点,即左右子结点。它的这一特性同二叉搜索树完全一致,但除此之外,它还有另一个特质:给每一个结点赋予一个随机的优先级,使得其在插入的时候,通过左右旋转的方式,保证其原创 2021-12-25 17:57:32 · 362 阅读 · 0 评论 -
数据结构STL——golang实现堆heap(完全二叉树)
github仓库存储地址:https://github.com/hlccd/goSTL概述 本次采用完全二叉树Complete Binary Tree的形式实现堆。 堆(heap)是一类特殊的数据结构的统称,堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。 堆的主要特点为:它的父结点必然是小于或等于左右子结点(该文章叙述中使用小顶堆,大顶堆大小情况相反)。 在本次实践过程中使用完全二叉树实现。原创 2021-12-25 17:57:01 · 438 阅读 · 0 评论 -
数据结构STL——golang实现二叉搜索树Binary Search Tree
github仓库存储地址:https://github.com/hlccd/goSTL概述 二叉搜索树(Binary Search Tree)不同于之前使用的线性结构,它是一种通过离散的多个点以指针的形式连接起来的树形结构。 二叉树由一个根节点和根节点下属的多层次的子结点构成,任意一个结点最多只能拥有两个子结点,即左右子结点。基于此种特性,在实现二叉搜索树时,可以仅持有根节点,然后通过根节点去递归访问其子结点以实现寻找到所有结点的。 对于二叉搜索树,由于其中缀表达式是有序的,即从小到大(原创 2021-12-25 17:56:27 · 340 阅读 · 0 评论 -
数据结构STL——golang实现优先队列priority_queue
github仓库存储地址:https://github.com/hlccd/goSTL概述 优先队列(priority_queue)它虽然名字上是被称之为队列,单它底层其实是以堆的方式实现的,而堆这个数据结构,它是通过建立一棵完全二叉树来进行实现的。它在逻辑上并非是一个线性结构,但由于二叉树可以用数组表示的特性,本次实现采用数组的形式实现,后续会再使用完全二叉搜实现一次。 堆或者说优先队列的主要特点为:它的父结点必然是小于或等于左右子结点(该文章叙述中使用小顶堆,大顶堆大小情况相反),同时,考原创 2021-12-25 17:55:53 · 995 阅读 · 0 评论 -
数据结构STL——golang实现环ring
github仓库存储地址:https://github.com/hlccd/goSTL概述 环(ring),是一种离散的环状线性结构,即首尾连接的线性结构,它是又多个分布在不同物理空间的结点,通过指针链接建立逻辑连接而形成的线性结构。 但不同的地方在于环本身没有首尾结点之分,甚至说,它没有首尾结点,它可以看作是将链表的首尾结点连接起来,即任何一个结点都可以看作是首节点也可以看作是尾结点,可以通过对环中任意一个结点向前或向后遍历得到全部结点。 同链表一样,它的所有结点之间都是相互分离的,基原创 2021-12-25 17:53:42 · 408 阅读 · 0 评论 -
数据结构STL——golang实现栈stack
github仓库存储地址:https://github.com/hlccd/goSTL概述 栈(stack)是一个线性容器,但不同于其他容器的特点在于,栈是仅仅支持从顶部插入和从顶部删除的操作,即单向删除和添加。 对于stack的实现,考虑到它是一个线性容器,并且其中的元素仅可通过顶部添加和删除即单项增删,所以可以考虑其底层使用动态数组的形式实现,考虑到动态数组需要自行对分配空间进行操作,同时它也类似于vector进行单项操作的情况,所以它的扩容缩容策略同vector一样,但不同点在于它只能使原创 2021-12-25 17:54:23 · 608 阅读 · 0 评论 -
数据结构STL——golang实现链表list
github仓库存储地址:https://github.com/hlccd/goSTL概述 链表(list),是一种离散的线性结构,它是又多个分布在不同物理空间的结点,通过指针链接建立逻辑连接而形成的线性结构。 由于它的一个个结点相互之间是分离开的,所以它增加和删除结点的过程就会变得十分简单,只需要找到对应节点并将其增加/删除即可,同时修改该结点前后结点的指针以保证整个链表不断开即可,对整个链表的大多数元素来说几乎没有影响,适用于频繁增删的情况,但它也会频繁的分配空间。原理 对于一个线原创 2021-12-25 17:52:58 · 433 阅读 · 0 评论 -
数据结构STL——golang实现双向队列deque
github仓库存储地址:https://github.com/hlccd/goSTL概述 双向队列(deque)是一个封装了动态大小数组的顺序容器。它同其他数据结构一样都可以承载任意类型的元素,但相比于队列来说,它不同的点主要在于,队列只能首部出尾部入,而双向队列可以在首部和尾部都进行出入操作。 对于deque的实现来说,虽然它也是一个线性容器,但考虑到它将会在首部和尾部同时实现增删操作,如果仍然使用动态数组的形式去实现,虽然也可以做出来,但在空间扩容缩容的时候,将会进行大量的数据复制的过程原创 2021-12-25 17:52:29 · 825 阅读 · 0 评论 -
数据结构STL——golang实现queue
github仓库存储地址:https://github.com/hlccd/goSTL概述 队列(queue)是一个封装了动态大小数组的顺序容器。除了可以包含任意类型的元素外,更主要是的它满足FIFO的先进先出模式,对于一些排队问题可以考虑使用队列来存储。 对于queue的实现,由于它也是一个线性容器,底层依然可以考虑使用动态数组来实现,但它和vector仍有一定的不同,vector的冗余量主要是在尾部,毕竟vector要实现随机读取的话中间和首部不能有空余量,而对于queue来说,它的添加只原创 2021-10-20 22:54:20 · 1048 阅读 · 0 评论 -
数据结构STL——golang实现vector
github仓库存储地址:https://github.com/hlccd/goSTL概述 向量(Vector)是一个封装了动态大小数组的顺序容器。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 对于vector的实现,考虑到它是一个线性容器,其中的元素可以通过下标在O(1)的时间复杂度直接获取访问,可以考虑底层使用数组的形式实现。由于vector可以动态的添加和删除元素,所以需要对数组进行动态分配以满足需求。 对于golang语原创 2021-10-20 22:50:33 · 913 阅读 · 0 评论 -
数据结构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 · 519 阅读 · 0 评论 -
数据结构STL——golang实现iterator
github仓库存储地址:GitHub - hlccd/goSTLIterator概述iterator模式:提供一种方法,使之能依次访问容器内的各个元素,而又不暴露该聚合物内部的表述方式。 STL的中心思想是将算法与数据结构分离,彼此独立设计,最后在用iterator将他们结合在一起,获得最大的适配性。由于golang官方未实现泛型,而interface存在可以替换为任意结构的特性,故而可以使用interface实现泛型。一个迭代器需要包括其存储的元素序列以及内部存储一个该迭代器当前指向原创 2021-10-19 00:42:18 · 377 阅读 · 0 评论 -
数据结构STL——golang实现comparator
Comparator概述对于某些存在大小比较的数据结构,如果每次都要特定的实现一些大小比较是十分繁琐的,特别是对于一些官方已经设定的类型,如果将基本类型引入数据结构中时需要实现其元素的比较会简单。同时,对于一些常用的函数,比如排序、查找、排序第n个以及寻找上下边界的函数,这些函数需要通过比较器进行配合实现,为了更进一步简化使用,可以在比较器中实现。定义对于一个比较器,除开基本类型外,必须传入比较函数,当然,基本数据类型也可以传入自定的比较函数进行覆盖,对于待使用的比较函数,需要传入两个元原创 2021-10-18 18:14:07 · 535 阅读 · 0 评论