Я пытаюсь реализовать Skiplist с использованием Python. Вы можете мне помочь? Очень просто

Это просто очень простой код, и моя ссылка отсюда: http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Map/skip-list-impl.html

Я думаю, что функция вставки в порядке, но когда я пытаюсь использовать get() функция, она ничего не возвращает, вместо этого она бесконечно зацикливается внутри searchEntry() часть. Я не знаю что не так. в insert() функция, searchEntry() работает хорошо. Возвращает ссылку на floorEntry(k) запись, содержащая ключ, который меньше ключа, который необходимо вставить в список пропусков. Пожалуйста, помогите мне выяснить источник ошибки в searchEntry() функция. Извините, я не очень хорош в этом. Спасибо!

from QuadLinkedList import QLLNode
import random
class Skippy:


    def __init__(self):

        self._p1 = QLLNode("MINUS_INF")
        self._p2 = QLLNode("PLUS_INF")

        self._head = self._p1
        self._tail = self._p2

        self._p1.setNext(self._p2)
        self._p2.setPrev(self._p1)

        self._height = 0
        self._n = 0

    def insert(self, key, value):

        p = self.searchEntry(key)
        print "p = " + str(p.getKey())
        q = QLLNode(key, value)
        q.setPrev(p)
        q.setNext(p.getNext())
        p.getNext().setPrev(q)
        p.setNext(q)

        i = 0

        while random.randint(0,1) != 0:

            if i >= self._height:
                self._height += 1

                newHead = QLLNode("MINUS_INF")
                newTail = QLLNode("PLUS_INF")

                newHead.setNext(newTail)
                newHead.setDown(self._head)

                newTail.setPrev(newHead)
                newTail.setDown(self._tail)

                self._head.setUp(newHead)
                self._tail.setUp(newTail)

                self._head = newHead
                self._tail = newTail

            while p.getUp() == None:
                p = p.getPrev()

            p = p.getUp()

            e = QLLNode(key,None)

            e.setPrev(p)
            e.setNext(p.getNext())
            e.setDown(q)

            p.getNext().setPrev(e)
            p.setNext(e)
            q.setUp(e)

            q = e

            i += 1

        self._n += 1
        return None

    def get(self, key):
        p = self.searchEntry(key)

        if key == p.getKey():
            return p.getElement()
        else:
            return "There's None!"

    def searchEntry(self, key):
        p = self._head

        while True:
            while p.getNext().getKey() != "PLUS_INF" and p.getNext().getKey() <= key:
                p = p.getNext()
            if p.getDown() != None:
                p = p.getDown()
            else:
                break
        return p

1 ответ

Проблема не в коде для searchEntry, который, кажется, имеет правильную логику. Проблема в том, что структура списка испортилась. Я считаю, что проблема заключается в коде, который у вас есть для добавления нового уровня в список в insert, Конкретно этот бит:

       if i >= self._height:    #make an empty level

            self._height += 1

            self._minus.setNext(self._plus)
            self._minus.setDown(self._head)

            self._plus.setPrev(self._minus)
            self._plus.setDown(self._tail)

            self._head.setUp(self._minus)
            self._tail.setUp(self._plus)

            self._head = self._minus
            self._tail = self._plus

Что выделяет меня в этом коде, так это то, что вы не создаете какие-либо новые узлы, просто модифицируете существующие, что нарушает структуру вашего списка. Вам нужно создать новый head а также tail узлы, я думаю, и связать их в верхней части структуры. (minus а также plus не являются частью алгоритма, как описано в вашей ссылке, поэтому я не уверен, что вы делаете с ними.) Вероятно, вы хотите что-то вроде этого:

       if i >= self._height:    #make an empty level

            self._height += 1

            newHead = QLLNode("MINUS_INF")
            newTail = QLLNode("PLUS_INF")

            newHead.setNext(newTail)
            newHead.setDown(self._head)

            newTail.setPrev(newHead)
            newTail.setDown(self._tail)

            self._head.setUp(newHead)
            self._head = newHead

            self._tail.setUp(newTail)
            self._tail = newTail
Другие вопросы по тегам