首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查最小堆数组是否有效

检查最小堆数组是否有效
EN

Stack Overflow用户
提问于 2021-01-30 10:53:29
回答 2查看 111关注 0票数 1

我有这个函数def validate(self),它应该检查给定的数组是否是有效的最小堆。我认为它可以工作,但是因为我的数组在开始时没有,比如None,2,3,5,它似乎遇到了问题,并给出了错误'<' not supported between instances of 'int' and 'NoneType'

如何跳过代码中的none值?

代码语言:javascript
复制
def validate(self):
    """
    Validates the heap. Returns True if the heap is a valid min-heap, and
    False otherwise.

    """

    n = self.__len__() 
    for i in range(int((n - 2) / 2) + 2):

        if self._items[2 * i + 1] < self._items[i]: 
            return False

        if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]): 
            return False
    return True

新代码:

代码语言:javascript
复制
def validate(self):
    """
    Validates the heap. Returns True if the heap is a valid min-heap, and
    False otherwise.

    """

    n = self.__len__() 
    for i in range(int((n - 2) / 2) + 2):
        if self._items[i] != None:
            if self._items[2 * i + 1] < self._items[i]: 
                return False

        if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]): 
            return False

错误:

代码语言:javascript
复制
  File "<doctest __main__.MinHeap.validate[8]>", line 1, in <module>
    h.validate()
  File "x-wingide-python-shell://114699264/2", line 219, in validate
TypeError: '>' not supported between instances of 'int' and 'NoneType'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-30 20:54:32

与对照其左子节点及其右子节点(如果有)检查每个非叶节点相比,对照其父节点检查每个非根节点更为简单。

代码语言:javascript
复制
def validate(self):
    n = len(self._items)
    for i in range(2, n):
        if self._items[i // 2] > self._items[i]: 
            return False
    return True

您还可以在all中使用理解

代码语言:javascript
复制
def validate(self):
    n = len(self._items)
    return all(self._items(i // 2) <= self._items[i] for i in range(2, n))
票数 0
EN

Stack Overflow用户

发布于 2021-01-30 10:57:53

变化

代码语言:javascript
复制
    for i in range(int((n - 2) / 2) + 2):
        if self._items[2 * i + 1] < self._items[i]
            return False

        if (2 * i + 2 < n and self._items[2 * i + 2] > self._items[i]): 
            return False

代码语言:javascript
复制
    _items = list(filter(None, self._items)) # delete all Nones in the list, save the cleaned list into a local variable in case you want to use the unmodified list somewhere else
    for i in range(int((n - 2) / 2) + 2):
        if _items[2 * i + 1] < _items[i]: 
            return False

        if (2 * i + 2 < n and _items[2 * i + 2] > _items[i]): 
            return False

这样,它将首先从列表中删除所有None,然后才进行比较。

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

https://stackoverflow.com/questions/65964191

复制
相关文章

相似问题

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