Algorithm 多维过滤器,以消除;“坏的”;大桌子上的东西?

Algorithm 多维过滤器,以消除;“坏的”;大桌子上的东西?,algorithm,arrays,filter,big-o,multidimensional-array,Algorithm,Arrays,Filter,Big O,Multidimensional Array,我有一个包含N个项目的大表,每个项目有M(M>=3)个不同的属性, 从这个表中,我必须删除同一个表中包含所有属性得分相等或更好的项目的所有项目 我有一个(python)已经解决了这个问题,但它对输出敏感,最坏的情况是在过程中没有删除任何项时,大约为O((n²+n)/2)。 这对于我的项目来说太慢了(100000个项目的数据集,每个项目有8个属性并不少见),所以我需要一些接近O(m*n logn)最坏情况的数据集,但我不知道这个问题是否能那么快解决 示例问题案例及其解决方案: [higher va

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

我有一个(python)已经解决了这个问题,但它对输出敏感,最坏的情况是在过程中没有删除任何项时,大约为O((n²+n)/2)。 这对于我的项目来说太慢了(100000个项目的数据集,每个项目有8个属性并不少见),所以我需要一些接近O(m*n logn)最坏情况的数据集,但我不知道这个问题是否能那么快解决

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

[higher value = better] Singing Dancing Acting A 10 20 10 B 10 20 30 C 30 20 10 D 30 10 30 E 10 30 20 F 30 10 20 G 20 30 10 [价值越高=越好] 歌舞表演 102010 B 102030 C 30 20 10 D 30 10 30 E 10 30 20 F 30 10 20 G203010 解雇所有表现相同或相同的候选人 在所有学科中都更好

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


有没有一种算法可以有效地解决这个问题?它是什么?

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

创建这种树的一种方法是在一个维度的中间位置重复拆分记录组,在每个树级别的维度之间循环。如果对每个这样的拆分使用类似于快速排序的中值搜索,则可能需要花费时间n log n。(kd树)

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

这篇文章似乎解决了您的问题

上面的链接断了。这里还有一个:
这里有一个偏序集,如果a的所有特征值都大于或等于B,那么a=B。有可能!(A=B),在这种情况下,A和B是“不可比的”。您的问题是从集合中删除那些由其他元素控制的元素,例如,删除集合中存在的每一个A s.t.以便A
在最坏的情况下,所有的元素都是不可比较的,也就是说,你不能消除任何东西。现在让我们看看不可比性关系。假设有一个B(不可比性)和B!~C.A和C是否仍然具有可比性?对例如,A可以具有{1,2,3}、B{2,1,5}和C{2,3,4}特征。这意味着不可比性不是“可传递的”,因此你有点运气不佳;据我所知,检查所有元素是否不可比较通常需要O(N^2)时间。

直觉上,“最坏”的情况(或最难找到)是当几个条目几乎相互抵消时。例如,考虑一个10,20,10,B,20,10,20,B几乎抵消了A,并且几乎取消了B。如果这样的情况不发生,那么这个解决方案将很容易在O(n)时间内实现。如果给它输入[(0,1),(1,0)],它只返回[(0,1)]。当然,这两者都应该保留。第3步中对maxima()的递归调用就是问题所在。如果你看所有的d维,它会移除对应于最大值的向量。正确性证明根本没有提到对maxima()的调用:-POh,我想这只是个打字错误。定理说,“向量v_i是v的最大元素当且仅当v_i*∈ 但最后的n应该是i。那么这是有效的,还是无效的?我得承认我在用这种纸裹头时遇到了一些麻烦是的,我也是。这不是最容易的阅读。它会有用的,但你可能需要花一两天的时间。实现将不简单。如果只有2或3个维度,则性能为O(n logn);O(n(logn)^(d-2))表示d维。我刚刚意识到这个算法并不能真正处理大量的维。。有人在这里检查我的数学:d维性能告诉我,为了使该算法的最坏情况超过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。是吗?在玩弄了一个使用kd树的实现之后,它似乎在概念上比我所拥有的有了相当大的改进+1.