C#实现跳跃表查找(Skip List Search)算法

C#实现跳跃表查找(Skip List Search)算法

下面是一个使用 C# 实现跳跃表查找(Skip List Search)算法的示例代码:

using System;

public class Node
{
    public int Value { get; set; }
    public Node[] Forward { get; set; }

    public Node(int value, int level)
    {
        Value = value;
        Forward = new Node[level + 1];
    }
}

public class SkipList
{
    private const int MaxLevel = 16;
    private readonly Node head = new Node(-1, MaxLevel);
    private int level;
    private readonly Random random = new Random();

    // Generate a random level for the new node
    private int RandomLevel()
    {
        int lvl = 0;
        while (random.Next() % 2 == 0 && lvl < MaxLevel)
        {
            lvl++;
        }
        return lvl;
    }

    // Insert a value into the skip list
    public void Insert(int value)
    {
        Node[] update = new Node[MaxLevel + 1];
        Node current = head;

        for (int i = level; i >= 0; i--)
        {
            while (current.Forward[i] != null && current.Forward[i].Value < value)
            {
                current = current.Forward[i];
            }
            update[i] = current;
        }

        int lvl = RandomLevel();

        if (lvl > level)
        {
            for (int i = level + 1; i <= lvl; i++)
            {
                update[i] = head;
            }
            level = lvl;
        }

        Node newNode = new Node(value, lvl);
        for (int i = 0; i <= lvl; i++)
        {
            newNode.Forward[i] = update[i].Forward[i];
            update[i].Forward[i] = newNode;
        }
    }

    // Search for a value in the skip list
    public bool Search(int value)
    {
        Node current = head;
        for (int i = level; i >= 0; i--)
        {
            while (current.Forward[i] != null && current.Forward[i].Value < value)
            {
                current = current.Forward[i];
            }
        }

        current = current.Forward[0];
        return current != null && current.Value == value;
    }

    public static void Main(string[] args)
    {
        SkipList skipList = new SkipList();
        skipList.Insert(1);
        skipList.Insert(3);
        skipList.Insert(7);
        skipList.Insert(8);
        skipList.Insert(9);

        Console.WriteLine("Search for 3: " + skipList.Search(3)); // Output: True
        Console.WriteLine("Search for 6: " + skipList.Search(6)); // Output: False
    }
}

这个 C# 实现包含了以下主要部分:

  1. Node 类:表示跳跃表中的节点,包含一个值和一个指针数组。
  2. SkipList 类:包含插入和查找方法,以及一个随机数生成器用于确定新节点的层级。
  3. RandomLevel 方法:生成一个随机的层级,用于新节点。
  4. Insert 方法:在跳跃表中插入一个值,更新相应的指针。
  5. Search 方法:在跳跃表中查找一个值,返回一个布尔值表示是否找到。
  6. Main 方法:测试插入和查找功能。

这段代码展示了如何实现和使用跳跃表进行快速查找。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值