【问题标题】:Is there a name to the "things to handle" design pattern?“要处理的事情”设计模式有名称吗?
【发布时间】:2011-02-05 16:46:59
【问题描述】:

有一种设计模式我偶尔会用到,但我不知道它叫什么。也许它有一个名字并且这里有人知道它?

当我想遍历树状结构并对其所有节点执行一些操作时,我会使用它。它是这样的:

nodes_to_handle = [root_node]
while nodes_to_handle:
    node = nodes_to_handle.pop()
    # handle node
    nodes_to_handle += node.get_neighbors()

请注意,结构不必是树;例如,此模式可用于对数组进行泛洪填充。

那么,这个设计模式有一个公认的名称吗?

【问题讨论】:

  • 广度优先搜索
  • “广度优先”如何?你看代码了吗?
  • 对,它是nodes_to_handle.pop() 而不是nodes_to_handle.pop(0),这意味着nodes_to_handle 是一个堆栈,而不是一个队列,因此它是深度优先的。
  • 不管遍历是深度优先还是广度优先,这种独特之处在于我拥有nodes_to_handle 的列表,直到它为空为止。没有名字吗?
  • @coll-RR:是的……这就是所谓的堆栈。很抱歉让你失望,但它并不是那么独特。不过相当优雅。

标签: python algorithm design-patterns


【解决方案1】:

我认为你得到的是一种比深度优先遍历更通用的模式:边界列表。边界列表是仍然需要处理的元素的(排序或未排序)列表;该算法继续删除元素并处理它们,直到列表为空或满足其他一些终止条件。

我最喜欢这种模式的例子是 dijkstra 算法。在 Dijkstra 中,边界列表是一个优先级队列或堆,每次迭代都会将最小值的元素从堆中弹出。

【讨论】:

    【解决方案2】:

    这看起来像深度优先遍历算法。 (因为你从最后弹出列表)

    它可以通过几种不同的方式实现:

    • 使用遍历树的迭代器(首选方式)
    • 使用带有回调的遍历函数(如您的)(用于#handle node 代码)。
      • 在节点类之外
      • 节点类内部
    • ...

    编辑:没有正确查看代码。 :)

    【讨论】:

    • 对不起.. 深度优先.. 我认为这两个 cmets 是正确的,并没有仔细查看代码。
    • 无论遍历是深度优先还是广度优先,这种独特之处在于我拥有nodes_to_handle 的列表,直到它为空为止。没有名字吗?
    • @cool-RR:不是真的。这只是通过使用列表进行的迭代。这里更具体的事情(我们关注的)是您将节点的邻居添加到列表中。
    • @cool-RR:另外,对于洪水填充,您通常会在所有节点中进行广度优先遍历。 (但您需要记住您访问过的节点,因为邻居图在 iot 中会有循环。)请参阅 en.wikipedia.org/wiki/Flood_fill 了解洪水填充算法信息。
    【解决方案3】:

    这是depth-first graph traversal。它是algorithm,而不是design pattern。 (来自 Jochen Ritzel 的评论。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多