Skip to content

Commit

Permalink
Merge pull request wangzheng0822#396 from 1996fanrui/feature/skipList…
Browse files Browse the repository at this point in the history
…-randomLevel-optimize

fix: 修改 randomLevel 的生成算法
  • Loading branch information
wangzheng0822 authored Sep 16, 2019
2 parents db2c2b3 + 8d587bb commit 63e2dd2
Showing 1 changed file with 10 additions and 10 deletions.
20 changes: 10 additions & 10 deletions java/17_skiplist/SkipList.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package skiplist;

import java.util.Random;

/**
* 跳表的一种实现方法。
Expand All @@ -10,14 +9,13 @@
*/
public class SkipList {

private static final float SKIPLIST_P = 0.5f;
private static final int MAX_LEVEL = 16;

private int levelCount = 1;

private Node head = new Node(); // 带头链表

private Random r = new Random();

public Node find(int value) {
Node p = head;
for (int i = levelCount - 1; i >= 0; --i) {
Expand Down Expand Up @@ -86,15 +84,17 @@ public void delete(int value) {

}

// 随机 level 次,如果是奇数层数 +1,防止伪随机
private int randomLevel() {
// 理论来讲,一级索引中元素个数应该占原始数据的 50%,二级索引中元素个数占 25%,三级索引12.5% ,一直到最顶层。
// 因为这里每一层的晋升概率是 50%。对于每一个新插入的节点,都需要调用 randomLevel 生成一个合理的层数。
// 该 randomLevel 方法会随机生成 1~MAX_LEVEL 之间的数,且 :
// 50%的概率返回 1
// 25%的概率返回 2
// 12.5%的概率返回 3 ...
private int randomLevel() {
int level = 1;
for (int i = 1; i < MAX_LEVEL; ++i) {
if (r.nextInt() % 2 == 1) {
level++;
}
}

while (Math.random() < SKIPLIST_P && level < MAX_LEVEL)
level += 1;
return level;
}

Expand Down

0 comments on commit 63e2dd2

Please sign in to comment.