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

怎么制作个人门户网站国家和城乡建设部网站首页

怎么制作个人门户网站,国家和城乡建设部网站首页,秦皇岛乾兴建设招聘,建设申请网站目录 1.什么是跳表-skiplist 2.skiplist的效率如何保证#xff1f; 3.skiplist的实现 4.skiplist跟平衡搜索树和哈希表的对比 1.什么是跳表-skiplist skiplist本质上也是一种查找结构#xff0c;用于解决算法中的查找问题#xff0c;跟平衡搜索树和哈希表的价值是一样的…目录 1.什么是跳表-skiplist 2.skiplist的效率如何保证 3.skiplist的实现 4.skiplist跟平衡搜索树和哈希表的对比 1.什么是跳表-skiplist skiplist本质上也是一种查找结构用于解决算法中的查找问题跟平衡搜索树和哈希表的价值是一样的可以作为key或者key/value的查找模型。那么相比而言它的优势是什么的呢这么等我们学习完它的细节实现我们再来对比 skiplist是由William Pugh发明的最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》 skiplist顾名思义首先它是一个list。实际上它是在有序链表的基础上发展起来的。如果是一个有序的链表查找数据的时间复杂度是O(N) William Pugh开始的优化思路 假如我们每相邻两个节点升高一层增加一个指针让指针指向下下个节点如下图b所 示。这样所有新增加的指针连成了一个新的链表但它包含的节点个数只有原来的一半。由 于新增加的指针我们不再需要与链表中每个节点逐个进行比较了需要比较的节点数大概 只有原来的一半以此类推我们可以在第二层新产生的链表上继续为每相邻的两个节点升高一层增加一 个指针从而产生第三层链表。如下图c这样搜索效率就进一步提高了skiplist正是受这种多层链表的想法的启发而设计出来的。实际上按照上面生成链表的方 式上面每一层链表的节点个数是下面一层的节点个数的一半这样查找过程就非常类似 二分查找使得查找的时间复杂度可以降低到O(log n)。但是这个结构在插入删除数据的时 候有很大的问题插入或者删除一个节点之后就会打乱上下相邻两层链表上节点个数严格 的2:1的对应关系。如果要维持这种对应关系就必须把新插入的节点后面的所有节点也 包括新插入的节点重新进行调整这会让时间复杂度重新蜕化成O(n) 4.skiplist的设计为了避免这种问题做了一个大胆的处理不再严格要求对应比例关系而是            插入一个节点的时候随机出一个层数。这样每次插入和删除都不需要考虑其他节点的层数            这样就好处理多了。细节过程入下图 2.skiplist的效率如何保证 上面我们说到skiplist插入一个节点时随机出一个层数听起来怎么这么随意如何保证搜索时的效率呢 这里首先要细节分析的是这个随机层数是怎么来的。一般跳表会设计一个最大层数maxLevel的限 制其次会设置一个多增加一层的概率p。那么计算这个随机层数的伪代码如下图 在Redis的skiplist实现中这两个参数的取值为 p 1/4 maxLevel 32根据前面randomLevel()的伪码我们很容易看出产生越高的节点层数概率越低。定量的分析如下 节点层数至少为1。而大于1的节点层数满足一个概率分布节点层数恰好等于1的概率为1-p节点层数大于等于2的概率为p而节点层数恰好等于2的概率为p(1-p)节点层数大于等于3的概率为p^2而节点层数恰好等于3的概率为p^2*(1-p)节点层数大于等于4的概率为p^3而节点层数恰好等于4的概率为p^3*(1-p)以此类推 因此一个节点的平均层数也即包含的平均指针数目计算如下 现在很容易计算出 当p1/2时每个节点所包含的平均指针数目为2当p1/4时每个节点所包含的平均指针数目为1.33 跳表的平均时间复杂度为O(logN)这个推导的过程较为复杂需要有一定的数学功底 3.skiplist的实现 我们通过一道题来实现跳表 https://leetcode.cn/problems/design-skiplist/description/ 对于跳表的查找,我们首先将查找值与当前节点的值比较,如果比当前值大就想右走,如果小就向下走,同时也应该注意如果下一个节点为空的话也要向下走 bool search(int target) {Node* cur _head;int level _head-_nextV.size() - 1;while(level 0){//下一个节点不为空且查找值比下一个节点的值大,向右走//下一个节点为空或者查找值比下一个节点的值小,向下走if(cur-_nextV[level] cur-_nextV[level]-_val target){//向右走cur cur-_nextV[level];}else if(cur-_nextV[level] nullptr || cur-_nextV[level]-_val target){//向下走--level;}else{return true;} }return false;} 跳表的层数我们通过公式来进行控制层数出现的概率 int RandomLevel(){size_t level 1;while(rand() RAND_MAX*_p level _maxLevel){level;}return level;} 跳表的插入我们首先需要判断究竟插入在哪一层,而对于删除时也需要判断删除值的层数,所以直接写成一个函数方便调用,减少代码的冗余性 vectorNode* FindPrevNode(int num){Node* cur _head;int level _head-_nextV.size() - 1;vectorNode* prevV(level 1, _head);while(level 0){if(cur-_nextV[level] cur-_nextV[level]-_val num){//向右走cur cur-_nextV[level];}else if(cur-_nextV[level] nullptr || cur-_nextV[level]-_val num){//更新level层前一个节点,向下走prevV[level]cur;--level;}}return prevV;} void add(int num) {vectorNode* prevV FindPrevNode(num);int n RandomLevel();Node* newnode new Node(num, n);//如果n大于当前层数,就升高if(n _head-_nextV.size()){_head-_nextV.resize(n, nullptr);prevV.resize(n, _head);}//链接前后节点for(size_t i 0; i n; i){newnode-_nextV[i] prevV[i]-_nextV[i];prevV[i]-_nextV[i] newnode;}} 跳表删除时只需要整体遍历即可,同时我们还可以对其进行一些小的优化,如果删除了最高层的节点的话,我们将层数下降,可以提高效率 bool erase(int num) {vectorNode* prevV FindPrevNode(num);if(prevV[0]-_nextV[0] nullptr || prevV[0]-_nextV[0]-_val ! num){return false;}else{Node* del prevV[0]-_nextV[0];for(size_t i 0; i del-_nextV.size(); i){prevV[i]-_nextV[i] del-_nextV[i];}delete del;//删除最高层节点,将头节点层数下降int i _head-_nextV.size() - 1;while(i 0){if(_head-_nextV[i] nullptr)--i;elsebreak;}_head-_nextV.resize(i 1);return true;}} 我们可以写出输出函数来查看结果,写oj题时不需要,这里只是为了进一步理解跳表的结构 void Print(){int level _head-_nextV.size();for(int i level - 1; i 0; --i){Node* cur _head;while(cur){printf(%d-, cur-_val);cur cur-_nextV[i];}printf(\n);}} struct SkiplistNode {int _val;vectorSkiplistNode* _nextV;SkiplistNode(int val,int level):_val(val), _nextV(level,nullptr){ } };class Skiplist {typedef SkiplistNode Node; public:Skiplist() {//头节点,层数为1_head new SkiplistNode(-1, 1);}bool search(int target) {Node* cur _head;int level _head-_nextV.size() - 1;while(level 0){//下一个节点不为空且查找值比下一个节点的值大,向右走//下一个节点为空或者查找值比下一个节点的值小,向下走if(cur-_nextV[level] cur-_nextV[level]-_val target){//向右走cur cur-_nextV[level];}else if(cur-_nextV[level] nullptr || cur-_nextV[level]-_val target){//向下走--level;}else{return true;} }return false;}vectorNode* FindPrevNode(int num){Node* cur _head;int level _head-_nextV.size() - 1;vectorNode* prevV(level 1, _head);while(level 0){if(cur-_nextV[level] cur-_nextV[level]-_val num){//向右走cur cur-_nextV[level];}else if(cur-_nextV[level] nullptr || cur-_nextV[level]-_val num){//更新level层前一个节点,向下走prevV[level]cur;--level;}}return prevV;}void add(int num) {vectorNode* prevV FindPrevNode(num);int n RandomLevel();Node* newnode new Node(num, n);//如果n大于当前层数,就升高if(n _head-_nextV.size()){_head-_nextV.resize(n, nullptr);prevV.resize(n, _head);}//链接前后节点for(size_t i 0; i n; i){newnode-_nextV[i] prevV[i]-_nextV[i];prevV[i]-_nextV[i] newnode;}}bool erase(int num) {vectorNode* prevV FindPrevNode(num);if(prevV[0]-_nextV[0] nullptr || prevV[0]-_nextV[0]-_val ! num){return false;}else{Node* del prevV[0]-_nextV[0];for(size_t i 0; i del-_nextV.size(); i){prevV[i]-_nextV[i] del-_nextV[i];}delete del;//删除最高层节点,将头节点层数下降int i _head-_nextV.size() - 1;while(i 0){if(_head-_nextV[i] nullptr)--i;elsebreak;}_head-_nextV.resize(i 1);return true;}}int RandomLevel(){size_t level 1;while(rand() RAND_MAX*_p level _maxLevel){level;}return level;}void Print(){int level _head-_nextV.size();for(int i level - 1; i 0; --i){Node* cur _head;while(cur){printf(%d-, cur-_val);cur cur-_nextV[i];}printf(\n);}} private:Node* _head;size_t _maxLevel32;double _p0.25; }; 4.skiplist跟平衡搜索树和哈希表的对比 skiplist相比平衡搜索树(AVL树和红黑树)对比都可以做到遍历数据有序时间复杂度也差 不多。skiplist的优势是a、skiplist实现简单容易控制。平衡树增删查改遍历都更复杂。 b、skiplist的额外空间消耗更低。平衡树节点存储每个值有三叉链平衡因子/颜色等消耗。 skiplist中p1/2时每个节点所包含的平均指针数目为2skiplist中p1/4时每个节点所包 含的平均指针数目为1.33skiplist相比哈希表而言就没有那么大的优势了。相比而言a、哈希表平均时间复杂度是 O(1)比skiplist快。b、哈希表空间消耗略多一点。skiplist优势如下a、遍历数据有序 b、skiplist空间消耗略小一点哈希表存在链接指针和表空间消耗。c、哈希表扩容有性能损 耗。d、哈希表极端场景下哈希冲突高效率下降厉害需要红黑树来补足缺点
http://www.hkea.cn/news/14321844/

