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
    }

本博客所有内容是原创,如果转载请注明来源

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的更多相关文章

  1. 深度解析swift中的String

    String是我们最常用到的语言元素,swift中的String初看起来相当简洁、易用,真正大量使用时,却有点摸不着头脑。直到看完了这篇文章,才算真正的明白了String的奥妙之处。每个Character所占用的内存空间不定,注定了String不能用普通的数组来存储内容,实际用的是双向链表。String.Index既然String是个双向链表,那么,访问其中的某个元素,或者substring,就要用指针了。NSRange和RangeNsstring中对于字符串区间,可以用NSRange来表示,而Strin

  2. Swift 中数组和链表的性能

    尽管如此,我觉得链表的例子非常有意思,而且值得实现和把玩,它有可能会提升数组reduce方法的性能。同时我认为Swift的一些额外特性很有趣:比如它的枚举可以灵活的在对象和具体方法中自由选择,以及“默认安全”。这本书未来的版本可能就会用Swift作为实现语言。拷贝数组消耗的时间是线性的。使用链表还有其他的代价——统计链表节点的个数所需要的时间是统计数组元素个数时间的两倍,因为遍历链表时的间接寻址方式是需要消耗时间的。

  3. swift算法手记-10

    所有操作都以对数随机化的时间进行。每个更高层都充当下面列表的"快速跑道",这里在层i中的元素按某个固定的概率p出现在层i+1中。1------4---61---3-4---6------91-2-3-4-5-6-7-8-9-10结构实例要查找一个目标元素,起步于头元素和顶层列表,并沿着每个链表搜索,直到到达小于或的等于目标的最后一个元素。通过跟踪起自目标直到到达在更高列表中出现的元素的反向查找路径,在每个链表中预期的步数显而易见是1/p。通过选择不同p值,就可以在查找代价和存储代价之间作出权衡。

  4. Java链表超详细讲解(通俗易懂,含源码)

    链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的,下面这篇文章主要给大家介绍了关于Java链表超详细讲解的相关资料,本文讲解的内容通俗易懂,含源码,需要的朋友可以参考下

  5. PHP实现合并两个排序链表的方法

    这篇文章主要介绍了PHP实现合并两个排序链表的方法,涉及php针对链表的遍历、判断、排序等相关操作技巧,需要的朋友可以参考下

  6. Java链表数据结构及其简单使用方法解析

    这篇文章主要介绍了Java链表数据结构及其简单使用方法解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  7. JavaScript实现双向链表过程解析

    这篇文章主要介绍了利用JavaScript实现双向链表以及它的封装和常用操作,文中的示例代码讲解详细,对日常的学习和工作都有一定的价值,快来和小编一起学习吧

  8. React Fiber 链表操作及原理示例详解

    这篇文章主要为大家介绍了React Fiber 链表操作原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. PHP链表操作简单示例

    这篇文章主要介绍了PHP链表操作,结合简单实例形式分析了php链表的定义与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

  10. PHP实现链表的定义与反转功能示例

    这篇文章主要介绍了PHP实现链表的定义与反转功能,结合实例形式分析了PHP链表的基本定义、添加、移除、遍历以及两种反转操作相关实现技巧,需要的朋友可以参考下

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部