查找客户对产品的最佳评分

时间:2013-10-10 21:40:01

标签: algorithm

我在上一轮的艰难采访中得到了这个编程问题。

所以问题有两个相同大小的列表。

List<Customer>, List<Products>

有一个如下的功能

int score(Customer, Product)并返回分数。

我必须找到所有客户对分数应该最大的产品的分配。

这似乎是一个NP完全问题,在采访中我不太可能解决,特别是在采访后几天我还不能解决。现在我只是想知道解决方案 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以将其建模为您想要找到最大匹配的加权二分图。

Wikipedia on Matching有这个答案可能有用:

  

在加权二分图中,每条边都有一个相关的值。一个   最大加权二分匹配定义为匹配所在的位置   匹配中边的值之和具有最大值。   如果图形不完整,则插入缺失边   值为零。找到这样的匹配称为赋值   问题。它可以通过使用修改的最短路径搜索来解决   增广路径算法。如果使用Bellman-Ford算法,   运行时间变为O(V ^ 2 E),或者可以改变边缘成本   具有实现O(V ^ 2 log(V)+ V E)运行时间的潜力   Dijkstra算法和Fibonacci堆。非凡的匈牙利人   算法解决了分配问题,它就是其中之一   组合优化算法的开始。原本的   该算法的方法需要O(V ^ 2E)运行时间,但它可能是   通过广泛使用优先级,将时间提高到O(V ^ 2 log(V)+ V E)时间   队列。

答案 1 :(得分:-1)

这是(Java)解决方案&#34;我必须找到所有客户对分数应该最大的产品的分配&#34;。

对于C客户和P产品,它在O(CP)时间内运行。

请注意,我没有测试此代码,因为未提供score()函数的定义。

Map<Customer, Product> solve(List<Customer> customers, List<Product> products)
{
    Map<Customer, Product> result = new HashMap<Customer, Product>();

    for (Customer customer : customers)
    {
        int maxScore = Integer.MIN_VALUE;
        Product bestProduct = null;

        for (Product product : products)
        {
            int currentScore = score(customer, product);

            if (currentScore > maxScore)
            {
                maxScore = currentScore;
                bestProduct = product;
            }
        }

        if (bestProduct != null)
        {
            result.put(customer, product);
        }
    }

    return result;
}