【问题标题】:A Tree-based Map in PythonPython 中的基于树的地图
【发布时间】:2014-04-19 21:28:30
【问题描述】:

mapSearch 是一个函数,它接受一个键和一个映射,并返回与键关联的值,如果键不存在则返回 None。

问题:当我运行搜索功能时,无论我输入什么键,它都会返回相同的值。

class EmptyMap():
    __slots__ = ()


class NonEmptyMap():
    __slots__ = ('left', 'key', 'value', 'right')

EMPTY_MAP = EmptyMap()

def mkEmptyMap():
    return EMPTY_MAP

def mkNonEmptyMap(b1, key, value, b2):
    node = NonEmptyMap()
    node.left = b1;
    node.key = key;
    node.value = value;
    node.right = b2;
    return node;

def mapInsert(key, value, mp):

if isinstance(mp, EmptyMap):
    return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap())

else:
    if key == mp.key:
        mp.value = value
    elif mp.key < key:
        mp.left = mapInsert(key, value, mp.left)
    else:
        mp.right = mapInsert(key, value, mp.right)

    return mp

def search(key, mp):
    if isinstance(mp, EmptyMap):
        return None
    elif isinstance(mp, NonEmptyMap):
        if key == mp.key:
            return mp.value
        elif mp.key < key:
            mp.left = search(key, mp.left)
            return mp.value
        else:
            mp.right = search(key, mp.right)
            return mp.value

【问题讨论】:

  • 您能展示一些示例输入和输出吗?
  • 首先修复最后四行中的明显错误。

标签: python map return-value binary-search-tree key-value


【解决方案1】:

我很确定您遇到的问题只是您没有从mapInsert 获得您期望的返回值。当前代码始终返回插入提供的值的节点,即使该节点是树中某处深处的叶节点。 (实际上,并不是我仔细观察它,您递归和返回的内容还有一些额外的错误。)

我认为您应该将mapInsertelse 块中的return 语句更改为返回mp,而不是递归调用的结果。调用的结果应该分配给mp.leftmp.right,这取决于我们递归到哪一边。

def mapInsert(key, value, mp):

    if isinstance(mp, EmptyMap):
        return mkNonEmptyMap(mkEmptyMap(), key, value, mkEmptyMap())

    else:
        if key == mp.key:
            mp.value = value
        elif mp.key < key:
            mp.left = mapInsert(key, value, mp.left) # don't return recursive result
        else:
            mp.right = mapInsert(key, value, mp.right) # pass the right child here!

        return mp # always return mp from this branch

请注意,更“Pythonic”的设计可能会使用类中的方法,而不是使用单独的函数来处理此类事情。不过,这需要对空树进行不同的处理。

【讨论】:

    【解决方案2】:

    一个明显的问题:

        if key == mp.key:
            mp.value = value
        elif mp.key > key:
            return mapInsert(key, value, mp.left)
        else:
            return mapInsert(key, value, mp.left)
    

    其中一个根本不返回任何东西,另外两个返回相同的东西。

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2020-10-18
      • 2010-09-06
      相关资源
      最近更新 更多