【问题标题】:Multi-dimensional filter to eliminate "bad" items from a large table?多维过滤器从大表中消除“坏”项目?
【发布时间】:2011-01-02 12:10:58
【问题描述】:

我有一个包含 N 个项目的大表,每个项目具有 M (M>=3) 个不同的属性, 从这个表中,我必须删除同一个表中包含在所有属性上得分相等或更好的项目的所有项目。

我有一个 algorithm (python) 已经解决了它,但它是输出敏感的,最坏的情况是大约。 O((n²+n)/2) 当没有项目被移除时。 这对于我的项目来说太慢了(其中 100,000 个项目的数据集,每个项目有 8 个属性并不少见),所以我需要接近 O(m*n log n) 最坏情况的东西,但我不知道这个问题是否可以这么快就解决了。

示例问题案例及其解决方案:

[更高的价值=更好] 唱歌跳舞演戏 10 20 10 乙 10 20 30 C 30 20 10 30 10 30 10 30 20 F 30 10 20 G 20 30 10

解雇所有候选人,其中有候选人表现相同或 在所有学科中都更好。

解决方案:
- A 被解雇,因为 B、C、E、G 在所有学科中的表现都相同或更好。
- F 被解雇,因为 D 在所有学科中的表现都相同或更好。

是否存在有效解决这个问题的算法,它是什么?

【问题讨论】:

  • 直观地说,“最坏”情况(或最难找到)是多个条目几乎相互抵消的情况。例如考虑 A 10 20 10 B 20 10 20 B 几乎抵消了 A,而 A 几乎抵消了 B。如果这种情况不发生,那么解决方案将很容易在 O(n) 时间内实现。

标签: algorithm arrays filter big-o multidimensional-array


【解决方案1】:

一般的答案是将记录排列成一棵树,并在每个节点记录位于该节点下方的记录的每列最大值。然后,对于每条记录,从树的顶部沿着树向下追踪,直到您知道它是否被支配,如果可能的话,使用每个节点处的注释跳过整个子树。 (不幸的是,您可能必须搜索节点的两个后代)。当您删除一个被支配的记录时,您可能能够更新其上方节点中的注释 - 因为这不需要重新平衡树,它应该很便宜。您可能希望至少在原始代码上获得加速。如果我对多维搜索的记忆是正确的,您可能希望从 N^2 变为 N^(2-f),其中 f 随着维数的增加而变小。

创建这样一棵树的一种方法是在一个维度的中位数处重复拆分记录组,循环遍历每个树级别的维度。如果您对每个这样的拆分使用类似快速排序的中值搜索,您可能会期望树的构造花费您 n log n 的时间。 (kd-树)

对此的一个调整因素不是一直向下拆分,而是在组大小达到 N 或更少时停止拆分。

【讨论】:

  • 在玩弄了一个使用 kd-trees 的实现之后,从概念上来说,它似乎比我所拥有的有了相当大的改进。 +1。
【解决方案2】:

【讨论】:

  • 我认为本文中的算法 3.1 被破坏了。如果你给它输入 [(0, 1), (1, 0)] 它只返回 [(0, 1)]。它当然应该保留两者。第 3 步中对 maxima() 的递归调用是问题所在。如果您查看所有 d 维度,它会删除对应于最大值的向量。正确性证明根本没有提到对 maxima() 的调用。 :-P
  • 哦,我想这只是一个错字。定理说:“向量 v_i 是 V 的最大元素当且仅当 v_i* ∈ T_n。”但是末尾的 n 应该是 i.
  • 所以这行得通,还是不行?我不得不承认在这种纸上绕着我的头有些麻烦
  • 是的,我也是。这不是最简单的阅读。它会起作用,但你可能需要花一两天时间。实现并不简单。如果只有 2 或 3 个维度,性能是 O(n log n); d 个维度的 O(n (log n)^(d-2))。
  • 我刚刚意识到这个算法并没有真正具备处理大量维度的能力。有人在这里检查我的数学:d-dimensions 性能告诉我,为了让这个算法的最坏情况能够beat O(n^2), d 必须小于 (2*log(log2(n))+log(n))/log(log2(n)),因为那是 n = log2(n) ^(d-2)。现在,我有一组 11 个维度,这表明为了让该算法击败 O(n^2) 最坏的情况,它必须包含超过 2362955301000000 个条目,因为 log2(2362955301000000)^(11-2) = 2362955301000000。对吗?
【解决方案3】:

你在这里拥有的是一个部分有序的集合,因此 A all 特征的值小于或等于 B,并且 A >= B 如果 all A 的特征值大于或等于 B。有可能!(A=B),在这种情况下 A 和 B 是“不可比的”。您的问题是从集合中消除那些由其他元素主导的元素,例如删除每个 A s.t.集合中存在 B 使得 A

在最坏的情况下,所有元素都无法比拟,即你无法消除任何东西。现在让我们看一下不可比性关系。假设 A !~ B (不可比性)和 B !~ C。 A 和 C 是否仍有可比性?是的!例如,A 可以具有特征 {1,2,3}、B {2,1,5} 和 C {2,3,4}。这意味着不可比较性不是“传递性的”,因此您有点不走运;据我所知,一般来说,要检查所有元素是否无可比拟需要 O(N^2) 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2018-01-25
    相关资源
    最近更新 更多