swift算法手记-10

swift算法手记-10,第1张

概述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 my
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,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    }        

本博客所有内容是原创,如果转载请注明来源 @L_404_3@http://blog.csdn.net/myhaspl/

跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数 *** 作需要O(logn)平均时间),并且对并发算法友好。 基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有 *** 作都以对数随机化的时间进行。 跳跃列表是按层建造的。底层是一个普通的有序链表。每个更高层都充当下面列表的"快速跑道",这里在层 i中的元素按某个固定的概率 p出现在层 i+1 中。平均起来,每个元素都在 1/(1- p) 个列表中出现,而最高层的元素(通常是在跳跃列表前端的一个特殊的头元素)在 O(log1/ pn) 个列表中出现。 1 - - - - - - 4 - - - 6 1 - - - 3 - 4 - - - 6 - - - - - - 9 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 结构实例 要查找一个目标元素,起步于头元素和顶层列表,并沿着每个链表搜索,直到到达小于或的等于目标的最后一个元素。通过跟踪起自目标直到到达在更高列表中出现的元素的反向查找路径,在每个链表中预期的步数显而易见是 1/ p。所以查找的总体代价是 O(log1/ pn / p),当 p是常数时是 O(log n)。通过选择不同 p值,就可以在查找代价和存储代价之间作出权衡。

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

总结

以上是内存溢出为你收集整理的swift算法手记-10全部内容,希望文章能够帮你解决swift算法手记-10所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1090947.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存