2010年5月5日星期三

查询条件子集判断的解决思路

王建硕的百姓网发了一道公开面试题。刚开始的时候觉得挑战很大,但是王建硕后面做了澄清,发现其实并不难了。

大体思路如下。本来想贴在王建硕的Blog的后面,结果杯具鸟,贴了几次都是500。

------------------------------

如果是处理QueryBuilder的话,那简单很多哦。其实这里面最繁琐的一步就是解析字符串格式的Query。其实就算是字符串形式的,如果每个AND和OR都有括号括起来的话,处理也不复杂。

我不认为tyler durden的“很难找到一个通用的方法”的想法是对的。这应该有通用解决办法的。

初步思路就是把queryA和queryB分别规整为一系列的原子条件的AND集合的OR集合。例如,将
(A<10 OR A>20) AND (B<10 OR B>20)
变换成为:
(A<10 AND B<10) OR (A<10 AND B>20) OR (A>20 AND B<10) OR (A>20 AND B>20)

为方便叙述,我们将A<10、B>20等称为“原子条件”,将原子条件的AND集合,称为“条件集”。将条件集的OR集合,称为“查询”。

要判断查询A是否为查询B的子集,需要将A的所有条件集都为B的子集。

要判断一个条件集A'是否为查询B的子集,只需要A'为B的任意一个条件集的子集。

要判断一个条件集A'是否为条件集B'的子集,需要A'的所有原子条件A'':或者在B'中没有相应的条目,或者B'中的相应条目的条件已经涵盖了A'',我相信这一步已经很容易做了。

-------------------------------------

写完了之后,发现已经有mikster的留言把上面这个过程用很数学的术语给描述过了。苍天作证,我是写完之后才看到那个留言的,绝对没有抄袭。 :-D

--------------------------------------

BTW,王建硕算是大牛了,怎么搞了这么囧的一个Blog Hosting啊。

2 条评论:

Jian Shuo 说...

相当的Impressive。我能想到的也大概是这个思路。能更多的了解你吗?

赖勇浩 说...

受你的启发,想了个无需进行规范化的方案,写成代码发到下面的网址了,想跟你交流一下。
http://blog.csdn.net/lanphaday/archive/2010/05/06/5565095.aspx