跳跃表
应用
应用1:Leetocde1206
题目
解题思路
参考:
代码
import random from typing import List class Skiplist(object): # 最大层数 DEFAULT_MAX_LEVEL = 32 # 随机层数概率 DEFAULT_P_FACTOR = 0.25 class Node(object): def __init__(self, value: int = None, size: int = 0): self.value = value self.size = size self.next: List["Node"] = [None for _ in range(size)] def __str__(self): return "Node<value=%s, size=%s>" % (self.value, self.size) def __init__(self): self.head = Skiplist.Node(size=self.DEFAULT_MAX_LEVEL) self.current_level = 1 def search(self, target: int) -> bool: search_node = self.head for i in range(self.current_level - 1, -1, -1): search_node = self._find_closest(search_node, i, target) if search_node.next[i] and search_node.next[i].value == target: return True return False def add(self, num: int) -> None: level = self._random_level() update_node = self.head new_node = self.Node(num, level) for i in range(self.current_level - 1, -1, -1): update_node = self._find_closest(update_node, i, num) if i < level: if not update_node.next[i]: update_node.next[i] = new_node else: temp = update_node.next[i] update_node.next[i] = new_node new_node.next[i] = temp if level > self.current_level: for i in range(self.current_level, level): self.head.next[i] = new_node self.current_level = level return def erase(self, num: int) -> bool: flag = False search_node = self.head for i in range(self.current_level - 1, -1, -1): search_node = self._find_closest(search_node, i, num) if search_node.next[i] and search_node.next[i].value == num: search_node.next[i] = search_node.next[i].next[i] flag = True continue return flag @staticmethod def _find_closest(node: Node, level_index: int, value: int): while node.next[level_index] and value > node.next[level_index].value: node = node.next[level_index] return node @classmethod def _random_level(cls): level = 1 while random.random() < cls.DEFAULT_P_FACTOR and level < cls.DEFAULT_MAX_LEVEL: level += 1 return level # Your Skiplist object will be instantiated and called as such: # obj = Skiplist() # param_1 = obj.search(target) # obj.add(num) # param_3 = obj.erase(num)
本文作者:LARRY1024
本文链接:https://www.cnblogs.com/larry1024/p/17201248.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步