IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 跳表实现 (redis|java) -> 正文阅读

[Python知识库]跳表实现 (redis|java)

1. python

class Node:
        
    value = None
    levels = []

class Skiplist:

    def __init__(self):
        self.head = Node()
        self.max_level  = 500
        self.head.levels = [None for i in range(self.max_level)]
        self.currLevel = 1


    def search(self, target: int) -> bool:
        cu = self.head
        for i in range(self.currLevel-1, -1, -1):
            while cu.levels[i] and cu.levels[i].value < target:
                cu = cu.levels[i]
            if cu.levels[i] and cu.levels[i].value == target:
                return True
        return False


    def add(self, num: int) -> None:
       
        new_level = self.get_level()
        levels = [None for i in range(new_level)]
      
        insert_node = Node()
        insert_node.value = num
        insert_node.levels = levels

        cu = self.head
        for i in range(self.currLevel-1, -1, -1):
            while cu.levels[i] is not None and cu.levels[i].value < num:
                cu = cu.levels[i]
            if i > new_level - 1:
                continue
            if cu.levels[i] is None:
                cu.levels[i] = insert_node
            else:
                tmp = cu.levels[i]
                insert_node.levels[i] = tmp
                cu.levels[i] = insert_node
        
        if new_level > self.currLevel:
            for i in range(self.currLevel, new_level):
                self.head.levels[i] = insert_node
            self.currLevel = new_level


    def erase(self, num: int) -> bool:
        flag = False 
        cu = self.head
        for i in range(self.currLevel-1, -1, -1):
            while cu.levels[i] and cu.levels[i].value < num:
                cu = cu.levels[i]
            
            if cu.levels[i] and cu.levels[i].value == num:
                flag = True
                cu.levels[i] = cu.levels[i].levels[i]
                
        return flag

    def get_level(self):
        level = 1
        while random.random() < 0.25 and level < self.max_level:
            level = level + 1
        return level

2. java

public class Skiplist {


    static class Node {
        private Integer value;
        private Node[] nexts;

        public static Node init(Integer val, int level) {
            Node node = new Node();
            node.value = val;
            node.nexts = new Node[level];
            return node;
        }
    }

    private static final int MAX_LEVEL = 32;
    private final Node head;
    private int currLevel;

    public Skiplist() {
        this.head = Node.init(null, MAX_LEVEL);
        this.currLevel = 1;
    }

    public boolean search(int target) {
        Node cursor = this.head;
        for (int i = this.currLevel - 1; i >= 0; i--) {
            cursor = findClosest(cursor, i, target);
            if (cursor.nexts[i] != null && cursor.nexts[i].value == target) {
                return true;
            }
        }
        return false;
    }

    public void add(int num) {
        Node cursor = this.head;
        int newLevel = randomLevel();
        Node insert = Node.init(num, newLevel);
        for (int i = this.currLevel - 1; i >= 0; i--) {
            cursor = findClosest(cursor, i, num);
            if (i > (newLevel-1)) {
                continue;
            }
            if (cursor.nexts[i] == null) {
                cursor.nexts[i] = insert;
            } else {
                Node tmp = cursor.nexts[i];
                cursor.nexts[i] = insert;
                insert.nexts[i] = tmp;
            }
        }

        if (newLevel > currLevel) {
            for (int i = currLevel; i < newLevel; i++) {
                head.nexts[i] = insert;
            }
            currLevel = newLevel;
        }
    }

    public boolean erase(int num) {
        Node cursor = this.head;
        boolean erased = false;
        for (int i = this.currLevel - 1; i>=0; i--) {
            cursor = findClosest(cursor, i, num);
            if (cursor.nexts[i] != null && cursor.nexts[i].value == num) {
                cursor.nexts[i] = cursor.nexts[i].nexts[i];
                erased = true;
            }
        }
        return erased;
    }

    private int randomLevel() {
        int level = 1;
        while (Math.random() < 0.25 && level < MAX_LEVEL) {
            level += 1;
        }
        return level;
    }

    private Node findClosest(Node start, int levelIdx, int target) {
        while (start.nexts[levelIdx] != null && start.nexts[levelIdx].value < target) {
            start = start.nexts[levelIdx];
        }
        return start;
    }

    public static void main(String[] args) {
        Skiplist skiplist = new Skiplist();
        skiplist.add(1);
        skiplist.add(2);
        skiplist.add(3);
        System.out.println(skiplist.search(0));
        System.out.println(skiplist.erase(0));
        System.out.println(skiplist.search(1));
        System.out.println(skiplist.erase(1));
        System.out.println(skiplist.search(1));

    }


}
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:25:25  更:2022-05-11 16:26:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 19:37:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计