前几天出的一道笔试题《百姓网公开笔试题:查询条件的子集判断》,收到来自各地的很多解决方案,有C的,有C++的,有PHP的,还有Python的。我建议大家把自己的解答放在自己的blog上面,我这里给链接,大家移步到他们的blog上去看。
- 赖勇浩:百姓网那道题(我是为了阅读这个代码开始学习Python的,的确简洁,清晰)
- Qmigh:查询条件子集判断的解决思路(墙外)
- Season Lee:从离散数学到编译原理–百姓网编程题后序
- Soulogic: 《百姓网公开笔试题:查询条件的子集判断》的一份 PHP 答卷
在原文的评论中也有很多精辟的思路,大家可以借鉴。
《程序员》杂志闫辉在邮件里问了这样一个问题:
你认为程序员的成就感来自哪几个方面?
这是我的回答
每个程序员都是不同的,他的成就感也是不同的。有的人看重纯技术的优秀 (以Linux平台上的C程序员为多),有的人看重结构的完整(以Java程序员为多),还有人看重对业务的贡献(我见到的微软系统 的比较多一些)。各种都有,而且程序的世界是一个广阔的世界,可以从汇编,到Python,从几个字节的纠结,到几个 Terabyte的推敲,里面成千上万的技术爱好者在里面乐此不疲。
如果说一定要概括程序员这个行业对比其他行业来说比较独特的成就感,我觉得是“追求卓越”。程序的世界有点像奥林匹克运动,在相对 一致的预设条件下进行公平的竞争。奥运会是在在一样的跑道或球场上,一样的规则下,追求更快、更高、更强;程序员的世界,也几乎在一 样的 条件下(标准化的操作系统,语言,和硬件),追求更快,更多,更好。程序员的PK,更加公平。所以当两个程序员在PK最优 的实现的时候,结果常常是两个互相佩服的程序员;很难设想两个文学家,政治家,或者银行家的PK之后,会不会有类似的结果。
在这次大家对于同一个问题的不同的解决方案的尝试中很容易看到这一点。大家其实不是为了面试,就是技术人员看到有挑战性的问题本能的反应就是解决它。
再次谢谢大家的参与。
后注:今天的公司简单咖啡厅供应的每日水果是菠萝。不过阿姨过于匆忙,又出现了水里泡着菠萝,但是没有筷子的情况。我一直喜欢“有菠萝但是没筷子”,也不要“有筷子但是没菠萝”。很多事情的轻重缓急,常受此场景启发。
过来签到 http://soulogic.com/blog/archives/400.html
其实我到现在也不知道实现的对不对,要是谁能给出个杀手级集合大家都能先各自测一下就好了
@Platinum,加到文章里面了。谢谢你对百姓网投入的热情。我们一直保持联系。
最近太忙 ,本想周末写写来着.没想到这就总结了
算然早就听说过博主,但最近在Buzz上看到阮一峰的那篇文章,才开始关注楼主,正好碰到这次写这个东西,获益匪浅啊。
虽然早就听说过博主,但最近在Buzz上看到阮一峰的那篇文章,才开始关注楼主,正好碰到这次写这个东西,获益匪浅啊。
:)很好玩,有时候,常常是博文最后一句话,漫不经心,却画龙点睛的感觉,有意思:)
个人感觉,会有漏判的情况发生,特别是当查询条件中涉及的变量之间不独立时。例如:
year_of_birthday = … # integer, e.g. 1981
year_of_current = … # integer, e.g. 2010
age = year_of_current – year_of_birthday
# query1_condition
age > 30
# query2_condition
year_of_current > year_of_birthday+31
应当能够判断出query2是query1的子集。
Soulogic的实现(https://soulogic.com/subset_test/),有个问题在判断A是否是(B U C)的子集时,判断方法是“A是B的子集或者A是C的子集”这个条件(这只是充分条件,不是必要条件),没有考虑到“B和C有交集或者连续”的情况。例如B是“x [1, 100]”,C是“x [101, 200]”, A是“x [90, 110]”,这种情况下A仍然是BUC的子集,A却不是B的子集,也不是C的子集。使用Soulogic的实现(https://soulogic.com/subset_test/)测试了这样的情况,无法识别。
看了season lee的blog已经纠正这个问题。
接上文,大家都提到了,问题的解决思路是:将两个查询条件都转换为“若干个条件组合”的或的形式,并且每个条件只能是多个原子条件的与。
那么在判断A是否是(B U C)的子集的时候,A,B,C都只包含“与”运算符,这时感觉可行的一种办法时计算每个A和B U C中每个变量的值域,转化为多维空间中区域包含关系判断的问题。