生活随笔
收集整理的這篇文章主要介紹了
数据结构--跳表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
#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
; skipNode(const UINT level
){next
= new skipNode
<T
>* [level
+1]; 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]; for(int i
= 0; i
< level
+1; ++i
)next
[i
] = NULL;}~skipNode
<T
>(){delete [] next
;}
};
template <class T>
class skiplist
{
private:UINT
randomLevel(){
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
--) {while((q
= p
->next
[i
]) && (q
->data
<= inputdata
)){p
= q
;}temPos
[i
] = p
;}UINT lv
= randomLevel(); for(int i
= 0; i
<= lv
; ++i
) {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
test_skiplist.cpp
#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ò),歡迎將生活随笔推薦給好友。