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

跳跃表(Skip List)是一种随机化的数据结构,具有类似于平衡树的效率,用于高效地执行搜索、插入和删除操作。跳跃表通过在每个节点上附加多个指向其他节点的指针,创建多个层级的链表,从而实现快速查找。

下面是一个用 Java 实现的跳跃表查找算法的示例代码:
import java.util.Random;

class Node {
    int value;
    Node[] forward;

    public Node(int value, int level) {
        this.value = value;
        forward = new Node[level + 1];
    }
}

class SkipList {
    private static final int MAX_LEVEL = 16;
    private final Node head = new Node(-1, MAX_LEVEL);
    private int level = 0;
    private final Random random = new Random();

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

    // Insert a value into the skip list
    public void insert(int value) {
        Node[] update = new Node[MAX_LEVEL + 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 boolean 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);

        System.out.println("Search for 3: " + skipList.search(3)); // Output: true
        System.out.println("Search for 6: " + skipList.search(6)); // Output: false
    }
}

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

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

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

4o

跳跃表(Skip List)是一种随机化的数据结构,具有类似于平衡树的效率,用于高效地执行搜索、插入和删除操作。跳跃表通过在每个节点上附加多个指向其他节点的指针,创建多个层级的链表,从而实现快速查找。

下面是一个用 Java 实现的跳跃表查找算法的示例代码:
import java.util.Random;

class Node {
    int value;
    Node[] forward;

    public Node(int value, int level) {
        this.value = value;
        forward = new Node[level + 1];
    }
}

class SkipList {
    private static final int MAX_LEVEL = 16;
    private final Node head = new Node(-1, MAX_LEVEL);
    private int level = 0;
    private final Random random = new Random();

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

    // Insert a value into the skip list
    public void insert(int value) {
        Node[] update = new Node[MAX_LEVEL + 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 boolean 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);

        System.out.println("Search for 3: " + skipList.search(3)); // Output: true
        System.out.println("Search for 6: " + skipList.search(6)); // Output: false
    }
}

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

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

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

4o

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在