Example #1
0
 skiplistNode *slInsert(skiplist *sl, double score) {
     skiplistNode *update[SKIPLIST_MAXLEVEL];
     skiplistNode *node;
 
     node = sl->header;
     int i, level;
     for ( i = sl->level-1; i >= 0; i--) {
         while(node->level[i].forward && node->level[i].forward->score < score) {
             node = node->level[i].forward;
         }
         update[i] = node;
     }
     level = slRandomLevel();
     if (level > sl->level) {
         for (i = sl->level; i< level ;i++) {
             update[i] = sl->header;
         }
         sl->level = level;
     }
     node = slCreateNode(level, score);
     for (i = 0; i < level; i++) {
         node->level[i].forward = update[i]->level[i].forward;
         update[i]->level[i].forward = node;
     }
 
     node->backward = (update[0] == sl->header? NULL : update[0]);
     if (node->level[0].forward)
         node->level[0].forward->backward = node;
     else
         sl->tail = node;
     sl->length++;
     return node;
 }
skiplistNode *slInsert(skiplist *sl, void *obj)
{
	skiplistNode *update[SKIPLIST_MAXLEVEL]={NULL};
	skiplistNode *node;
	int i, level;

	node = sl->header;
	/* 从最高层次开始搜索,查找插入的位置。update数组用于记录各层次的插入点 */
	for(i=sl->level-1; i>=0; i--){
		while(node->forward[i] &&
				sl->cmp(node->forward[i]->obj, obj)){
			node = node->forward[i];
		}
		update[i]=node;
	}

	/* 完全随机决定本次插入的元素所占的层数 */
	level = slRandomLevel();
	if(level>sl->level){
		for(i=sl->level;i<level;i++){
			update[i] = sl->header;
		}
		sl->level = level;
	}
	node = slCreateNode(level, obj);
	/* 分别在每一层执行链表插入动作 */
	for(i=0; i<level; i++){
		node->forward[i] = update[i]->forward[i];
		update[i]->forward[i] = node;
	}

	sl->length++;

	return node;
}
Example #3
0
void slInsert(skiplist *sl, double score, slobj *obj) {
    skiplistNode *update[SKIPLIST_MAXLEVEL], *x;
    unsigned int rank[SKIPLIST_MAXLEVEL];
    int i, level;

    x = sl->header;
    for (i = sl->level-1; i >= 0; i--) {
        /* store rank that is crossed to reach the insert position */
        rank[i] = i == (sl->level-1) ? 0 : rank[i+1];
        while (x->level[i].forward &&
            (x->level[i].forward->score < score ||
                (x->level[i].forward->score == score &&
                compareslObj(x->level[i].forward->obj,obj) < 0))) {
            rank[i] += x->level[i].span;
            x = x->level[i].forward;
        }
        update[i] = x;
    }
    /* we assume the key is not already inside, since we allow duplicated
     * scores, and the re-insertion of score and redis object should never
     * happen since the caller of slInsert() should test in the hash table
     * if the element is already inside or not. */
    level = slRandomLevel();
    if (level > sl->level) {
        for (i = sl->level; i < level; i++) {
            rank[i] = 0;
            update[i] = sl->header;
            update[i]->level[i].span = sl->length;
        }
        sl->level = level;
    }
    x = slCreateNode(level,score,obj);
    for (i = 0; i < level; i++) {
        x->level[i].forward = update[i]->level[i].forward;
        update[i]->level[i].forward = x;

        /* update span covered by update[i] as x is inserted here */
        x->level[i].span = update[i]->level[i].span - (rank[0] - rank[i]);
        update[i]->level[i].span = (rank[0] - rank[i]) + 1;
    }

    /* increment span for untouched levels */
    for (i = level; i < sl->level; i++) {
        update[i]->level[i].span++;
    }

    x->backward = (update[0] == sl->header) ? NULL : update[0];
    if (x->level[0].forward)
        x->level[0].forward->backward = x;
    else
        sl->tail = x;
    sl->length++;
}
Example #4
0
File: sstable.c Project: pipul/lab
entry_t *entryCreate(void)
{
    return(entryCreateByLevel(slRandomLevel()));
}
Example #5
0
File: sstable.c Project: pipul/lab
meta_t *metaCreate(void)
{
    return(metaCreateByLevel(slRandomLevel()));
}