在销售点系统中,收银员会逐一键入产品类型和数量。假设有一个组合的商业规则,例如用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个项目。
答案 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;
}