搜索引擎中开发diversity功能时遇到的一个问题。

问题:

作为一个商品集合平台的搜索引擎,在用户输入关键词后得到排序的搜索结果时,多数会面临一个问题,就是一整页的商品都是来自一个商家,全是京东的,或是全是天猫的,或是淘宝的,或是6pm的或是xxx的,……。

需求:

面对这个问题就诞生了我们的需求,就是将这些个相关性最高的商品再次以商家的维度进行打散!

现有系统的设计:

现有系统设计了一个基类:ProductScoreEvaluator,不同的rerank的策略继承此基类,即可完成diversity的功能,从而满足需求!

但是,更近一步,我想根据我自己设定的参数确定每个商家在rerank时显示的商品的个数(玩一玩的初衷,自认为有点画蛇添足)。原本基类中定义了一个纯虚函evaluate(),

如果我改动此函数的话就会导致很多的地方需要改动,所以我就在基类中又加了一个带commodityNum的evaluate()函数,但是在连接的时候出错了!具体原因还未查明。现在的

解决方案是:

不在基类中定义下图中第二个evaluate()函数,直接在DiversityRoundEvaluate类中重载函数evaluate()函数,在执行时首先判断是否是要进行diviersity的字段,如果是就使用

dynamic_cast将此基类指针强制转换为类DiversityRoundEvaluate的指针,并调用重载的evaluate()函数!


在解决此问题时学习到的几个知识点:

第一:虚函数或者纯虚函数的默认参数问题

#include <iostream>
using namespace std;
class CBase
{
public:
    virtual void Test(int iTest = 0) const = 0;
};
class CDerived : public CBase
{
public:
     virtual void Test(int iTest = 1) const
     {
         cout<<"iTest:"<<iTest<<endl;
     }
};
int main()
{
    CBase *p = new CDerived;
    CDerived *pp = new CDerived;
    p->Test();
    pp->Test();

    delete p;
    delete pp;

    return 0;
}

以上代码的运行结果为:iTest:0

iTest:1


如果将p->Test()改写为p->Test(5),则输出为:iTest:5。


解释如下:虚函数是动态绑定的(即在运行时),但缺省参数是静态绑定的(即在编译时),

默认参数在编译的时候已经写死了,不会动态的。这意味着你最终可能调用的是一个定义在派生类,

但使用了基类中的缺省参数值的虚函数。可能大家会说为什么不让缺省参数值被动态绑定呢?

答案和运行效率有关。如果缺省参数值被动态绑定,编译器就必须想办法为虚函数在运行时确定合适的缺省值,

这将比现在采用的在编译阶段确定缺省值的机制更慢更复杂。

做出这种选择是想求得速度上的提高和实现上的简便,所以大家现在才能感受得到程序编译连接的高效。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值