改进skiplist,实现log(n)下标索引

在插入时,通过计算每个前驱节点到当前节点的距离,保存在当前节点中,并且修改后驱节点的距离值,就可以实现log(n)的下标索引了

void SkipList<Key, Comparator>::SetCount(Node** prev, Node *node, int height)
{
    node->SetCount(0, 1);
    for (int level = 1; level < height; level++)
    {
        int count = 0;
        for (Node* begin = prev[level]->Next(level-1); begin != node->Next(level-1); begin = begin->Next(level-1))
        {
            count += begin->Count(level-1);
        }
        node->SetCount(level, count);
        auto after = node->Next(level);
        if (after != nullptr)
        {
            int afterCount = after->Count(level);
            after->SetCount(level,afterCount - count + 1);
        }
    }
 
    for (int level = height; level < GetMaxHeight(); level++) {
        auto after = prev[level]->Next(level);
        if (after) {
            after->SetCount(level, after->Count(level) +1);
        }
    }
}

    Node* operator [](int index)
    {
        int level = kMaxHeight - 1;
        int count = 0;
        Node* p = head_;
        while(level >=0) {
            // 如果有下一针,并且下一帧个数和还是比目标小,就继续后移
            auto after = p->Next(level);
            if (after) {
                auto afterCount = after->Count(level);
                if (count + afterCount < index)
                {
                    count += afterCount;
                    p = after;
                    continue;
                }
                else if (count + afterCount == index)
                {
                    return after;
                }
            }
            level--;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值