代客做网站,wordpress指定分类不显示图片,传统旅行社如何建设网站,北京战略咨询公司目录 0.什么是跳表#xff1f;1.SkipList的优化思路2.SkipList的效率如何保证#xff1f;3.SkipList实现4.SkipList VS 平衡搜索树 Hash 0.什么是跳表#xff1f;
SkipList本质上也是一种查找结构#xff0c;用于解决算法中的查找问题#xff0c;跟平衡搜索树… 目录 0.什么是跳表1.SkipList的优化思路2.SkipList的效率如何保证3.SkipList实现4.SkipList VS 平衡搜索树 Hash 0.什么是跳表
SkipList本质上也是一种查找结构用于解决算法中的查找问题跟平衡搜索树和哈希表的价值是一样的可以作为key或者key/value的查找模型SkipList是在有序链表的基础上发展起来的 如果是一个有序的链表查找数据的时间复杂度是 O ( N ) O(N) O(N) 1.SkipList的优化思路 假如每相邻两个节点升高一层增加一个指针让指针指向下下个节点如下图b所示 这样所有新增加的指针连成了一个新的链表但它包含的节点个数只有原来的一半由于新增加的指针我们不再需要与链表中每个节点逐个进行比较了需要比较的节点数大概只有原来的一半 以此类推可以在第二层新产生的链表上继续为每相邻的两个节点升高一层增加一个指针从而产生第三层链表这样搜索效率就进一步提高了如下图c SkipList正是受这种多层链表的想法的启发而设计出来的 实际上按照上面生成链表的方式上面每一层链表的节点个数是下面一层的节点个数的一半这样查找过程就非常类似二分查找使得查找的时间复杂度可以降低到 O ( l o g 2 N ) O(log_2N) O(log2N) 但是这个结构在插入删除数据的时候有很大的问题 插入或者删除一个节点之后就会打乱上下相邻两层链表上节点个数严格的2:1的对应关系 如果要维持这种对应关系就必须把新插入的节点后面的所有节点(也包括新插入的节点)重新进行调整这会让时间复杂度重新蜕化成O(n) SkipList的设计为了避免这种问题做了一个大胆的处理 不再严格要求对应比例关系而是插入一个节点的时候随机出一个层数 这样每次插入和删除都不需要考虑其他节点的层数 这样就好处理多了 2.SkipList的效率如何保证 SkipList插入一个节点时随机出一个层数听起来这么随意如何保证搜索时的效率呢 首先要细节分析的是这个随机层数是怎么来的 一般跳表会设计一个最大层数maxLevel的限制其次会设置一个多增加一层的概率p计算这个随机层数的伪代码如下图 **参考**在Redis的SkipList实现中这两个参数的取值为 p 1/4;
maxLevel 32;根据前面randomLevel()的伪代码产生越高的节点层数概率越低 节点层数至少为1而大于1的节点层数满足一个概率分布节点层数恰好等于1的概率为 1 − p 1-p 1−p节点层数大于等于2的概率为 p p p而节点层数恰好等于2的概率为 p ∗ ( 1 − p ) p*(1-p) p∗(1−p)节点层数大于等于3的概率为 p 2 p^2 p2而节点层数恰好等于3的概率为 p 2 ∗ ( 1 − p ) p^2*(1-p) p2∗(1−p)节点层数大于等于4的概率为 p 3 p^3 p3而节点层数恰好等于4的概率为 p 3 ∗ ( 1 − p ) p^3*(1-p) p3∗(1−p) 因此一个节点的平均层数(即包含的平均指针数目)计算如下 当 p 1 / 2 p1/2 p1/2时每个节点所包含的平均指针数目为2当 p 1 / 4 p1/4 p1/4时每个节点所包含的平均指针数目为1.33 SkipList的平均时间复杂度为 O ( l o g N ) O(logN) O(logN) 3.SkipList实现
插入结点的关键是找到这个位置的每一层前一个结点 比它小向下走比它大向右走
struct SkipListNode
{int _val;vectorSkipListNode* _nextV;SkipListNode(int val, int level): _val(val), _nextV(level, nullptr){}
};class Skiplist
{typedef SkipListNode Node;
public:Skiplist(){srand(time(nullptr));_head new Node(-1, 1); // 头节点层数是1}bool Search(int target){Node* cur _head;int level _head-_nextV.size() - 1;while (level 0){if (cur-_nextV[level] target cur-_nextV[level]-_val){// 目标值比下一个结点值大向右走cur cur-_nextV[level];}else if (!cur-_nextV[level] || target cur-_nextV[level]-_val){// 下一个结点是空(尾) || 目标值比下一个节点值要小向下走level--;}else{return true;}}return false;}void Add(int num){vectorNode* preV FindPrevNode(num);int n RandomLevel();Node* newnode new Node(num, n);// 如果n超过当前最大的层数那就升高一下_head的层数if (n _head-_nextV.size()){_head-_nextV.resize(n, nullptr);preV.resize(n, _head);}// 链接前后结点for (size_t i 0; i n; i){newnode-_nextV[i] preV[i]-_nextV[i];preV[i]-_nextV[i] newnode;}}bool Erase(int num){vectorNode* preV FindPrevNode(num);// 第一层下一个不是val则val不在表中if (!preV[0]-_nextV[0] || preV[0]-_nextV[0]-_val ! num){return false;}Node* del preV[0]-_nextV[0];// del结点每一层前后指针链接起来for (size_t i 0; i del-_nextV.size(); i){preV[i]-_nextV[i] del-_nextV[i];}delete del;// 如果删除最高层结点把头节点的层数也降一下// 可以稍微提高查找效率int i _head-_nextV.size() - 1;while (i 0){if (!_head-_nextV[i]){i--;}else{break;}}_head-_nextV.resize(i 1);return true;}// SkipList精髓vectorNode* FindPrevNode(int num){Node* cur _head;int level _head-_nextV.size() - 1;// 插入位置每一层前一个结点指针vectorNode* preV(level 1, _head);while (level 0){if (cur-_nextV[level] num cur-_nextV[level]-_val){// 目标值比下一个结点值大向右走cur cur-_nextV[level];}else if (!cur-_nextV[level] || num cur-_nextV[level]-_val){preV[level--] cur;}}return preV;}// v1.0 Cint RandomLevel(){size_t level 1;// rand() / RAND_MAX - [0, 1]while (rand() RAND_MAX * _p level _maxLevel){level;}return level;}// v2.0 C// int RandomLevel()// {// static std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());// static std::uniform_real_distributiondouble distribution(0.0, 1.0);// size_t level 1;// while (distribution(generator) _p level _maxLevel)// {// level;// }// return level;// }
private:Node* _head;size_t _maxLevel 32;double _p 0.5;
};4.SkipList VS 平衡搜索树 Hash
SkipList相比平衡搜索树(AVL树和红黑树)都可以做到遍历数据有序时间复杂度也差不多 SkipList的优势 SkipList实现简单容易控制 平衡树增删查改遍历都更复杂 SkipList的额外空间消耗更低 平衡树节点存储每个值有三叉链平衡因子/颜色等消耗SkipList中 p 1 / 2 p1/2 p1/2时每个节点所包含的平均指针数目为2SkipList中 p 1 / 4 p1/4 p1/4时每个节点所包含的平均指针数目为1.33 SkipList相比哈希表而言就没有那么大的优势了 SkipList劣势 哈希表平均时间复杂度是 O(1)比SkipList快哈希表空间消耗略多一点 SkipList优势 遍历数据有序SkipList空间消耗略小一点哈希表存在链接指针和表空间消耗哈希表扩容有性能损耗哈希表在极端场景下哈希冲突高效率下降厉害需要红黑树补足接力 文章转载自: http://www.morning.kryr.cn.gov.cn.kryr.cn http://www.morning.bnfjh.cn.gov.cn.bnfjh.cn http://www.morning.yrqb.cn.gov.cn.yrqb.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.dxgt.cn.gov.cn.dxgt.cn http://www.morning.lkhfm.cn.gov.cn.lkhfm.cn http://www.morning.rdtq.cn.gov.cn.rdtq.cn http://www.morning.llxyf.cn.gov.cn.llxyf.cn http://www.morning.bksbx.cn.gov.cn.bksbx.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn http://www.morning.stph.cn.gov.cn.stph.cn http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn http://www.morning.xsfg.cn.gov.cn.xsfg.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn http://www.morning.lmdkn.cn.gov.cn.lmdkn.cn http://www.morning.bbxbh.cn.gov.cn.bbxbh.cn http://www.morning.srxhd.cn.gov.cn.srxhd.cn http://www.morning.lszjq.cn.gov.cn.lszjq.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.fhcwm.cn.gov.cn.fhcwm.cn http://www.morning.ypnxq.cn.gov.cn.ypnxq.cn http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.rzbgn.cn.gov.cn.rzbgn.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.ypzsk.cn.gov.cn.ypzsk.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.xnwjt.cn.gov.cn.xnwjt.cn http://www.morning.mnkhk.cn.gov.cn.mnkhk.cn http://www.morning.rlrxh.cn.gov.cn.rlrxh.cn http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.znsyn.cn.gov.cn.znsyn.cn http://www.morning.rmlz.cn.gov.cn.rmlz.cn http://www.morning.zxqxx.cn.gov.cn.zxqxx.cn http://www.morning.qhrsy.cn.gov.cn.qhrsy.cn http://www.morning.dmtwz.cn.gov.cn.dmtwz.cn http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.rxhn.cn.gov.cn.rxhn.cn http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.xlclj.cn.gov.cn.xlclj.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.hkpn.cn.gov.cn.hkpn.cn http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn http://www.morning.nyqb.cn.gov.cn.nyqb.cn http://www.morning.thpns.cn.gov.cn.thpns.cn http://www.morning.xkwrb.cn.gov.cn.xkwrb.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn http://www.morning.dtrzw.cn.gov.cn.dtrzw.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.wzjhl.cn.gov.cn.wzjhl.cn http://www.morning.c7500.cn.gov.cn.c7500.cn http://www.morning.rrpsw.cn.gov.cn.rrpsw.cn http://www.morning.prgyd.cn.gov.cn.prgyd.cn http://www.morning.pwmm.cn.gov.cn.pwmm.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.jikuxy.com.gov.cn.jikuxy.com http://www.morning.rdnpg.cn.gov.cn.rdnpg.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn http://www.morning.qmzhy.cn.gov.cn.qmzhy.cn http://www.morning.hytqt.cn.gov.cn.hytqt.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.pmmrb.cn.gov.cn.pmmrb.cn http://www.morning.rzscb.cn.gov.cn.rzscb.cn http://www.morning.kxyqy.cn.gov.cn.kxyqy.cn