【发布时间】:2011-04-13 17:11:40
【问题描述】:
这是伪作业(这是额外的功劳)。我有一个 BST,它是指向包含这些单词的行(存储在其他地方)的单词索引。我需要实现一种使用 s 表达式进行搜索的方法,以便可以组合和 (&) 和或 (|)。
在命令提示符下,用户可以键入如下内容:
QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))
基本上应该返回包含火、森林和水的所有行以及包含海洋、船和水的所有行。
我真正需要帮助的是解析和插入节点到树中的逻辑,以正确表示表达式而不是实际代码。我发现的唯一对我有意义的事情是为表达式中的每个单词返回一组行。然后根据它是“或”还是“与”操作,我将对这些集合执行联合或交集类型操作以创建一个新集合并将其传递到树上。
我对如何解析包含表达式的行有点迷茫。经过一番思考,似乎其中一个子表达式“越远”在我的 s 表达式树中应该越高?我想如果我能在正确的方向上推动解析和插入树中的表达式,我应该没问题。
我为上述查询提出的示例树看起来像这样;
&
/ \
| water
/ \
& &
/ \ / \
fire forest ocean boat
这是有道理的,因为 fire 会返回一组全都包含 fire 的行,而 forest 会返回一组全都包含 forest 的行。然后在“&”级别,我将使用这两个集合并创建另一个集合,其中仅包含两个集合中的线条,从而给我一个集合,其中只有包含火和森林的线条。
我的另一个绊脚石是在我克服了解析的障碍之后如何表示树中的所有内容。我有一个 ExpTreeNode 类,它将作为我的 ExpTree(BST)的节点,然后我有 2 个子类,运算符和操作数,但我不确定这是否是一个好方法。
【问题讨论】:
-
Your 与 s-expression 完全不同,因为在类似 s-expression 的语言中,合取和析取运算符将是列表的头部。不知道你是否需要关心。
-
Pete 我正在学习 C++,并且对它的实际工作方式很感兴趣(如果事实上你确实做到了)。如果您不介意发布有关如何解决此问题的代码或通过电子邮件将其发送给我,我将不胜感激。
-
@stackuser 我实现了分流场算法,就像在接受的答案中一样。你不能仅仅看一眼维基百科的文章就完全理解这一点,但所有的信息都在那里。通读 Wikipedia 文章,然后再次阅读该文章,但请参考示例以及纸和铅笔。我成功地在 C++ 中完成了额外的功劳,然后又在 C# 中实现了它。这似乎是压倒性的,但它一点也不坏。如果您仍有问题,可以提出更具体的问题,并随时联系我,我会看看。
标签: algorithm parsing binary-search-tree s-expression