【问题标题】:Save trace of deep first search保存深度​​优先搜索的痕迹
【发布时间】:2015-09-04 23:03:14
【问题描述】:

我正在一个具有树结构的网页中搜索一些数据。

网页包含类别,这些类别中的每一个都可以包含另一个类别或者是一个叶子(它包含特定的数据)。

所以最简单的方法大概就是在这个结构中使用递归来搜索了。但我想在找到每片叶子时保存它的踪迹。

下面是例子:

url_of_1st_level_cat -> url_of_2nd_level_cat -> url_of_3rd_level_cat -> leaf 

我希望在处理这片叶子时能够获得叶子的整个痕迹。

所以当我得到一些叶子时,我可以做例如find_trace(leaf) 返回:

[url_of_1st_level_cat,url_of_2nd_level_cat,url_of_3rd_level_cat]

这是搜索叶子的递归函数的伪代码:

def find_leafs_of_category(self,url):


   subcategories = self.get_subcategories(url)
   for subcategory in subcategories:
        if is_leaf(subcategory):
            # DO STUFF

        else: self.find_leafs_of_category(subcategory)

你对这个问题有什么好的和简单的解决方案吗?

编辑:树应该是有序的,所以当出现一些问题时,它可以从它结束的地方继续。

更详细:

(AAC、AAB不是类别的实名,不能通过实名拆分来追溯)

A - AA ...
  - AB ...
  - AC - ACA ...
       - ACB ...
       - ACC ...
       - ACD - leaf1
             - leaf2
          - leaf3
          ...
  1. 我使用方法find_leafs_of_category(A)
  2. 现在,我想用这片叶子做点什么。所以它处理leaf,leaf,leaf...leaf1,leaf2,突然连接被中断。为了能够继续,我必须记住它已经处理了A - AA ...A - AB...A - AC - ACA ...A - AC - ACB ...、A - AC - ACC ...以及来自A - AC - ACD的所有叶子,这些叶子已经处理的是leaf1leaf2...所以它必须能够得到跟踪,即A - AC - ACD - leaf3并从这一点继续。

【问题讨论】:

  • 那么,你可以通过拆分叶子的url来获得子类别吗?即:a/ab/abc/leaf1 ?
  • @le_vine 不,我绝对不能那样做。我必须记住搜索过程中的痕迹。
  • 哎呀,可悲的是,这超出了我的 Python 舒适区 :(
  • 您可以附加所有已处理的类别并以您找到的叶子结尾并将其存储在某处。 ['A', 'C', 'D', 'leaf1'] 所以中断后你可以从上一个列表继续前进。

标签: python recursion tree


【解决方案1】:

我想到了一个可能的解决方案。 它实际上是伪代码,所以它不会“按原样”工作,但我认为你可以从中得到灵感!

class Leafer(object):
    start_url = str
    last_visited_url = str
    leafs = []

    def find_leafs(self, url, subcategories=[]):
        self.last_visited_url = url
        new_sub = url.get_subcategories()
        for sub in new_sub:
            if is_leaf(url):
                self.leafs.append(Leaf(subcategories))
            else:
                self.find_leafs(sub, subcategories.append_sub)

class Leaf(object):
    subcategories = []

有没有可行的办法?

【讨论】:

    【解决方案2】:

    只需将这些元素的元组传递给递归调用,然后在下一个级别中,您只需在传递时将当前级别添加到元组中。像这样的:

    def find_leafs_of_category(self, url, path):
        subcategories = self.get_subcategories(url)
        for subcategory in subcategories:
            if is_leaf(subcategory):
                # DO STUFF
    
            else:
                next_path = path + (url,)
                self.find_leafs_of_category(subcategory, next_path)
    

    当然,您必须在第一次调用中传递一个空元组才能使其工作,或者将参数的默认值设置为 None 并检查它以对其进行初始化:

    def find_leafs_of_category(self, url, path = None):
        if path is None:
            path = (,) # empty tuple
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多