importrandomclassNode:"""스킵 리스트의 노드 정의"""def__init__(self,value,level):self.value=valueself.forward=[None]*(level+1)# 레벨별 포인터 배열classSkipList:"""스킵 리스트 구현"""def__init__(self,max_level=4,p=0.5):self.max_level=max_levelself.p=p# 레벨을 결정하는 확률self.head=Node(-1,max_level)# 헤드 노드self.level=0# 현재 최대 레벨def_random_level(self):"""새로운 노드의 레벨을 랜덤하게 결정"""lvl=0whilerandom.random()<self.pandlvl<self.max_level:lvl+=1returnlvldefinsert(self,value):"""스킵 리스트에 값 삽입"""update=[None]*(self.max_level+1)current=self.headforiinrange(self.level,-1,-1):whilecurrent.forward[i]andcurrent.forward[i].value<value:current=current.forward[i]update[i]=currentlvl=self._random_level()iflvl>self.level:foriinrange(self.level+1,lvl+1):update[i]=self.headself.level=lvlnew_node=Node(value,lvl)foriinrange(lvl+1):new_node.forward[i]=update[i].forward[i]update[i].forward[i]=new_nodedefsearch(self,value):"""값 검색 (O(log N))"""current=self.headforiinrange(self.level,-1,-1):whilecurrent.forward[i]andcurrent.forward[i].value<value:current=current.forward[i]current=current.forward[0]returncurrentandcurrent.value==value# 사용 예제skiplist=SkipList()skiplist.insert(10)skiplist.insert(20)skiplist.insert(30)print("20 찾기:",skiplist.search(20))# Trueprint("15 찾기:",skiplist.search(15))# Falsedeftest_skip_list():sl=SkipList()sl.insert(5)sl.insert(15)sl.insert(25)assertsl.search(5)==Trueassertsl.search(15)==Trueassertsl.search(25)==Trueassertsl.search(10)==False# 존재하지 않는 값print("스킵 리스트 테스트 통과!")test_skip_list()