码迷,mamicode.com
首页 > 编程语言 > 详细

swift算法手记-10

时间:2016-02-11 20:25:28      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

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 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。

我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:

技术分享

这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。

技术分享

swift算法手记-10

标签:

原文地址:http://blog.csdn.net/myhaspl/article/details/50651774

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!