日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构--跳表SkipList

發(fā)布時(shí)間:2024/7/5 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构--跳表SkipList 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 對(duì)單鏈表查找一個(gè)元素的時(shí)間復(fù)雜度是 O(n)
  • 通過(guò)對(duì)鏈表建立多級(jí)索引的結(jié)構(gòu),就是跳表,查找任意數(shù)據(jù)、插入數(shù)據(jù)、刪除數(shù)據(jù)的時(shí)間復(fù)雜度均為 O(log n)
  • 前提:建立了索引,用空間換時(shí)間的思路
  • (每?jī)蓚€(gè)節(jié)點(diǎn)建立一個(gè)索引)索引節(jié)點(diǎn)總和 n/2+n/4+n/8+…+8+4+2 = n-2,空間復(fù)雜度 O(n)
  • 插入和刪除后,動(dòng)態(tài)更新索引,避免局部鏈表元素過(guò)多或者過(guò)少,退化成單鏈表

    skiplist.h
/*** @description: 跳表* @author: michael ming* @date: 2019/4/22 22:21* @modified by: */#ifndef SKIPLIST_SKIPLIST_H #define SKIPLIST_SKIPLIST_H #include <ctime> #include <cstdlib> #include <iostream> using namespace std; typedef unsigned int UINT; template <class T> class skipNode { public:T data;skipNode<T> **next; //跳表節(jié)點(diǎn)的next是 skipNode<T>* 類(lèi)型的數(shù)組skipNode(const UINT level){next = new skipNode<T>* [level+1]; //索引級(jí)別從0(鏈表自身)開(kāi)始for(int i = 0; i < level+1; ++i)next[i] = NULL;}skipNode(const UINT level, const T& inputdata):data(inputdata){next = new skipNode<T>* [level+1]; //索引級(jí)別從0(鏈表自身)開(kāi)始for(int i = 0; i < level+1; ++i)next[i] = NULL;}~skipNode<T>(){delete [] next;} }; template <class T> class skiplist { private:UINT randomLevel(){ // static bool flag = false; // if(!flag) // { // srand(UINT(time(0))); // flag = true; // } // else // flag = false;UINT lv = 0;for(int i = 0; i < maxLevel; ++i){if(rand()%2)lv++;}return lv;} public:UINT maxLevel;skipNode<T> *head;skiplist<T>(UINT level = 10):maxLevel(level){head = new skipNode<T>(level);}~skiplist<T>(){skipNode<T> *p = head, *q;while(p){q = p;p = p->next[0];delete q;}}void insert(const T& inputdata){skipNode<T>* newNode = new skipNode<T>(maxLevel, inputdata);skipNode<T>* temPos[maxLevel+1];skipNode<T> *p = head, *q = NULL;for(int i = maxLevel; i >= 0; i--) //記錄插入點(diǎn)在每層的前一個(gè)位置{while((q = p->next[i]) && (q->data <= inputdata)){p = q;}temPos[i] = p;}UINT lv = randomLevel(); //新節(jié)點(diǎn)的隨機(jī)索引級(jí)數(shù)for(int i = 0; i <= lv; ++i) //將新節(jié)點(diǎn)依次連接進(jìn)去{newNode->next[i] = temPos[i]->next[i];temPos[i]->next[i] = newNode;}}void delete_node(const T& inputdata){skipNode<T>* temPos[maxLevel+1];skipNode<T> *p = head, *q = NULL;for(int i = maxLevel; i >= 0; i--){while((q = p->next[i]) && (q->data < inputdata)){p = q;}temPos[i] = p;}if(q && q->data == inputdata){for(int i = 0; i <= maxLevel; ++i){if(temPos[i]->next[i] == q)temPos[i]->next[i] = q->next[i];}delete q;q = NULL;}}void printSkipList(){skipNode<T> *p, *q;for(int i = maxLevel; i >= 0; --i){p = head;while(q = p->next[i]){cout << q->data << " -> ";p = q;}cout << endl;}} };#endif //SKIPLIST_SKIPLIST_H

test_skiplist.cpp

/*** @description: 測(cè)試跳表* @author: michael ming* @date: 2019/4/23 0:07* @modified by: */ #include "skiplist.h" int main() {skiplist<int> intSList;for(int i = 0; i < 10; ++i){intSList.insert(i);}intSList.printSkipList();intSList.delete_node(9);intSList.printSkipList();intSList.delete_node(100);intSList.printSkipList();return 0; }

以上寫(xiě)的比較簡(jiǎn)單,刪除多個(gè)節(jié)點(diǎn)后,索引重新合理重建沒(méi)有寫(xiě)。應(yīng)該還有很多需要改進(jìn)的地方,先放一放,往后繼續(xù)學(xué),保持學(xué)習(xí)進(jìn)度。
測(cè)試結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的数据结构--跳表SkipList的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。