亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++實現跳躍表(Skip List)的方法示例

2020-05-23 13:41:37
字體:
來源:轉載
供稿:網友

前言

Skip List是一種隨機化的數據結構,基于并聯的鏈表,其效率可比擬于二叉查找樹(對于大多數操作需要O(log n)平均時間)?;旧希S列表是對有序的鏈表增加上附加的前進鏈接,增加是以隨機化的方式進行的,所以在列表中的查找可以快速的跳過部分列表(因此得名)。所有操作都以對數隨機化的時間進行。Skip List可以很好解決有序鏈表查找特定值的困難。

跳表是平衡樹的一種替代的數據結構,但是和紅黑樹不相同的是,跳表對于樹的平衡的實現是基于一種隨機化的算法的,跳躍表使用概率均衡技術而不是使用強制性均衡,因此,對于插入和刪除結點比傳統上的平衡樹算法更為簡潔高效。

一個跳表具有以下特征:

      1.一個跳表應該有幾個層(level)組成;

      2.跳表的第一層包含所有的元素;

      3.每一層都是一個有序的鏈表;

      4.如果元素x出現在第i層,則所有比i小的層都包含x;

      5.第i層的元素通過一個down指針指向下一層擁有相同值的元素;

      6.Top指針指向最高層的第一個元素。

下面來研究一下跳表的核心思想: 先從鏈表開始,如果是一個簡單的鏈表,那么我們知道在鏈表中查找一個元素I的話,需要將整個鏈表遍歷一次。

c,list,skip,skiplist,排行榜

如果是說鏈表是排序的,并且節點中還存儲了指向前面第二個節點的指針的話,那么在查找一個節點時,僅僅需要遍歷N/2個節點即可。

c,list,skip,skiplist,排行榜

如上圖所示,是一個即為簡單的跳躍表。傳統意義的單鏈表是一個線性結構,向有序的鏈表中插入一個節點需要O(n)的時間,查找操作需要O(n)的時間。如果我們使用上圖的跳躍表,就可以減少查找所需時間為O(n/2),因為我們可以先通過每個節點的最上面的指針先進行查找,這樣子就能跳過一半的節點。比如我們想查找19,首先和6比較,大于6之后,在和9進行比較,然后在和12進行比較......最后比較到21的時候,發現21大于19,說明查找的點在17和21之間,從這個過程中,我們可以看出,查找的時候跳過了3、7、12等點,因此查找的復雜度為O(n/2)。

當然上面只是最簡單的就是跳躍表,真正的跳表每一個結點不單單只包含指向下一個結點的指針,可能包含很多個指向后續結點的指針,這樣就可以跳過一些不必要的結點,從而加快查找、刪除等操作。對于一個鏈表內每一個結點包含多少個指向后續元素的指針,這個過程是通過一個隨機函數生成器得到,就是通過隨機生成一個結點中指向后續結點的指針數目。

c,list,skip,skiplist,排行榜

通過上面的跳表的很容易設計這樣的數據結構:

定義每個節點類型:

