Skip to content

Commit 51f768c

Browse files
committed
php实现跳表
1 parent 3550204 commit 51f768c

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

php/17_skiplist/skipList.php

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
3+
class SNode
4+
{
5+
//数据域
6+
public $data;
7+
8+
//指针域,引用SNode对象
9+
public $next = [];
10+
11+
public function __construct($data = null)
12+
{
13+
$this->data = $data;
14+
}
15+
16+
//获取当前节点索引层数
17+
public function getMaxLevel()
18+
{
19+
return count($this->next) - 1;
20+
}
21+
}
22+
23+
class SkipList
24+
{
25+
//索引最大层数
26+
public $indexLevel;
27+
28+
//头节点
29+
protected $head;
30+
31+
public function __construct(int $indexLevel)
32+
{
33+
$this->indexLevel = max($indexLevel, 0);
34+
$this->head = new SNode();
35+
}
36+
37+
public function addData($data)
38+
{
39+
$newNode = new SNode($data);
40+
for ($level = $this->getRandomLevel(), $node = $this->head; $level >= 0; $level--) {
41+
while (isset($node->next[$level]) && $data < $node->next[$level]->data) {
42+
$node = $node->next[$level];
43+
}
44+
if (isset($node->next[$level])) {
45+
$newNode->next[$level] = $node->next[$level];
46+
}
47+
$node->next[$level] = $newNode;
48+
}
49+
return $newNode;
50+
}
51+
52+
public function deleteData($data)
53+
{
54+
$deleted = false;
55+
for ($level = $this->head->getMaxLevel(), $node = $this->head; $level >= 0; $level--) {
56+
while (isset($node->next[$level]) && $data < $node->next[$level]->data) {
57+
$node = $node->next[$level];
58+
}
59+
if (isset($node->next[$level]) && $data == $node->next[$level]->data) {
60+
$node->next[$level] = isset($node->next[$level]->next[$level]) ?
61+
$node->next[$level]->next[$level] : null;
62+
$deleted = true;
63+
}
64+
}
65+
return $deleted;
66+
}
67+
68+
public function findData($data)
69+
{
70+
for ($level = $this->head->getMaxLevel(), $node = $this->head; $level >= 0; $level--) {
71+
while (isset($node->next[$level]) && $data < $node->next[$level]->data) {
72+
$node = $node->next[$level];
73+
}
74+
if (isset($node->next[$level]) && $data == $node->next[$level]->data) {
75+
return $node->next[$level];
76+
}
77+
}
78+
return false;
79+
}
80+
81+
protected function getRandomLevel()
82+
{
83+
return mt_rand(0, $this->indexLevel);
84+
}
85+
}
86+
87+
/**
88+
* 示例
89+
*/
90+
91+
$indexLevel = 2;
92+
93+
$skipList = new SkipList($indexLevel);
94+
95+
for ($i = 10; $i >= 0; $i--) {
96+
$skipList->addData($i);
97+
}
98+
99+
//打印0到10组成的跳表
100+
var_dump($skipList);
101+
102+
//返回SNode对象
103+
var_dump($skipList->findData(5));
104+
105+
$skipList->deleteData(5);
106+
107+
//返回false
108+
var_dump($skipList->findData(5));

0 commit comments

Comments
 (0)