![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 72
虹少侠
唯有知识不会辜负你
展开
-
c++实现LRU算法
LRU算法(Least Recently Used),是内存管理中为了保证命中率的一种页面置换算法,可用于内存和辅存之间也可用用在cache和内存之间,redis中的过期淘汰策略中也使用了lru算法。它是利用了程序局部性的原理,简单说就是此刻访问的页面很可能在下一时刻也会访问。这里使用c++实现简单的LRU缓存#ifndef _LRU_H#define _LRU_H#include...原创 2019-07-31 20:49:52 · 1109 阅读 · 0 评论 -
跳跃表实现
跳跃表:跳跃表与链表结构相似,只是引入“分层”的概念,从上到下的每一层都是一个链表。借个图:从图中可观察到跳跃表有以下的性质:1.每个节点有多个层,每层都有一个指向同层的下一节点的指针2.每层的链表都是一个有序链表,根据给定的key排序3.最底层也就是第一层,的链表包含所有节点4.存在于 k 层的节点,同样也存在于 <k 层的链表中引入多层的链表的概念是为...原创 2019-07-04 11:57:47 · 530 阅读 · 0 评论 -
排序算法总结对比
/*常用排序算法分析*/void swap(int& x,int& y){ if(x != y){ x = x + y; y = x - y; x = x - y; }}/*冒泡排序时间复杂度为o(n^2)两两比较,交换,每次内层循环在未排序序列中找出最大值放到已排序中对于部分有序的序列来说,效率较高稳定*/void bubble_sor...原创 2019-04-28 10:45:36 · 731 阅读 · 0 评论 -
B+树插入删除实现(c++)
B+树性质B+树B+树的实现有多种,有关键字和子树个数相等的,还有向B树一样的子树比关键字数量多一个。这里使用第二种方式。1.树的每个节点最多有M个子树2.根节点至少有两个子树(如果不是叶子节点)3.除根节点之外的所有非叶子节点,至少有M/2个子树(向上取整)4.所有非叶子节点包括keycount,child[0],key[1],child[1],key[2]..key[keyco...原创 2019-03-20 22:29:36 · 1483 阅读 · 0 评论 -
B树插入删除实现(c++)
B树的性质1、树的每个节点最多有M个子树。2、根节点至少有两个子树(除非它是叶子节点)。3、除根节点之外的所有非叶子节点至少有M/2个子树(向上取整)。4、所有非叶子节点包含keycount, childs[0],keys[1],childs[1],keys[2]........keys[keycount],childs[keycount]。也就是所有非叶子节点的子树在key值...原创 2019-03-14 13:14:59 · 1190 阅读 · 0 评论 -
哈夫曼编码
哈夫曼树哈夫曼树就是一棵带权二叉树、它的WPL是最小的、也就是从根节点到每一个节点的路径长度(经过的边数)与权值乘积的总和是最小的、就称为哈夫曼树。哈夫曼编码把各个字符在整个串中出现的频率作为它的权重、通过使用0、1表示来缩短整个串的长度、可用于无损压缩。完成哈夫曼编码首先要先建立哈夫曼树、根据树中节点的路径、计算出对应节点的编码。下面我写了一个类其中就包含了建立哈夫曼树和完成...原创 2019-01-23 21:22:25 · 1094 阅读 · 1 评论 -
开链式哈希表
简单说明hashtable适用于需要频繁插入、删除、查找的场合、在这些场合中hashtable都可以常数平均时间完成、然而之所以hashtable的效率这么高、是因为在以上这些操作时都是通过hash function直接定位元素在表中的位置然后直接操作。不可避免的有一些部分性质或全部性质相同的元素被定位到同一个位置上、这时新的问题产生了:解决冲突。实际上解决方法有很多:像线性探测、二次探测、开...原创 2018-11-04 20:06:46 · 582 阅读 · 0 评论 -
优先队列实现
简单说明优先队列可以根据key值的大小将元素进行排序、先被pop的通常是优先级最高的。优先队列的内部实现其实是利用了堆的数据结构、binary heap是一种完全二叉树、以大堆为例、每棵树的根节点的key值一定大于其子孙节点的key值、完全二叉树处了最底层的叶子节点外、其他位置都是填满的。这样我们可以利用数组来存储所有节点。若将数组从下标1开始存储元素、那么下标为 i 的节点的左孩子节...原创 2018-10-31 17:02:16 · 5727 阅读 · 1 评论 -
STL内存池讲解
简单说下:设计内存池的目的主要是为了解决在一些特殊的场合(比如:网络编程时接受数据包)频繁的创建和销毁、造成的大量的内存碎片和降低效率。在STL的内存池中可以看到、它的实现是利用了一个自由链表数组、Obj** free_lists;数组中每个元素都是一个自由链表的头指针、它指向一个由多个内存块连成的链表。另外、每个链表中所包含的内存块的大小是固定的、STL中是从8开始到128byte结束、块与...原创 2018-10-26 16:37:57 · 1051 阅读 · 3 评论 -
循环队列
在开发时常常需要使用循环队列、看到python中的Queue线程安全的队列、自己也想实现一个。没什么好说的、代码:#pragma once#include <Windows.h>template<class T>class CMyCirQueue{private: T* const head; size_t size; size_t...原创 2018-10-29 10:38:16 · 226 阅读 · 0 评论 -
红黑树插入删除操作
红黑树有以下的性质:性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点(NIL节点,空节点)是黑色的。性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。红黑树是二叉平衡树的一种、STL中的map、set、xxxmap、xxxset都是使用红黑...原创 2018-10-11 19:23:55 · 178 阅读 · 0 评论 -
c++实现LFU算法
LFU (Least Frequently Used),是一种缓存算法,它对每一个数据块都有一个访问次数的记录,也就是一个数据块的访问次数越大,在将来越可能访问。1.每个节点(数据块)都有一个访问次数,新插入的节点访问次数为12.相同访问次数的依据时间排序,后插入的在前面3.当需要淘汰数据时,会从尾部,也就是访问次数从小到大,开始淘汰这里是使用c++实现的LFU缓存:主要利用了一个mu...原创 2019-08-09 15:10:31 · 4544 阅读 · 0 评论