我在上一轮的艰难采访中得到了这个编程问题。
所以问题有两个相同大小的列表。
List<Customer>, List<Products>
有一个如下的功能
int score(Customer, Product)
并返回分数。
我必须找到所有客户对分数应该最大的产品的分配。
这似乎是一个NP完全问题,在采访中我不太可能解决,特别是在采访后几天我还不能解决。现在我只是想知道解决方案 有人可以帮忙吗?
答案 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;
}