算法
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
二级指针的作用
c语言中指针的作用不言而喻,指针是c语言的一大特色。理解指针的并不是特别难,但是理解二级指针却并不是那么简单。下面就开发中常见的二级指针的场景总结一下。一, 类似二维数组的用法在hash表算法中一般会用二级指针来存储元素。说存储也不是很准确,因为指针并没有存储对象,只是存储了对象的地址。hash表为什么会用到二级指针呢?因为hash表会存在冲突的问题,每个槽中要有分支,来存储冲突的元素,以下是ha...原创 2018-06-25 20:04:34 · 2985 阅读 · 0 评论 -
redis 学习笔记--hash表的渐进式rehash
关于hash表,前面有文章介绍过,其原理并不难。redis的数据库使用字典来作为底层实现的,对数据库的增删查改操作也是构建在对字典的操作之上。redis的字典使用hash表作为底层实现。redis作为一个广泛使用的内存数据库,时间和空间效率都是至关重要的。为了使时间效率和空间效率达到最大化,redis中的hash表设计普通的hash表又有什么区别呢?我们知道当hash表满员时(或负载因...原创 2018-07-02 18:41:33 · 4860 阅读 · 4 评论 -
redis 源码学习笔记--双向列表
在redis中List列表中,主要功能有:1 向指定的列表插入(弹出)数据,方向可以向前插入(弹出),也可以朝后插入(弹出)。指令为lpush,rpush,lpop,rpop2 获取给定索引的元素,给定索引可以是区间(start, stop),指令为lindex,lrange3 获取列表的长度,指令为llen要想实现上述功能,首先想到的是链表。要做到两头插入或弹出,必须要有两个指针,分别指向链表的...原创 2018-06-28 17:17:45 · 302 阅读 · 0 评论 -
redis 源码学习笔记--跳跃表简单编码实现
要理解SkipList,得先从LinkedList说起。LinkedList 增删查改的时间复杂度都是O(N),它最大的问题就是通过一个节点只能reach到下一个节点(Double LinkedList 是一种改进方案),那么改进的思路就是通过一个节点reach到多个节点,例如下图:这种情况下便可将复杂度减小为O(N/2)。这是一种典型的空间换时间的优化思路。SkipList则 更进一步,采用了分...原创 2018-07-04 12:25:08 · 306 阅读 · 0 评论 -
boost 多索引容器multi_index_container
在游戏开发中遇到了boost的multi_index_container,中文翻译为多索引容器。那什么是多索引容器呢?为什么使用他?如何使用他?下面就一一介绍。想必大家在实际开发中一定多多少少会遇到以下的问题,我需要创建一个map,并且需要两种方式去索引,比如:创建一个<学号,姓名>的map,但是我既需要用学号去索引,又需要用姓名去索引,但std::map只能用它的key_type...原创 2018-09-26 19:27:07 · 1312 阅读 · 0 评论 -
STL内存管理
这些天在看内存的分配管理的知识,可以参考前面写的文章:linux内存分配管理实现自己的malloc STL是一套非常高效的C++库,提到内存管理,怎么能少了他呢,花了近一天的时间来剖析这个。STL内存分配分为两级,为什么分为两级,就比如你为了买一根普通的皮带,去汉正街批发市场,别人不一定卖给你(亲身经历)。只有一次性购买大量的货才会去批发市场,商家才会和你做生意。内存分配也是这...原创 2019-01-25 14:43:16 · 912 阅读 · 2 评论