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/

跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作须要O(log n)平均时间),而且对并发算法友好。
基本上,跳跃列表是对有序的链表添加上附加的前进链接,添加是以随机化的方式进行的,所以在列表中的查找能够高速的跳过部分列表(因此得名)。全部操作都以对数随机化的时间进行。

跳跃列表是按层建造的。

底层是一个普通的有序链表。每一个更高层都充当以下列表的"高速跑道"。这里在层 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/p n / p)。当p 是常数时是 O(log n)。通过选择不同 p 值。就能够在查找代价和存储代价之间作出权衡。

pid=72995dcc07ad698ab8d8d&bid=72995dcc01017w1t&uid=1922653644" style="text-decoration: none; color: rgb(79, 114, 0);">

这里元素不多,体现不出优势,假设元素足够多,这样的索引结构就能体现出优势来了。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

swift算法手记-10的更多相关文章

  1. swift算法手记-7

    @IBAction func compute(sender: AnyObject) { // 19*x^7-31*x^5+16*x^2+7*x-90=0 // newton迭代法求一元方程的解,最大求 ...

  2. [技术栈]C#利用Luhn算法(模10算法)对IMEI校验

    1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...

  3. Swift 算法实战之路:栈和队列

    这期的内容有点剑走偏锋,我们来讨论一下栈和队列.Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列.笔者觉得最实用的实现方法是使用数组,本期主要内容有: 栈和 ...

  4. 使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程

    下载 Xcode 8,配置 iOS 10 和 Swift 3 (可选)通过命令行编译 除 非你想使用命令行编译,使用 Swift 3.0 的工具链并不需要对项目做任何改变.如果你想的话,打开 Xcod ...

  5. 算法手记 之 数据结构(堆)(POJ 2051)

    一篇读书笔记 书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了 ...

  6. Swift 算法实战之路:基本语法与技巧

    Swift是苹果新推出的编程语言,也是苹果首个开源语言.相比于原来的Objective-C,Swift要更轻便和灵活.笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体 ...

  7. K-Means算法的10个有趣用例

    https://www.jianshu.com/p/162c9ec713cf 摘要: 让我们走进K-Means算法的“前世今生”以及和它有关的十个有趣的应用案例. K-means算法具有悠久的历史,并 ...

  8. 奇妙的算法【10】TX--有效号码、最,小耗时、最小差值、差值输出、异或结果

    昨晚刚刚写的几道算法题,难度也还行,就是全部AC有些困难,当时第一题AC.第二题AC 60%,第四题AC 40%,第五题没有时间写完了,这个应该全部AC了:其中第三题没有写出来 1,是否存在符合规范的 ...

  9. 算法手记 之 数据结构(并查集详解)(POJ1703)

    <ACM/ICPC算法训练教程>读书笔记-这一次补上并查集的部分.将对并查集的思想进行详细阐述,并附上本人AC掉POJ1703的Code. 在一些有N个元素的集合应用问题中,通常会将每个元 ...

随机推荐

  1. docker 安装持久化mysql

    https://hub.docker.com 拉取mysql镜像docker pull mysql:5.5运行mysql镜像并持久化到本地docker run -v /var/own/mysqldat ...

  2. android studio 自定义路径安装报错"You are attempting to install the android SDK

    android studio 自定义路径安装报错"You are attempting to install the android SDK 解决方法: 出现这个提示 主要是安装 Andro ...

  3. AC日记——[SCOI2012]喵星球上的点名 bzoj 2754

    2754 思路: AC自动机暴力处理匹配: 强大的ac自动机,强大的fail树,强大的map,强大的vector,强大的指针: 代码: #include <map> #include &l ...

  4. 9、Flask实战第9天:类视图

    之前我们接触的视图都是函数,所以一般简称为视图函数.其实视图函数也可以基于类来实现,类视图的好处是支持继承,写完类视图需要通过app.add_url_rule(url_rule, view_func) ...

  5. 某dalao贼快的hash?

    #include<map> #include<cstdio> #include<iostream> #include<ext/pb_ds/assoc_cont ...

  6. 【kruscal】【最小生成树】poj2421 Constructing Roads

    SB题,求最小生成树,其中有些边已经给您建好啦. 随意暴力即可. #include<cstdio> #include<algorithm> #include<cstrin ...

  7. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

  8. (转)关于Unity3D的编辑器崩溃时的线索定位

    今天在Unity3D编辑器中进行功能测试的时候,编辑器突然崩溃了(就是整个窗口突然消失,进程直接结束)之后也没有任何错误报告信息提示.好吧,应该是偶现问题,我侥幸地想,我用的好歹也是正版啊,不应该总出 ...

  9. 个人python学习路线记录

    一.入门视频 零基础入门学习Python --小甲鱼 二.博客园 python快速教程 http://www.cnblogs.com/vamei/archive/2012/09/13/2682778. ...

  10. HttpApplication理解

    HttpApplication对象是经由HttpApplicationFactory.GetApplicationInstance(并最终调用HttpRuntime.CreateNonPublicIn ...