【问题标题】:Find best scoring assignment of customers to products找到客户对产品的最佳评分分配
【发布时间】:2013-10-11 15:40:57
【问题描述】:

我在最后一轮艰难的面试中得到了这个编程问题。

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

List<Customer>, List<Products>

有一个功能如下

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

我必须将所有客户分配给得分最高的产品。

这似乎是一个 NP 完全问题,我不太可能在面试中解决,尤其是在面试后几天我仍然无法解决的情况下。现在我只是想知道解决方案。
有人可以帮忙吗?

【问题讨论】:

  • 请贴一些代码。
  • 我确信这个问题非常难,但你刚刚成功地让它变得更难了:|
  • Mauren - 代码并不重要,如果我们告诉他“这是 NP 问题”,他显然可以自己解决......
  • 这是一个众所周知的问题,称为“加权二分图中的最大匹配”。它肯定是多项式可解的。

标签: algorithm


【解决方案1】:

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

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

在加权二分图中,每条边都有一个关联值。一个 最大加权二分匹配被定义为一个匹配,其中 匹配中边的值的总和具有最大值。 如果图不是完全的二分图,则插入缺失的边 值为零。找到这样的匹配被称为分配 问题。它可以通过使用修改后的最短路径搜索来解决 增广路径算法。如果使用 Bellman-Ford 算法, 运行时间变为 O(V^2 E),或者可以转移边缘成本 有可能达到 O(V^2 log(V) + V E) 的运行时间 Dijkstra 算法和斐波那契堆。非凡的匈牙利人 算法解决了分配问题,它是其中之一 组合优化算法的开始。原本的 该算法的方法需要 O(V^2E) 运行时间,但它可能是 通过广泛使用优先级改进到 O(V^2 log(V) + V E) 时间 排队。

【讨论】:

    【解决方案2】:

    这是一个 (Java) 解决方案,用于“我必须找到将所有客户分配给得分应该最高的产品”。

    对于 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;
    }
    

    【讨论】:

    • 这不会提供匹配,所有客户最终可能会得到相同的产品。
    • 问题在哪里禁止所有客户最终使用相同的产品?
    • 我承认这个问题的措辞不正确,但大多数其他人似乎将其解释为二分匹配问题。你解决的问题不能归类为“困难的面试问题”。
    • 如果“大多数其他人”跳下悬崖,那是否意味着他们是对的?谁能说这个解决方案不是针对“困难的面试问题”?这是非常主观的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多