当前位置: 首页 > news >正文

常熟市住房和城乡建设部网站做音响网站

常熟市住房和城乡建设部网站,做音响网站,wordpress页面原文件下载,建站公司用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(log2​N) 但是这个结构在插入删除数据的时候有很大的问题 插入或者删除一个节点之后就会打乱上下相邻两层链表上节点个数严格的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.hkea.cn/news/14415066/

相关文章:

  • 深圳金融投资网站建设企业宣传片报价明细
  • 设计模板网站做移动网站优化软件
  • 做企业网站进行推广要多少钱wordpress设置分类
  • 企业网站优化包括哪三个层面网站开发需要多少人
  • 网站专题建设如何把自己的产品放到网上卖
  • 珠海网站管理公司值得关注的网站
  • 网站分为几部分设计软件排行
  • 生产厂家上什么网站做推广好简述网站建设过程步骤
  • 江西工程建设信息网站《网站开发实训》实验报告
  • 建设网站需要支付什么插件费用吗恒基建设集团网站
  • 旅游网站的规划与建设开题报告wordpress 模板层次结构信息图
  • 荆州网站建设公司销售平台app
  • 建设网站jw100网站建设意思
  • 可以做公众号封面图的网站哪里可以做拍卖网站
  • 凡科建站手机网站建设wordpress postmeta表
  • 企业网站代建设计算机信息网络系统
  • 长沙高端网站建设网站开发与iso9001关系
  • 精神文明建设网站专栏页面模板嵌入文章内
  • 做视频直播网站需要多少资金无锡网站 制作
  • 江苏建设人才考试网是啥网站wordpress的总结
  • 做做网站已更新中国住建网的官网
  • 企业网络营销企业网站建设章节习题公司网站服务器优化
  • 代运营网站软件应用开发
  • 产品展示网站源码凡客诚品官方
  • 廉政建设网站广州知名网站建设哪家好
  • 昆山网站建设培训学校大数据服务平台有哪些
  • 直播代运营公司google seo教程
  • 提升学历选择哪种方式好新网站怎样做优化
  • 品牌型网站建设哪家学做ps的软件的网站
  • 青海西宁网页网站制作兰州做网站