`

一个最简单的跳跃表例子

阅读更多
原文在这里, 是一个简化的跳跃表实现, 非常浅显易懂.
public class SkipListExample {
    private static Node Head = null;
    private static Node Tail = null;
    private static Node Current = null;
	
    // Records previous quarter or half mark
    private static Node quarter = null;
    private static Node half = null;
	
    public static void main(String[] args) {
        int ListCount = 100;
		
        // Setup a standard double linked list manually
        for (int i = 1; i <= ListCount; i++) {
            Node newNode = new Node();
            newNode.data = i;
			
		
            // Assign to head node if this is the first node
            if (Head == null) { 
                Head = newNode; 
                Tail = newNode; 
                Current = newNode;
				
                quarter = newNode;
                half = newNode;
            }
            else {
                Current.next = newNode;
                newNode.prev = Current;
				
                // Add a quarter pointer if this node is a multiple of 25
                if ((i % 25) == 0) { 
                    newNode.prevQuarter = quarter; 
                    quarter.nextQuarter = newNode;
					
                    quarter = newNode;
                }

                // Add a half pointer if this node is a multiple of 50
                if ((i % 50) == 0) { 
                    newNode.prevHalf = half; 
                    half.nextHalf = newNode;
					
                    half = newNode;
                }
				
                // Set current node to be the next in line, set the tail
                // and then loop back around for next node.
                Current = newNode;
                Tail = newNode;
            }	
        }
		

        // Run some tests
        System.out.println("Find number 7... ");
        FindNumber(7);
		
        System.out.println("Find Number 33... ");
        FindNumber(33);
		
        System.out.println("Find number 67... ");
        FindNumber(67);
		
        System.out.println("Find number 101... ");
        FindNumber(101);	
    }
	
	
    // Searches our skip lists to locate our number
    public static void FindNumber(int num) {
        Node currentNode = Head;
        boolean Found = false;
		
        while (currentNode != null) {
            // Simply show what nodes we have checked in our search
            System.out.println("Checked node with data: " + currentNode.data);

            // End search if value is greater than the value we are looking for.
            if (currentNode.data > num) { break; }
			
			
            // Check our various pointers to see if a jump would get us closer.
            if (currentNode.data != num) {
                if ((currentNode.nextHalf != null) && (currentNode.nextHalf.data <= num)) { currentNode = currentNode.nextHalf; }
                else if ((currentNode.nextQuarter != null) && (currentNode.nextQuarter.data <= num)) { currentNode = currentNode.nextQuarter; }
                else { currentNode = currentNode.next; }
            }
            else {
                Found = true;
                break;
            }
        }
		
        // Report our findings
        if (Found) { System.out.println("Number Found!"); }
        else { System.out.println("Number wasn't found!"); }
    }
}


// Our Node object with prev/next pointers and jump pointers
class Node {
    public int data;
    public Node next = null;
    public Node prev = null;
	
    // Specialized skip list pointers
    public Node nextHalf = null;
    public Node prevHalf = null;
	
    public Node nextQuarter = null;
    public Node prevQuarter = null;
}
分享到:
评论

相关推荐

    unity3d的小例子

    在Unity3D中,每个游戏对象都有一个或多个组件,如Transform(变换)、Mesh Renderer(网格渲染器)、Rigidbody(刚体)等。通过这些组件,我们可以控制物体的外观、物理属性和行为。 5. **脚本编写** 使用C#编写...

    数据结构,动画教程,经典例子,值得收藏

    二叉树是最简单的一种,每个节点最多有两个子节点,分为左子节点和右子节点。二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含小于该节点的元素,右子树包含大于或等于该节点的元素。平衡二叉树如AVL树和...

    数据结构与算法分析_Java_语言描述

    参考文献 第2章 算法分析 2.1 数学基础 2.2 模型 2.3 要分析的问题 2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 ...

    C# 字节数组的模式匹配算法

    Boyer-Moore算法则更进一步,根据模式的后缀信息预计算一个跳跃表,允许我们在不匹配时跳过更多字符。 在`模式匹配.cs`文件中,你可能找到了一个实现这些高级算法的例子。分析并理解这些代码可以帮助你提升对C#模式...

    第十章转座ppt-表面等离子共振技术在相互作用研究中的应.pptx

    IS是最简单的转座子形式,通常含有短的正向重复序列(direct repeats, DR)和反向重复序列(inverted repeats, IR)。这些序列在转座过程中起到关键作用。IS家族成员众多,长度在1kb左右,主要编码转座酶,参与转座...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性总结练习第3章 ...

    数据结构与算法分析C描述第三版

     2.4.1 一个简单的例子   2.4.2 一般法则   2.4.3 最大子序列和问题的解   2.4.4 运行时间中的对数   2.4.5 检验你的分析   2.4.6 分析结果的准确性   小结   练习   参考文献  第3章 表、...

    数据结构与算法分析Java语言描述(第二版)

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的求解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 小结 练习 参考文献第3章 表、栈和队列...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    2.4 运行时间计算 2.4.1 一个简单的例子 2.4.2 一般法则 2.4.3 最大子序列和问题的求解 2.4.4 运行时间中的对数 2.4.5 检验你的分析 2.4.6 分析结果的准确性 小结 练习 参考文献第3章 表、栈和队列...

    数据与算法课程:18 随机算法.pdf

    非线性方程的求解是另一个应用随机算法的例子,可以通过在特定区间内随机选取点,根据残差精度来寻找近似解。如果随机搜索的步长和方向经过适当设计,这种方法可以作为确定性算法如二分法、不动点迭代或牛顿法的补充...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 SYS_CONNECT_BY_PATH...

    数据结构与算法分析_Java语言描述(第2版)]

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    数据结构与算法分析 Java语言描述第2版

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    新北师大二年级上练习二PPT学习教案.pptx

    1. **画一画,说一说**:这部分旨在帮助学生理解跳跃距离与步数之间的关系,通过小青蛙跳跃的例子,让学生填写出不同步数对应的格数,培养学生的推理能力和简单的乘法概念。 2. **摆一摆,填一填**:通过摆放物体的...

    Pagination(分页)

    以下是一个简单的例子: ```java Pageable pageable = PageRequest.of(pageNumber, pageSize); Page&lt;YourEntity&gt; page = yourRepository.findAll(pageable); ``` 这里,`pageNumber`是当前页的索引,通常从0开始,...

    Flash情侣贺卡心动画素材.rar

    总结来说,《Flash情侣贺卡心动画素材》不仅仅是一个简单的动画,它是一个丰富的学习资源,涵盖了ActionScript编程、图形动画制作、用户交互设计等多个方面的知识。通过深入研究这份源码,开发者不仅能提升自己的...

    3节余多少钱.ppt

    2. **连续运算**:在后续的例子中,如淘气的跳绳次数和笑笑踢毽子的次数,显示了如何进行连续的加减运算,即在一个计算过程中先进行一次加法或减法,然后用结果再进行另一次运算。例如,淘气跳绳的总次数是第一次...

    c语言经典算法

    4. **跳跃表**:一种随机化的数据结构,用以实现类似于平衡树的功能,但使用链表而非树来表示数据,因此更容易实现且性能更稳定。 5. **伸展树**:一种能够自我调整的二叉查找树,通过伸展操作(将节点移动到根部)...

Global site tag (gtag.js) - Google Analytics