【问题标题】:Minimum Match Logic最小匹配逻辑
【发布时间】:2012-05-19 13:48:08
【问题描述】:

我有一个非常大的数据集,我试图找到满足所有数据集的最小集。最终集合中必须有一个值,该值存在于所有数据集中

一小部分数据看起来像

[0] => Array
    (
        [0] => 21
        [1] => 21
        [2] => 21
    )

[1] => Array
    (
        [0] => 29
    )

[2] => Array
    (
        [0] => 27
    )

[3] => Array
    (
        [0] => 21
        [1] => 21
        [2] => 21
        [3] => 39
        [4] => 39
        [5] => 43
    )

[4] => Array
    (
        [0] => 29
        [1] => 33
        [2] => 33
        [3] => 43
    )

在这种情况下,我需要返回 21、27 和 29 的逻辑 返回的值必须是匹配所有数组的最小数量的值。因为我是一名 PHP 程序员,所以我用 PHP 编写了这个函数。

【问题讨论】:

  • 所以基本上,你想要最小的公共元素。
  • 这个可以优化很多。每个数组都应简化为不同的元素。如果任何数组是另一个数组的超集,则可以将其删除。不过,不确定其余的。

标签: php logic


【解决方案1】:

你可以遵循这个算法:

测试后更新

$data=array(
            array(21,29,27,57,22),
            array(22,21,23,24,25,26),
            array(31)
            );

$map = array(); // keep a map of values and how many times they occur in other sets
foreach ($data as $setid => $set) {
    foreach (array_unique($set) as $v) {
        $map[$v][$setid] = true;
    }
}

function reverseCount(array $a, array $b)
{
    return count($b) - count($a);
}

// sort reversed on intersection count
uasort($map, 'reverseCount');

// after sorting the first number will be the one that occurs the most
// keep track of which sets have been hit
$setmap = array(); $n = count($data);
foreach ($map as $v => $sets) {
    $hits = 0;
    foreach ($sets as $setid => $dummy) {
        if (!isset($setmap[$setid])) {
            --$n;
            ++$hits;
            $setmap[$setid] = true;
        } else {
            continue;
        }
    }
    if ($hits) {
        echo "value $v\n";
        if (!$n) {
            // all sets are hit
            break;
        }
    }
}

这次测试了。不能证明总能得到正确的结果,因为这被认为是一种贪心逼近算法。

但我希望它能让您了解您可以做什么。让我知道是否有任何让您感到困惑的事情,或者我是否完全错了:)

【讨论】:

  • 鉴于上面 timus2001 的数据集,我没有看到 $setmap 或 $map 中输出的答案。我喜欢映射结果的想法,我会尝试解决这个问题。
  • @DavidFairbanks 给出了 22 和 31,答案不在 $map$setmap 本身btw ...它是从两者中提炼出来的;再说一次,这个算法并不总是能给出最佳结果,因为你可能需要动态编程
  • 好像是这样。我会做进一步的测试。谢谢
  • 为什么要这么复杂的算法? @DavidFairbanks 我的回答呢?
  • @pomeh 当 OP 说“最小”时,他并不是指一组中的最低数量;他是指所有集合中存在的最小数字集合。
猜你喜欢
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2018-11-18
  • 1970-01-01
  • 2014-07-24
  • 2016-03-18
相关资源
最近更新 更多