Кажется, Седжвик опять ошибся...
От: Аноним  
Дата: 05.12.05 13:37
Оценка:
Здравствуйте, коллеги!

кажется, я в Седжвике еще одну ошибку нашел (брал код из родных его исходников — то же, что в книге). Он описываетя списки пропусков в 13 главе. Там есть функция удаления:

void removeR(link t, Key v, int k)
{
    link x = t->next[k];
    if(!(x->item.Key() < v)){
        if(v == x->item.Key()){
            t->next[k] = x->next[k];
        }
        if(k == 0){
            delete x;
            return;
        }
        removeR(t, v, k - 1);
        return;
    }
    removeR(t->next[k], v, k);
}


Ошибку вызывает if(!(x->item.Key() < v)){. Как ее поправить?

Спасибо

05.12.05 18:39: Перенесено модератором из 'Алгоритмы' — Кодт
Re: Кажется, Седжвик опять ошибся...
От: Аноним  
Дата: 06.12.05 07:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, коллеги!


А>кажется, я в Седжвике еще одну ошибку нашел (брал код из родных его исходников — то же, что в книге). Он описываетя списки пропусков в 13 главе. Там есть функция удаления:


А>
А>void removeR(link t, Key v, int k)
А>{
А>    link x = t->next[k];
А>    if(!(x->item.Key() < v)){
А>        if(v == x->item.Key()){
            t->>next[k] = x->next[k];
А>        }
А>        if(k == 0){
А>            delete x;
А>            return;
А>        }
А>        removeR(t, v, k - 1);
А>        return;
А>    }
А>    removeR(t->next[k], v, k);
А>}
А>


А>Ошибку вызывает if(!(x->item.Key() < v)){. Как ее поправить?


А>Спасибо


Я сейчас открыл, посмотрел. Remove я исправил (по крайней мере, я не нашел за час случая, когда он вылетает), но у меня траблы с Insert: он иногда вылетает на строке if((tk == 0) || (v < tk->item.Key())){. Приведу код:

    const int lgNmax = 10;
    template <class Item, class Key>
    class SkipList
    {
    private:
        struct node
        {
            Item item;
            node **next;
            int sz;
            node(Item x, int k)
            {
                item = x;
                sz = k;
                next = new node*[k];
                for(int i = 0; i < k; i++)
                    next[i] = 0;
            }
        };

        typedef node *link;
        link head;
        Item nullItem;
        int lgN;
        int N;

        int _randX()
        {
            int i, j, t = rand();

            for(i = 1, j = 2; i < lgNmax; i++, j += j)
                if(t > RAND_MAX / j)
                    break;
            if(i > lgN)
                lgN = i;

            return i;
        }

        void _insert(link t, link x, int k)
        {
            Key v = x->item.Key();
            link tk = t->next[k];

            if((tk == 0) || (v < tk->item.Key())){    // вот тут иногда вылетает,
                if(k < x->sz){            // причем tk при этом всегда 0xfdfdfdfd
                    x->next[k] = tk;
                    t->next[k] = x;
                }
                if(k == 0)
                    return;
                _insert(t, x, k - 1);
                return;
            }
            _insert(tk, x, k);
        }

        Item _search(link t, Key v, int k)
        {
            if(!t)
                return nullItem;
            if(v == t->item.Key())
                return t->item;
            link x = t->next[k];
            if(!x || (v < x->item.Key())){
                if(k == 0)
                    return nullItem;
                return _search(t, v, k - 1);
            }
            return _search(x, v, k);
        }

        // это уже исправленный мной вариант (не исправленный ты присылал)
        void _remove(link t, Key v, int k)
        {
            link x = t->next[k];
            if(!x){
                if(k > 0)
                    _remove(t, v, k - 1);
                return;
            }
            if(!(x->item.Key() < v)){
                if(v == x->item.Key()){
                    t->next[k] = x->next[k];
                    if(k == 0){
                        delete x;
                        N --;
                        return;
                    }
                }
                if(k > 0)
                    _remove(t, v, k - 1);
                return;
            }
            _remove(t->next[k], v, k);
        }

    public:
        SkipList(int = 0)
        {
            head = new node(nullItem, lgNmax);
            lgN = 0;
            N = 0;

            srand((unsigned int)time(NULL));
        }

        int Count() const
        {
            return N;
        }

        void Insert(Item v)
        {
            _insert(head, new node(v, _randX()), lgN);
            N ++;
        }

        Item Search(Key v)
        {
            return _search(head, v, lgN);
        }

        void Remove(Key v)
        {
            _remove(head, v, lgN);
        }

        void Show()
        {
            for(link h = head->next[0]; h; h = h->next[0])
                cout << h->item.Key() << ": " << h->item.Info() << endl;
        }
    };


Помогите, пожалуйста, все это исправить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.