http://blog.csdn.net/myhaspl
private func findnode(val:Int)->Bool{//http://blog.csdn.net/myhaspl
//查找结点http://blog.csdn.net/myhaspl
if let mysltop = slinktop{
var mynode:skipLinkNode=mysltop
while true{
while true{
if let nextnd = mynode.nextnode {
let nodeval = nextnd.ndval
if nodeval < val{
mynode=nextnd
continue
}
if nodeval == val{
return true
}
}
break
}
if mynode.downnode == nil{
return false
}
else{
mynode = mynode.downnode!
}
}
}
else{
return false
}
}
....
....
....
private func deletenode(val:Int){
if let mysltop=slinktop{
var mynode:skipLinkNode=mysltop
while true{
while true{
if let nextnd = mynode.nextnode {
let nodeval = nextnd.ndval
if nodeval < val{
mynode=nextnd
continue
}
if nodeval == val{
//delete node from the level
mynode.nextnode=nextnd.nextnode
}
}
break
}
if mynode.downnode == nil{
//最底层http://blog.csdn.net/myhaspl
break
}
else{
mynode = mynode.downnode!
}
}
}
}
private func insertnode(val:Int){
//插入结点
let insertlv=getinsertlv()
let currtop=currlist(insertlv)
var mynode:skipLinkNode = currtop
var isfind:Bool=false
var searchnodes=[(skipLinkNode,skipLinkNode)]()
while true{
while let ntnode=mynode.nextnode{
if ntnode.ndval < val {
mynode = ntnode
}
else if ntnode.ndval == val {
isfind=true
searchnodes.append((ntnode,ntnode.nextnode!))
break
}
else{
searchnodes.append((mynode,ntnode))
break
}
}
if let dnnode=mynode.downnode {
mynode=dnnode
}
else{
break
}
}
var newnd:skipLinkNode?
var upnd:skipLinkNode?
var dnnd:skipLinkNode?
var prend:skipLinkNode
var ntnd:skipLinkNode
if !isfind {
for nodes in searchnodes{
(prend,ntnd)=nodes
upnd=newnd
newnd=createnode(prend,nextnd:ntnd,nodetype: ntype.node,val:val)
if upnd != nil{
upnd!.downnode=newnd
}
else{
dnnd = newnd!
}
}
if insertlv>slinklevel
{
addnewlevel(val,dnnode: dnnd!)
}
}
else{
let nodelist=searchnodes.last
(prend,ntnd)=nodelist!
newnd=createnode(prend,nextnd:ntnd,nodetype: ntype.node,val:val)
}
}
private func slinkstatus()->String{
var mystatus:String=""
var nownode:skipLinkNode
var i=slinklevel
while i>=0{
nownode=slist[i]
mystatus+="||top=>"
while true{
if let ntnode=nownode.nextnode {
if ntnode.ndtype != ntype.end {
mystatus+=String(ntnode.ndval)+"--"
}
else{
mystatus+="==>end||"
}
nownode=ntnode
}
else{
break
}
}
mystatus += "\n"
i-=1
}
return mystatus
}
跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,
它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,
就能轻松实现一个 SkipList。
有序表的搜索
考虑一个有序表:
从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数
为 2 + 4 + 6 = 12 次。有没有优化的算法吗?
搜索树,我们把一些节点提取出来,作为索引。得到如下结构:
这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。
我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:
这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。
原文:http://blog.csdn.net/myhaspl/article/details/50651774