【问题标题】:How can I recursively search a list of lists for an item, getting the "closest" match如何递归搜索列表中的项目,获得“最接近”的匹配
【发布时间】:2010-10-19 23:20:17
【问题描述】:

我有一个类“Class”,它有一个成员 std::list,我想在该列表/树中搜索一个项目,特别是一个具有特定名称的项目。 我的班级的基本表示如下:

#include <list>
#include <string>
class Class {
    std::string _name;
    std::list<Class*> _members;
public:
    Class(const std::string& name) : _name(name) {}
    void addMember(Class* member) { _members.push_back(member); }
    const std::string& name() const { return _name; }
    const std::list members() const { return _members; }
    Class* findItem(const std::string& name) const { ... }
};

我可以在 Class::findItem: 中做这样的事情:

Class* Class::findItem(const std::string& n) const {
    std::list<Class>::const_iteratior i;
    for(i=_members.begin(); i!=_members.end(); ++i)
        if((*i)->name() == n) return *i;
    for(i=_members.begin(); i!=_members.end(); ++i) {
      Class* cls = (*i)->findItem(n);
      if(cls) return cls;
    }
    return 0;
}

但是,我想要发生的是 findItem() 将“最接近”的项目返回到从中搜索的项目。 例如,如果这是我的树,每个字母代表列表层次结构中的一个级别,每个数字代表项目“值”。我希望 findItem(3) 返回 B(3),而不是 C(3)。

一个(1) | ---------------------------------- 乙(2)乙(3) | | --------------------- ----- C(3) C(4) C(4) | | ---------------- ---------- D(5) D(6) D(7) D(5) D(6)

【问题讨论】:

  • 这是家庭作业吗?
  • 不,个人项目。该类实际上是一个“对象”类,它具有“父”和“子”,就像 Qt QObject 类一样。我正在使用它作为 Qt 的一个小项目。

标签: c++ search tree graph-theory breadth-first-search


【解决方案1】:

使用breadth-first search。当您访问一个不等于查询值的节点​​时,您将该节点推到队列的后面。首先处理队列前面的节点。您找到的第一个匹配项将是最接近根的匹配项。

Class* Class::findItem(const std::string& n) const {
    std::list<Class>::const_iteratior i;
    std::queue<Class*> q;
    q.push(this);
    while (!q.empty()) {
        Class *c = q.front(); q.pop();
        if (c->name() == n) return c;
        for(i=c->_members.begin(); i!=c->_members.end(); ++i)
            q.push(i);
    }
    return NULL;
}

【讨论】:

  • 谢谢,我正在寻找。并且该代码使其易于理解。
  • 请注意,std::queue 有 .front() 而不是 .top()
  • 将 top() 替换为 front() 并将 std:: 添加到队列中。
【解决方案2】:

听起来您要的是Breadth-first search

我认为你的问题可能与家庭作业有关,所以我不会在这里透露更多细节。

【讨论】:

  • 嘿,这不是家庭作业,我有点太老了,不能上学。
  • 抱歉,它看起来像一个 ;-)
【解决方案3】:

您似乎对执行BFS(广度搜索优先)感兴趣。实现它的最简单方法不是通过递归,而是使用FIFO 队列,您可以在其中将相邻元素添加到最后要测试的元素,然后从队列中提取第一个元素以执行下一次检查。

插入的顺序是 [ A(1), B(2), B(3), C(3), ... ],你会在测试 C(3) 之前找到 B(3)。

【讨论】:

    【解决方案4】:

    如果你这样做breadth-first-search风格,即先看所有B,然后看所有C等,你的匹配节点将自动是最近的。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2014-03-24
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多