swift算法手记-10

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

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

swift算法手记-5

// // ViewController.swift // learn5 // // Created by myhaspl on 16/1/23. // Copyright (c) 2016年 myhaspl. All rights reserved. // import Cocoa import Foundation class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad(

swift算法手记-7

@IBAction func compute(sender: AnyObject) { // 19*x^7-31*x^5+16*x^2+7*x-90=0 // newton迭代法求一元方程的解,最大求解范围[-100000,100000] mytitle.stringValue="19*x^7-31*x^5+16*x^2+7*x-90=0" let trycount = 120 var accuracy: Double = 1e-15 var answer: Double?=nil /

swift算法手记-8

if answer==nil{ //计算方程的解 var p0:Double=leftbound! var p1:Double=rightbound! var q0:Double = comresult(p0) var q1:Double = comresult(p1) var p:Double=0 var q:Double=0 for i in 2...trycount{ p = secantcompresult(p0, myp1:p1) if abs(p-p1) < accuracy { a

java每日小算法(10)

/*[程序10]  题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? */ package test; public class test { public static void main(String[] args) { // TODO Auto-generated method stub double high = 100.0; double jump = 0.0; double sum = 0.0; for(

ios Swift 算法

// Playground - noun: a place where people can play import Cocoa var nums = Int[]() for _ in 1...50 { nums.append(random()) } nums ////冒泡排序 /* var count = 0; for(var i = 0 ; i < nums.count-1; i++){ for(var j = 0; j < nums.count-i-1;j++){ count++; if

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

1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把第一步所得的每一个数字加入到原来的数中,比如9*2=18,为1+8: 第三步:用以0结尾且大于第二步所获得的数的和的最小整数减去第二步所获得的合即可以获得校验位,如70-67=3,3即为校验位,如果第二步所有数字的和以0结尾,比如30.40.50等,那么校验为0: 2.IMEI校验 IMEI码由GS

成为优秀Swift开发者的10条建议

在这里给大家分享一些帮助大家成为更优秀的Swift开发者的建议,让你的代码,写的更少,性能更优,轻松玩转swift开发. 1. Extension 扩展 举例:平方 // Okay Versionfunc square(x: Int) -> Int { return x * x }var squaredOFFive = square(x: 5) square(x:squaredOFFive) // 625 创建无效变量,将5平方后再平方 -- 毕竟我们不喜欢打字. // Better Versi

GIS基础算法之Kruskal算法(2015.10.15)

算法步骤: ①求一次最短边,将连接最短边的两个顶点标识为已经访问. ②再求一次最短边(将第一次求得的最短边排除),判断两个顶点是否构成回路,如果构成回路则不取该边,并将该边标示为已经访问:若不构成回路则选取该边为最小生成树的边.在选取一条边时,为了便于检测是否构成回路,用一个数组Vset[n]来保存每一个顶点所在的连通分量的编号.开始时令vset[i] = i,即图中每个顶点自成一个连通分量,连通分量的编号使用该顶点哎图中的位置. ③重复步骤2,直到选取了n-1条边.若未能选取n-1条边则说明该

算法手记(4)算法分析

“我的程序会运行多长时间?为什么我的程序耗尽了所有内存?” 在我们使用计算机解决困难问题或是处理大量数据时,不可避免地会产生这些疑问.为这些基础问题给出答案有时其实非常简单,这个过程是科学方法,这就是我们今天讨论的内容. 科学方法概述: 科学家用于观察世界的方法对于研究计算机程序一样有效: 1.观察真实世界特点 2.提出假设模型 3.根据假设模型预测未来事件 4.继续观察并核实预测的准确性 5.如此反复直至确认预测与观察一致 正如爱因斯坦所说:“再多的实验也不一定能够证明我是对的,但只需要一个实