这是伪作业(这是额外的功劳)。我有一个 BST,它是指向包含这些单词的行(存储在其他地方)的单词索引。我需要实现一种使用 s 表达式进行搜索的方法,以便可以组合和 (&) 和或 (|)。
在命令提示符下,用户可以键入如下内容:
QUERY ((((fire)&(forest))|((ocean)&(boat)))&(water))
本质上,这应该返回包含火、森林和水的所有行以及包含海洋、船和水的所有行。
我真正需要帮助的是解析节点并将其插入树中以正确表示表达式而不是实际代码的逻辑。我发现的唯一对我有意义的事情是为表达式中的每个单词返回一组行。然后根据它是“或”还是“与”操作,我将对这些集合执行联合或交集类型操作以创建一个新集合并将其传递到树上。
我对如何解析包含表达式的行有点迷茫。经过一番思考,似乎其中一个子表达式“越远”在我的 s 表达式树中应该越高?我想如果我能在正确的方向上推动解析和插入树中的表达式,我应该没问题。
我为上面的查询提出的示例树看起来像;
&
/ \
| water
/ \
& &
/ \ / \
fire forest ocean boat
这是有道理的,因为 fire 将返回一组全部包含 fire 的行,而 forest 将返回一组全部包含 forest 的行。然后在“&”级别,我将采用这两个集合并创建另一个集合,其中仅包含两个集合中的线条,从而给我一个集合,其中只有包含火和森林的线条。
我的另一个绊脚石是在我克服了解析的障碍之后如何表示树中的所有内容。我有一个 ExpTreeNode 类,它将作为我的 ExpTree(BST)的节点,然后我有 2 个子类,运算符和操作数,但我不确定这是否是一个好方法。