Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我正在尝试使用Python实现Skiplist。你能帮助我吗?很简单_Python_Search_Insertion_Ordered Map - Fatal编程技术网

我正在尝试使用Python实现Skiplist。你能帮助我吗?很简单

我正在尝试使用Python实现Skiplist。你能帮助我吗?很简单,python,search,insertion,ordered-map,Python,Search,Insertion,Ordered Map,这只是一个非常简单的代码,我的参考资料如下: 我认为insert函数是可以的,但是当我尝试使用get()函数时,它不会返回任何内容,而是在searchEntry()部分中无限循环。我不知道怎么了。在insert()函数中,searchEntry()运行良好。它返回对floorEntry(k)条目的引用,该条目包含的密钥小于需要插入skiplist中的密钥。请帮助我找出searchEntry()函数中的错误源。对不起,我不太擅长这个。谢谢大家! from QuadLinkedList import

这只是一个非常简单的代码,我的参考资料如下:

我认为insert函数是可以的,但是当我尝试使用
get()
函数时,它不会返回任何内容,而是在
searchEntry()
部分中无限循环。我不知道怎么了。在
insert()
函数中,
searchEntry()
运行良好。它返回对
floorEntry(k)
条目的引用,该条目包含的密钥小于需要插入skiplist中的密钥。请帮助我找出
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
从QuadLinkedList导入QLLNode
随机输入
小班:
定义初始化(自):
self._p1=QLLNode(“减去INF”)
self.\u p2=QLLNode(“加上INF”)
self.\u head=self.\u p1
self.\u tail=self.\u p2
self.\u p1.设置下一步(self.\u p2)
self.\u p2.setPrev(self.\u p1)
自身高度=0
自我评价.\u n=0
def插入(自身、键、值):
p=self.searchEntry(键)
打印“p=”+str(p.getKey())
q=QLLNode(键、值)
q、 setPrev(p)
q、 setNext(p.getNext())
p、 getNext().setPrev(q)
p、 setNext(q)
i=0
而randint(0,1)!=0:
如果i>=self.\u高度:
自身高度+=1
newHead=QLLNode(“减去INF”)
newTail=QLLNode(“加上INF”)
newHead.setNext(newTail)
新头。放下(自身头)
newTail.setPrev(newHead)
新尾翼放下(自尾翼)
自身头设置(新头)
自尾设置(新尾)
self.\u head=newHead
自尾=新尾
而p.getUp()==无:
p=p.getPrev()
p=p.设置()
e=QLLNode(键,无)
e、 setPrev(p)
e、 setNext(p.getNext())
e、 设置(q)
p、 getNext().setPrev(e)
p、 setNext(e)
q、 设置(e)
q=e
i+=1
自.\u n+=1
一无所获
def get(自身,密钥):
p=self.searchEntry(键)
如果key==p.getKey():
返回p.getElement()
其他:
return“没有!”
def searchEntry(自身、密钥):
p=自身头
尽管如此:

而p.getNext().getKey()!=“PLUS_INF”和p.getNext().getKey()问题不在
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
关于这段代码,我最突出的一点是,您没有创建任何新节点,只是修改了现有节点,这就是打破列表结构的原因。我认为,您需要创建新的
头部
尾部
节点,并将它们链接到结构的顶部。(
不是您链接中描述的算法的一部分,因此我不确定您正在使用它们。)您可能希望这样:

       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

谢谢你的回答!我按照你的建议编辑了代码。但是,它在get()部分仍然不返回任何内容。