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 }
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,
它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,
就能轻松实现一个 SkipList。
有序表的搜索
考虑一个有序表:
从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数
为 2 + 4 + 6 = 12 次。有没有优化的算法吗? 链表是有序的,但不能使用二分查找。类似二叉
搜索树,我们把一些节点提取出来,作为索引。得到如下结构:
这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。
我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:
这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。
时间: 2024-10-11 01:22:06