
数据结构
文章平均质量分 55
necesse
这个作者很懒,什么都没留下…
展开
-
SizeBalancedTree C++实现
SBTSizeBalancedTree,SBT也是一种自平衡二叉搜索树,它的均摊时间复杂度不差于红黑树,实现起来比红黑树简单很多,它的旋转方式与AVL树一样,它的平衡条件靠的是每个节点的侄子节点不大于叔叔节点, 旋转的方式与AVL相同。 n1上的节点数量 和 n2上的节点数量 都不大于u2上的节点数量n3上的节点数量 和 n4上的节点数量 都不大于u1上的节点数量每个节点都符合以上条件就认为这棵树平衡。SBT的特点SBT在删除的时候,可以不用进行旋转调整树的高度,即使退化成链状也无所谓原创 2022-04-01 23:44:10 · 1223 阅读 · 0 评论 -
并查集详解 原理+实现
数据结构 ---- 并查集(Union Find) 并查集有两个核心操作,查找和合并,O(1) 的时间复杂度查询两个元素是否在同一个集合,和将两个不同元素所在集合合并,时间复杂度也为O(1)。目录数据结构 ---- 并查集(Union Find)一、并查集并查集的数据存储形式并查集的接口并查集的初始化Quick Find 实现Quick Find 的合并(Union)Quick Find 的查找(Find)Quick Find 完整代码小结Quick Union 的实现Quick Union 的查找原创 2022-01-09 03:29:07 · 1822 阅读 · 1 评论 -
AVL树详解 原理+实现 C++
AVL Tree AVL树是由G. M. Adelson-Velsky和E. M. Landis 在1962年发明, 是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。目录AVL TreeTipsBST改进添加导致的失衡右旋 LL左旋 RR左旋+右旋 LR右旋+左旋 RL添加代码删除导致的失衡Tips二叉搜索树(BST) 对于普通的二叉搜索树(BST),增加或删除节点都可能使其退化成链原创 2021-12-24 03:44:12 · 1203 阅读 · 3 评论 -
跳表(SkipList)实现 C++
跳表 SkipList 跳表,又叫做跳跃表,它在有序链表的基础上实现了“跳跃”。这种数据结构 由William Pugh于1990年发布,设计的初衷是为了取代平衡树(例如红黑树)。Redis中的SortedSet、LevelDB中的 MemTable都用到了跳表,对比平衡树,跳表的实现和维护会更加简单,跳表的搜索、删除、添加的平均时间复杂度都是O(logN),甚至可以替代红黑树。目录跳表 SkipList跳表的原理调表的查找跳表的插入跳表的删除C++ 实现时间 / 空间复杂度时间复杂度:空间复杂度:总结原创 2021-12-19 23:58:24 · 1803 阅读 · 0 评论 -
二叉搜索树实现 C++
二叉树搜索树(BST)二叉搜索树是一种二叉树,是应用非常广泛的一种二叉树,英文简称为BST。又称为:二叉查找树、二叉排序树目录二叉树搜索树(BST)BST的特点SBT的接口C++实现复杂度分析BST的特点二叉树搜索树特点任意一个节点的值都大于其左子树所有节点的值任意一个节点的值都小于其右子树所有节点的值SBT的接口bool add(const T& x)bool remove(const T& x)bool contains(const T& x)原创 2021-12-19 22:14:29 · 1045 阅读 · 0 评论 -
布隆过滤器详解 原理+实现 C++
布隆过滤器(bloom filter) 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是由一个很长的bit数组和一系列哈希函数组成的。布隆过滤器可以用于检索一个元素是否在一个集合中它是一种概率型数据结构,它能告知你一个元素大概率存在,或一定不存在。 ,常用与黑名单查找、垃圾邮件过滤、解决缓存穿透。目录布隆过滤器(bloom filter)一、原理布隆过滤器的误判率误判率公式二、C++ 简单实现三、应用场景四、优缺点一、原理假设布隆过滤器由20位二进制、3个哈希函原创 2021-12-16 23:09:46 · 2195 阅读 · 0 评论 -
哈希表 详解
哈希表哈希表也叫做散列表,一种非常常用的数据结构,增删改查均为O(1)。目录哈希表一、hash表原理二、 hash冲突解决方案Java 中的解决方案三、hash函数四、通过key生成hash值自定义对象整形的hash值浮点数的hash值floatdoublestring一、hash表原理hash表是如何实现高效的?//添加三个记录。put( "Jack", 666);put("Rose", 777);put( "Kate", 888);通过hash函数生成key所对应的下标 in原创 2021-12-16 16:26:22 · 1511 阅读 · 0 评论 -
模拟实现STL----queue C++
STL----queuequeue 并不属于STL中容器的一种,是一个适配器(adapter),或叫配接器。底层维护一个其他容器,并不自己实现,提供有限的接口。#include <list>#include <cassert>namespace my{ template<class T> class queue { public: //支持无参构造、拷贝构造、迭代器构造 queue() {} queue(const queue&l原创 2021-11-19 15:31:02 · 760 阅读 · 0 评论 -
模拟实现 priority_queue C++
模拟 priority_queue底层维护一个vector,通过向上调整算法,向下调整算法维护堆结构。提供基本接口。#include <vector>#include <algorithm>#include <cassert>//默认为大堆template<class T>class Heap{public: Heap() {} Heap(const Heap<T>& hp) : v(hp.v) {}原创 2021-11-14 15:44:06 · 492 阅读 · 0 评论 -
LRU 算法 C++实现
实现LRULRU(Least Recently Used),即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰,常用于缓存机制。实现LRU需要一个Map和一个双向链表。我们规定,head->next 为最久未使用节点,head->prev为最新节点,这样就可以保证其相对次序。map的value保存链原创 2021-11-14 10:50:35 · 3153 阅读 · 0 评论 -
简单模拟STL list
#include <iostream>#include <algorithm>#include <assert.h>namespace my{ template<class T> struct __list_node { public: typedef __list_node<T> Node; __list_node(const T& x = T()) : _prev(nullptr), _next原创 2021-11-11 15:31:49 · 387 阅读 · 0 评论 -
简单实现STL vector
#include <stdlib.h>#include <string.h>#include <assert.h>#include <algorithm>namespace my{ template<class T> class vector { public: typedef T* iterator; typedef const T* const_iterator; private: iterator _s原创 2021-11-10 17:51:43 · 573 阅读 · 0 评论 -
非递归快速排序 C实现
文章目录前言一、栈实现二、基本思路前言快速排序的非递归需要借助到栈,C语言没有提供,需要自己实现。一、栈实现Stack.h#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int DataType;#define INCREMENT 2typedef struct Stack{ DataType* arr; int top; int capacit原创 2021-09-22 20:08:51 · 346 阅读 · 0 评论