组合检测机制

时间:2011-08-23 12:58:11

标签: algorithm

在销售点系统中,收银员会逐一键入产品类型和数量。假设有一个组合的商业规则,例如用2个可乐买2个薯条,你可以获得1美元的折扣。我想创建一种机制,在购买的产品列表中自动检测组合,然后应用适当的折扣。

产品主数据包含大约4000个项目。将有大约100个组合。在交易中购买的产品平均数量为2.截至目前,有史以来最高记录的产品数量为128个。

我的想法是,如果交易中有3个产品(A,B,C),我必须检查(A,B),(A,C),(B,C)的组合是否存在,( A,B,C)。当交易具有更多产品类型时,需要检查的组合数量会快速增长。

这可能吗?有人试过这样的事吗?关注如何实现这一点的一些见解?

平台是vb.net 2010和SQL Server 2005。

修改

组合将包含2到4个项目。

2 个答案:

答案 0 :(得分:1)

您可以像在帖子中那样对可能的组合进行排序,然后创建树结构。 如果你必须检查一个组合,你首先要查找第一个项目(例如A),然后按照树,然后检查下一个项目(例如C)。如果你能找到这个,那就有可能的组合,否则没有。

不同的解决方案: 将所有按照问题排序的组合保存在哈希映射中,然后查看这些组合。我可以想象这个速度非常快,但它需要大量的空间和一些时间来生成哈希映射。

答案 1 :(得分:1)

// I figured it is easy to post code than explaining long-winded style. All are programmer here anyways
typedef pair<string,int> item_quant;
bool funccomp (const item_quant& lhs, const item_quant& rhs)
{
    if((lhs.first < rhs.first) ||  (lhs.second < rhs.second))
        return true;
    return false;
}
struct classcomp {
    bool operator() (const vector<item_quant>& lhs, const vector<item_quant>& rhs) const
    {
        if(lhs.size() < rhs.size())
            return true;
        for(unsigned int i=0; i< lhs.size();++i)
        {
            if(!funccomp(lhs[i],rhs[i]))
                return false;
        }
        return true;
    }
} classcompObj;



int main()
{
    // Insert
    map<vector<item_quant>,int,classcomp> table;
    vector<item_quant> v;
    v.push_back(make_pair("coke",2));
    v.push_back(make_pair("fries",2));
    // Dont forget to sort.
    sort(v.begin(),v.end(),funccomp) ;
    table[v] = 1;

    //search
    int disc = (*table.find(v)).second;
    cout<<" disc = "<<disc<<endl;
    return 0;
}