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

深圳住建网站大连建设工程信息网官网首页

深圳住建网站,大连建设工程信息网官网首页,青岛品牌,做外贸一般上哪些网站一、跳表数据结构 跳表是有序表的一种#xff0c;其底层是通过链表实现的。链表的特点是插入删除效率高#xff0c;但是查找节点效率很低#xff0c;最坏的时间复杂度是O(N)#xff0c;那么跳表就是解决这一痛点而生的。 为了提高查询效率#xff0c;我们可以给链表加上索…一、跳表数据结构 跳表是有序表的一种其底层是通过链表实现的。链表的特点是插入删除效率高但是查找节点效率很低最坏的时间复杂度是O(N)那么跳表就是解决这一痛点而生的。 为了提高查询效率我们可以给链表加上索引利用二分查找的思路每两个节点抽取一个索引根据数据规模提升索引的高度索引的最高层级为logN,那么跳跃表支持平均0 (1ogN)这样可以快读提高节点访问速度。由于在原始链表的基础上加索引这些索引需要额外的存储空间所以这是典型的通过空间换时间。下图简单描述跳跃表原理 如果要访问8这个歌节点元素在没有索引的情况下需要遍历链表8次才能找到目标节点但是通过跳表访问(1 - 5 - 7- 7-7 - 8) ,只需要访问6次数据规模越大优势越明显。 对于提取索引理论上每隔两个元素生成一个索引节点但是在具体情况下链表是动态的删除和增加节点的时机很难确定通过两个节点维护索引的方式开销成本很大。那么如何添加索引一个新增节点要不要加索引索引加到第几层为了解决这个问题可以通过投掷硬币的方式随机数模2连续投掷正面几次那么这个次数就是索引的层级。 二、跳表代码实现 1、跳表结构、操作函数声明 #ifndef SKIPLINKLIST_H__ #define SKIPLINKLIST_H__#include stdio.h #include stdlib.h #include stdbool.h #include time.h #include math.h #include unistd.h#define MAX_LEVEL 8//定义数据域 typedef int SkipLinkListData;typedef struct skiplinklistnode {int level;SkipLinkListData data;struct skiplinklistnode* next;struct skiplinklistnode* down;} SkipLinkListNode;/*** 创建链表节点 */ SkipLinkListNode* create_skiplinklist_node(SkipLinkListData data,int level);/*** 插入节点 */ void insert_skiplinklist_node(SkipLinkListNode* head,SkipLinkListData data);/*** 维护索引 */ void create_skiplinklist_index(SkipLinkListNode** index,SkipLinkListNode* node);/*** 随机数投硬币获取索引层高 */ int random_skiplinklistnode_level();/*** 遍历跳表 */ void show_skiplinglistnode_all(SkipLinkListNode* head);/*** 查询节点 */ SkipLinkListNode* search_skiplinklistnode(SkipLinkListNode* head,SkipLinkListData data);/*** 删除跳表元素 重组索引 s* 删除的过程其实也是查找 */ void delete_skiplinklistnode(SkipLinkListNode* head,SkipLinkListData data);#endif 2、跳表增删查操作定义 #include ./skiplinklist.hSkipLinkListNode* create_skiplinklist_node(SkipLinkListData data,int level){SkipLinkListNode* node (SkipLinkListNode*) malloc(sizeof(SkipLinkListNode));if(nodeNULL){perror(create node fail);return NULL;}node-level level;node-data data;node-next NULL;node-down NULL;return node; }void insert_skiplinklist_node(SkipLinkListNode *head, SkipLinkListData data) {SkipLinkListNode *down_ptr head-down;if (down_ptr NULL){head-down create_skiplinklist_node(data, 0);return;}int level random_skiplinklistnode_level(); if(down_ptr-levellevel){level down_ptr-level 1;}SkipLinkListNode* index_node NULL;/// 当前层级小于随机高度时候需要升级索引if(down_ptr-levellevel){/// 向上升级一层索引level down_ptr-level 1;SkipLinkListNode* down_node create_skiplinklist_node(down_ptr-data,level);index_node create_skiplinklist_node(data,level);down_node-next index_node;down_node-down down_ptr;head-down down_node;} /// 搜索节点while (down_ptr! NULL down_ptr-datadata down_ptr-level0){SkipLinkListNode* next_ptr down_ptr-next;// 查找当前层级索引定位到离当前数值的最大索引值while (next_ptr ! NULL next_ptr-datadata next_ptr-next!NULL){next_ptr next_ptr-next;}/// 维护索引if(down_ptr-levellevel){SkipLinkListNode* new_node create_skiplinklist_node(data, down_ptr-level);if(next_ptrNULL){/// 如果当前层索引到达最后一个值则跳到下一层索引down_ptr-nextnew_node;}else{new_node-next next_ptr-next;next_ptr-next new_node; }create_skiplinklist_index(index_node,new_node);}///跳转下一层索引down_ptr next_ptr ! NULL?next_ptr-down:down_ptr-down; }/// 遍历链表 数据插入链表while (down_ptr ! NULLdown_ptr-next!NULLdown_ptr-next-datadata){down_ptr down_ptr-next;}SkipLinkListNode* node create_skiplinklist_node(data, 0);SkipLinkListNode* next_node down_ptr-next;down_ptr-next node;node-next next_node;if(index_node!NULL){create_skiplinklist_index(index_node,node);} }void create_skiplinklist_index(SkipLinkListNode** index_node,SkipLinkListNode* new_node) {if ((*index_node) NULL){(*index_node) new_node;}else{SkipLinkListNode* tmp_node (*index_node);while (tmp_node ! NULL){if (tmp_node-down NULL){tmp_node-down new_node;break;}tmp_node tmp_node-down;}} }int random_skiplinklistnode_level() {int level 0;int mod 2;while (rand() % mod 0 ){level;}return levelMAX_LEVEL?MAX_LEVEL:level; }void show_skiplinglistnode_all(SkipLinkListNode* head) {SkipLinkListNode* down_ptr head-down;while (down_ptr!NULL){if(down_ptr-level0){printf(原 始链表: %d ,down_ptr-data);}else{printf(第%d层索引: %d ,down_ptr-level,down_ptr-data);}SkipLinkListNode* next_ptr down_ptr-next;while (next_ptr!NULL){printf(%d ,next_ptr-data);next_ptr next_ptr-next;}down_ptr down_ptr-down; printf(\n);}printf(\n); }SkipLinkListNode* search_skiplinklistnode(SkipLinkListNode* head,SkipLinkListData data) {SkipLinkListNode* down_ptr head-down;/// 索引查找while (down_ptr!NULL down_ptr-datadata down_ptr-level0){printf(遍历第%d层次节点:%d\n,down_ptr-level,down_ptr-data);if(down_ptr-next!NULL down_ptr-next-datadata){down_ptr down_ptr-down;continue;}SkipLinkListNode* next_ptr down_ptr-next;while (next_ptr ! NULL next_ptr-datadata next_ptr-next!NULL next_ptr-next-datadata){next_ptr next_ptr-next;printf(遍历第%d层次节点:%d\n,next_ptr-level,next_ptr-data);}///跳转下一层索引down_ptr next_ptr ! NULL?next_ptr-down:down_ptr-down; }//到达底层链表 遍历目标值while (down_ptr!NULL){if(down_ptr-datadata){printf(遍历第%d层次节点,命中目标%d\n,down_ptr-level,down_ptr-data);return down_ptr;}down_ptr down_ptr-next;}printf(遍历结束目标节点%d不存在\n,data);printf(\n);return NULL; }void delete_skiplinklistnode(SkipLinkListNode *head, SkipLinkListData data) {printf(删除元素开始\n);SkipLinkListNode *down_ptr head-down;while (down_ptr ! NULL down_ptr-data data down_ptr-level 0){printf(遍历第%d层次节点:%d\n, down_ptr-level, down_ptr-data);if (down_ptr-next ! NULL down_ptr-next-datadata){/// 处理要删除的节点存在索引节点if(down_ptr-next-datadata){SkipLinkListNode* index_ptr down_ptr-next;down_ptr-next down_ptr-next-next;printf(删除第%d层索引%d\n,index_ptr-level,index_ptr-data);free(index_ptr);}down_ptr down_ptr-down;continue;}SkipLinkListNode *next_ptr down_ptr-next;while (next_ptr ! NULL next_ptr-data data next_ptr-next ! NULL next_ptr-next-data data){if(next_ptr-next-datadata){SkipLinkListNode* index_node next_ptr-next;next_ptr-next next_ptr-next-next;free(index_node);continue;}next_ptr next_ptr-next;printf(遍历第%d层次节点:%d\n, next_ptr-level, next_ptr-data);}/// 跳转下一层索引down_ptr next_ptr ! NULL ? next_ptr-down : down_ptr-down;}while (down_ptr!NULL){if(down_ptr-next!NULL down_ptr-next-datadata){SkipLinkListNode* traget_node down_ptr-next;down_ptr-next down_ptr-next-next;free(traget_node);}down_ptrdown_ptr-next;}printf(删除元素结束\n);} 三、跳表测试 void test_skiplinklist() {SkipLinkListNode* head create_skiplinklist_node(0,0);SkipLinkListData i;int c 30;for(i1;ic;i){insert_skiplinklist_node(head,i); }show_skiplinglistnode_all(head);search_skiplinklistnode(head,28);delete_skiplinklistnode(head,15);show_skiplinglistnode_all(head);}
http://www.w-s-a.com/news/157368/