typedef struct nodeStructure *node;typedef struct nodeStructure{ keyType key; // key值 valueType value; // value值 // 向前指針數組,根據該節點層數的 // 不同指向不同大小的數組 node forward[1]; };

c,list,skip,skiplist,排行榜

上面的每個結構體對應著圖中的每個節點,如果一個節點是一層的節點的話(如7,12等節點),那么對應的forward將指向一個只含一個元素的數組,以此類推。

定義跳表數據類型:

// 定義跳表數據類型typedef struct listStructure{ int level;  struct nodeStructure * header;} * list; 

先不看代碼先用圖來描述一下Skip List構造,插入和刪除的過程:

構造Skip List

       1、給定一個有序的鏈表。

       2、選擇連表中最大和最小的元素,然后從其他元素中按照一定算法(隨機)隨即選出一些元素,將這些元素組成有序鏈表。這個新的鏈表稱為一層,原鏈表稱為其下一層。

       3、為剛選出的每個元素添加一個指針域,這個指針指向下一層中值同自己相等的元素。Top指針指向該層首元素

       4、重復2、3步,直到不再能選擇出除最大最小元素以外的元素。

c,list,skip,skiplist,排行榜

插入過程

例子:插入 119, level = 2

c,list,skip,skiplist,排行榜

如果 K 大于鏈表的層數,則要添加新的層。

例子:插入 119, K = 4

c,list,skip,skiplist,排行榜

刪除 21

c,list,skip,skiplist,排行榜

看到這就很清楚了,上面已經提到所謂的Skip List是每層從它的下一層按照某種規律抽出一些元素,它的操作也很簡單,它的操作其實按層來操作鏈表,基本上是從上往下來操作。

具體的實現如下:

定義數據結構

//// skiplist_def.h// test//// Created by 杜國超 on 17/9/24.// Copyright © 2017年 杜國超. All rights reserved.//#ifndef skiplist_def_h#define skiplist_def_h#define MAX_LEVEL 8typedef int KeyType;typedef int ValueType;//定義節點信息數據結構template <typename K,typename V>struct NodeStructure { K key; V value; NodeStructure* forward[1];};//定義跳躍表數據結構template <typename K,typename V>struct SkipLisStructure{ int level; NodeStructure<K,V>* header;};typedef struct NodeStructure<KeyType,ValueType> NodeType;typedef struct SkipLisStructure<KeyType,ValueType> ListType;typedef NodeType* Node;typedef ListType* List;#define NEW_LEVEL_NODE(level) (Node)malloc(sizeof(NodeType) + (level) * sizeof(Node))#endif /* skiplist_def_h */

增刪查操作實現

//// skiplist.h// test//// Created by 杜國超 on 17/9/24.// Copyright © 2017年 杜國超. All rights reserved.//#ifndef skiplist_h#define skiplist_h#include "skiplist_def.h"class CSkipList{public: CSkipList(); ~CSkipList();public: ValueType* Search(const KeyType& key); bool Insert(KeyType& key,ValueType& value); bool Delete(const KeyType& key,ValueType& value); void FreeList();private: int RandomLevel();private: List _skipList; int _size; }; #endif /* skiplist_h */
//// skiplist.cpp// test//// Created by 杜國超 on 17/9/24.// Copyright © 2017年 杜國超. All rights reserved.//#include "skiplist_def.h"#include "skiplist.h"#include <stdlib.h>CSkipList::CSkipList(){ _skipList = (List)malloc(sizeof(ListType)); // 設置跳表的層level,初始的層為0層(數組從0開始) _skipList->level = 0; _skipList->header = NEW_LEVEL_NODE(MAX_LEVEL); // 將header的forward數組清空 for(int i = 0; i < MAX_LEVEL; ++i)  _skipList->header->forward[i] = NULL; _size = 0;}CSkipList::~CSkipList(){ FreeList();}ValueType* CSkipList::Search(const KeyType& key){ Node node = _skipList->header; Node indexNode = NULL; for(int i = _skipList->level - 1; i >= 0; --i){  while((indexNode = node->forward[i]) && (indexNode->forward[i]->key <= key))  {   if (indexNode->key == key)   {    return &(indexNode->value);   }   node = indexNode;  } } return NULL;}bool CSkipList::Insert(KeyType& key, ValueType& value){ Node update[MAX_LEVEL]; int i; Node node = _skipList->header; Node indexNode = NULL; //尋找key所要插入的位置 for(i = _skipList->level - 1; i >= 0; --i){  while((indexNode = node->forward[i]) && (indexNode->forward[i]->key < key))  {   node = indexNode;  }  update[i] = node; } node = node->forward[0]; //如果key已經存在 if(node->key == key){  node->value = value;  return false; }else{  //隨機生成新結點的層數  int level = RandomLevel();  if(level > _skipList->level){   for (int i = _skipList->level;i < level;++i)   {    update[i] = _skipList->header;   }   _skipList->level = level;  }    //申請新的結點  Node newNode = NEW_LEVEL_NODE(level);  newNode->key = key;  newNode->value = value;   //調整forward指針  for(int i = level - 1; i >= 0; --i){   node = update[i];   newNode->forward[i] = node->forward[i];   node->forward[i] = newNode;  }   //更新元素數目  ++_size;  return true; }}bool CSkipList::Delete(const KeyType& key,ValueType& value){ Node update[MAX_LEVEL]; int i; Node node = _skipList->header; Node indexNode = NULL; //尋找key所要插入的位置 for(i = _skipList->level - 1; i >= 0; --i){  while((indexNode = node->forward[i]) && (indexNode->forward[i]->key < key))  {   node = indexNode;  }  update[i] = node; } node = node->forward[0]; //結點不存在 if(node->key != key){  return false; }else{  value = node->value;  //調整指針  for(i = 0; i < _skipList->level; ++i){   if(update[i]->forward[i] != node)    break;   update[i]->forward[i] = node->forward[i];  }  //刪除結點  free(node);  for(int i = _skipList->level - 1; i >= 0; i--){   if(_skipList->header->forward[i]==NULL){    _skipList->level--;   }  }  //更新鏈表元素數目  --_size;  return true; } }int CSkipList::RandomLevel(){ int k = 1; while (rand()%2) {  k++; } k=(k<MAX_LEVEL)?k:MAX_LEVEL; return k;}void CSkipList::FreeList(){ Node p = _skipList->header; Node q; while(p != NULL){  q = p->forward[0];  free(p);  p = q; } free(p); free(_skipList); _size = 0;}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线一区| 亚洲视频在线免费观看| 国产欧美韩国高清| 午夜精品久久久久久久久久久久| 亚州成人av在线| 青青草成人在线| 精品久久久久久电影| 日韩资源在线观看| 欧美日韩国产一区在线| 热门国产精品亚洲第一区在线| 欧洲成人免费视频| 欧美性在线视频| 青青草成人在线| 国产精品69精品一区二区三区| 一本色道久久综合狠狠躁篇怎么玩| 国产欧美一区二区三区久久| 日韩av第一页| 久久久精品免费| 疯狂欧美牲乱大交777| www.亚洲男人天堂| 亚洲视频在线免费看| 欧美天堂在线观看| 国产热re99久久6国产精品| 欧美电影免费观看大全| 少妇激情综合网| 久久久这里只有精品视频| 亚洲护士老师的毛茸茸最新章节| 国外成人免费在线播放| 欧美成人激情图片网| 国产不卡精品视男人的天堂| 日韩大胆人体377p| 美女国内精品自产拍在线播放| 亚洲成人a**站| 中文字幕精品一区久久久久| 日韩精品中文字幕有码专区| 日韩欧亚中文在线| 97超碰色婷婷| 一本一本久久a久久精品牛牛影视| 久久国内精品一国内精品| 538国产精品视频一区二区| 国产精品美女www爽爽爽视频| 久久影院资源网| 韩剧1988免费观看全集| 国产中文日韩欧美| 麻豆国产精品va在线观看不卡| 日韩经典一区二区三区| 亚洲天堂av高清| 成人自拍性视频| 国产精品影片在线观看| 福利精品视频在线| 国产女精品视频网站免费| 欧美贵妇videos办公室| 欧美一级淫片aaaaaaa视频| 国产在线久久久| 伊人久久大香线蕉av一区二区| 亚洲电影中文字幕| 成人性生交xxxxx网站| 欧美激情视频给我| 亚洲电影免费观看高清| 欧美日韩国产中文字幕| 性亚洲最疯狂xxxx高清| 国产脚交av在线一区二区| 亚洲综合大片69999| 成人激情视频在线| 欧美视频专区一二在线观看| 午夜精品一区二区三区在线视| 欧美国产日韩精品| 国产精品久久久久久久7电影| 日韩免费av片在线观看| 中文字幕自拍vr一区二区三区| 91国语精品自产拍在线观看性色| 日本精品性网站在线观看| 日本一区二区在线免费播放| 欧美成人黄色小视频| 超碰97人人做人人爱少妇| 成人福利视频在线观看| 国产精品成人久久久久| 欧美在线一区二区三区四| 亚洲a成v人在线观看| 亚洲aaaaaa| 国产91免费看片| 欧美日韩免费在线| 亚洲天堂久久av| 九九九热精品免费视频观看网站| 青青青国产精品一区二区| 亚洲国产精品久久91精品| 中文字幕精品影院| 精品日本高清在线播放| 欧美又大又硬又粗bbbbb| 日韩久久午夜影院| 久久免费精品日本久久中文字幕| 色综合色综合久久综合频道88| 亚洲美女在线视频| 日韩成人在线网站| 热re91久久精品国99热蜜臀| 欧美在线一区二区视频| 91免费版网站入口| 热草久综合在线| 成人精品在线视频| 国产一区二区在线播放| 国模极品一区二区三区| 久久成人精品视频| 亚洲精品视频在线播放| 91在线看www| 狠狠色狠狠色综合日日小说| 一区二区三区动漫| 亚洲国产成人av在线| 亚洲级视频在线观看免费1级| 人人做人人澡人人爽欧美| 欧美性xxxxxxx| 欧美成人在线免费视频| 欧美精品一区二区免费| 91精品国产综合久久男男| 国产99在线|中文| 国产91色在线免费| 亚洲欧美国产日韩中文字幕| 亚洲国产精品高清久久久| 欧美在线视频在线播放完整版免费观看| 中文字幕在线亚洲| 亚洲欧洲国产精品| 国产乱人伦真实精品视频| 亚洲最新av在线网站| 中文字幕精品av| 日韩在线观看精品| 国产欧美一区二区| 亚洲网站在线播放| 青青久久av北条麻妃黑人| 欧美激情国产高清| 亚洲第一区中文99精品| 中文字幕精品视频| 亚州国产精品久久久| 亚洲色无码播放| 国产一区欧美二区三区| 国产视频福利一区| 亚洲欧洲在线播放| 久久精品国产2020观看福利| 亚洲欧美日韩精品| 91国偷自产一区二区三区的观看方式| 欧美激情在线观看视频| 在线播放国产精品| 亚洲jizzjizz日本少妇| 久久精品最新地址| 欧美激情精品久久久久久变态| 国产精品www色诱视频| 欧美日韩国产999| 日韩在线中文字幕| 欧美午夜视频一区二区| 日韩最新免费不卡| 欧美一级淫片videoshd| 成人免费在线网址| 青青青国产精品一区二区| 久久久国产精品免费| 国产精品专区第二| 久久久亚洲欧洲日产国码aⅴ| 在线观看国产精品淫| 国产精品久久久久久久一区探花| 国产精品精品国产| 国产日本欧美一区二区三区在线| 精品久久久久久中文字幕| 狠狠色狠色综合曰曰| 国产精品天天狠天天看| 91av在线视频观看| 日韩电影在线观看永久视频免费网站| 久久成年人视频|