相关文章:

  • 自己做网站要钱吗wordpress汉化模板
  • 思政部网站建设总结wordpress如何给主题加密
  • 做设计用的素材下载网站有哪些wordpress加水印插件
  • 采票网站刷流水做任务做珠宝商城网站
  • 男的做直播哪个网站好如何学好网站开发
  • 郑州网站推广 汉狮网络网站挖掘工具
  • 淄博网站制作定制升级青海省公路建设市场信用信息服务网站
  • 摄影化妆艺术学校网站源码公司如何进行网络推广
  • 网站开发企业培训心得总结池州网站网站建设
  • 电商网站制作河北自助建站系统平台
  • 网站如何用微信支付分类网站开发
  • 淄博网站建设兼职dedecms 调用 两个网站
  • 做进口货的电商网站深圳画册设计品牌
  • 做网站哪个简单点怎么在后台设计网站
  • 江苏常州建设局网站深圳推广公司网站建设书模板
  • 百度上如何创建自己的网站西安网站建设招聘
  • 许昌公司网站开发免费换友情链接
  • 做微商网站优秀网页欣赏
  • 有什么公司建网站免费模板网站word
  • 宁波p2p网站建设锦州网站做优化
  • 深圳勘察设计协会网站怎么做自己的设计网站
  • 浦东新区中国建设银行官网站网站优化营销公司
  • 网站建设氵金手指专业大气的网站设计
  • 旺道seo怎么优化网站资深seo顾问
  • 乡村两级先锋网站建设考研网站做刷词
  • 网站改版百度提交crm客户管理系统设计
  • 51单片机可以做网站怎样做好网站用户体验
  • 成都市网站公司做网站 一年需要多少钱
  • 扬州专业做网站企业网络销售怎么做网站
  • 医院网站建设的指导思想怎么自己开网站