首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java skiplist实现优化

Java skiplist实现优化
EN

Stack Overflow用户
提问于 2015-11-27 00:02:56
回答 1查看 955关注 0票数 0

我正在努力使用java中的skiplist实现。基本上一切都很好,但是put方法执行起来太慢了。这是我的代码,我已经看过了教程和一些人的代码,我似乎看不出问题出在哪里(如果你测量放置100000个随机元素,它需要很长时间才能起作用)。

代码语言:javascript
复制
public class SkipList<K,V> {

    private final SkipListItem<K,V> head;
    private int currentLevel = 0;
    private static final Random random = new Random();
    private int height = 0;

    public SkipList() {
        this.head = new SkipListItem<>(null, null);
    }

    public V put(K key, V value) {
        return this.put(key, value, null, 0);
    }

    private V put(K key, V value, SkipListItem<K,V> previous, int level) {
        if(level > this.height) {
            for(int i=0,s=level-this.height ; i<s ; ++i) {
                this.addHeadItem();
            }
        }
        SkipListItem<K,V> addedItem = new SkipListItem<>(key, value);
        SkipListItem<K,V> insertAfter = this.findLowerItem(key, level);
        addedItem.setPrevious(insertAfter);
        if(insertAfter.getNext() != null) {
            insertAfter.getNext().setPrevious(addedItem);
            addedItem.setNext(insertAfter.getNext());
        }
        insertAfter.setNext(addedItem);
        if(previous != null) {
            addedItem.setBelow(previous);
            previous.setAbove(addedItem);
        }

        return (SkipList.random.nextBoolean()) ? this.put(key, value, addedItem, level+1) : value ;
    }

    private void addHeadItem() {
        SkipListItem<K,V> item = this.head;
        while(item.getAbove() != null) {
            item = item.getAbove();
        }
        SkipListItem<K,V> newHead = new SkipListItem<>(null,null);
        item.setAbove(newHead);
        newHead.setBelow(item);
        ++this.height;
    }

    private SkipListItem<K,V> findLowerItem(K key) {
        return this.findLowerItem(key,0);
    }

    private SkipListItem<K,V> findLowerItem(K key, int level) {
        SkipListItem<K,V> currentItem = this.head;
        for(int i=0 ; i<level ; ++i) {
            currentItem = currentItem.getAbove();
        }
        while(  currentItem.getNext() != null &&
                currentItem.getNext().getKey() != null &&
                currentItem.getNext().compareTo(key) < 0) {
            currentItem = currentItem.getNext();
        }
        return currentItem;
    }
    //...some other functions...
}

你知道为什么花了这么长时间吗?

EN

回答 1

Stack Overflow用户

发布于 2015-11-27 00:14:54

乍一看,每当您插入新项时,您可能会遍历整个列表来查找位置。这导致了线性复杂性,因此在最后插入n项需要n*n操作。

具体来说,在你的例子中,最终的数字是100亿,操作已经相当复杂,所以我可以想象这将需要几分钟的时间来填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33942827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档