相关文章:

  • 网站开发的项目17岁高清免费观看完整版
  • 手机网站建设多少钱一个门网站源码
  • 重庆 网站开发天津住房和城乡建设厅官方网站
  • 泰安高级网站建设推广厦门高端网站建设定制
  • jsp网站开发引用文献手机seo排名
  • 创建一家网站如何创设计网页的快捷网站
  • 1688代加工官方网站h5开发教程
  • 静态网站源码下载网站怎么显示备案号
  • 网站代码设计网站开发维护任职要求
  • 长寿做网站的电话怎么快速刷排名
  • 上海市中学生典型事例网站邯郸全网推广
  • 厦门网站建设680元好男人的最好的影院
  • 石家庄网站建设设计产品设计专业就业前景
  • 网站移动排名做最好最全的命理网站
  • 网站怎么防黑客杭州市做外贸网站的公司
  • 网站推广公司认准乐云seo易语言做网站登录
  • 配色设计网站推荐网站下拉菜单重叠
  • 内容展示型网站特点在北京注册公司需要多少钱
  • h5网站源代码创意设计理念
  • 岳阳网站开发服务推广运营平台
  • 网站开发得多长时间湖南建设人力资源网证书查询
  • 论坛网站开发网络营销是什么时候产生的
  • 帮人做网站赚钱无忧软文网
  • 做网站要不要营业执照重庆网站优化seo公司
  • 学院宣传网站建设简介做网站没灵感
  • 网站建设终稿确认书网站意义学校
  • 3小时网站建设平台专业制作教学课件
  • 曲阜网站建设百度开户现货黄金什么网站可以做直播
  • 比较好的企业建站平台小程序开发外包该注意些什么
  • 建行官网官网网站吗二次元风格wordpress模板