找到向量集的最小元素

Posted

技术标签:

【中文标题】找到向量集的最小元素【英文标题】:Find minimal elements of set of vectors 【发布时间】:2013-05-12 08:41:44 【问题描述】:

我有一组向量,我需要用 java 编写算法,以找到该集合的最小元素。问题是,有些元素是无法比拟的。例如。 minset(1,4,6),(3,2,5),(2,3,4),(5,4,6) = (1,4,6),(3,2,5 ),(2,3,4)。对于一组最小元素“minset”,以下成立:原始集合中的每个向量要么在“minset”中,要么>=比每个组件中新集合中的某个向量。例如。 minset(2,3,4),(2,3,5) = (2,3,4)。我已经有了这个算法,但我认为它可以用更好的计算复杂度来完成。我的算法采用一个元素,将其标记为最小,然后采用另一个元素,比较它们,如果有不可比较的,则将两者都标记为最小,如果第二个较小,则仅将其标记为最小等...是否可以使用合并排序或heapsort 来优化这个算法?感谢所有回复。

【问题讨论】:

你用什么度量来比较向量? 哪些元素被认为是“无与伦比的”?我不明白为什么 minset(1,4,6),(3,2,5),(2,3,4),(5,4,6) = (1,4,6), (3,2,5),(2,3,4)。你能更清楚地定义问题吗? 哦,我明白你的意思了。您希望获得一个向量子集,以使原始集合中的每个向量都在新集合中或大于每个组件中新集合中的某个向量。我会考虑的。 【参考方案1】:

我创建了一个runnable example。它使用Java 的内置Arrays.sort()Comparator,它比较两个大小为L 的向量。如果您更喜欢使用List 数据结构而不是数组,则可以使用Collections.sort() 执行类似的操作。

来自Java API Specification:

This algorithm offers guaranteed n*log(n) performance.
import java.util.*;
import java.lang.*;

class Main

    public static void main (String[] args) throws java.lang.Exception
    
        final int L = 3;

        int[][] vectors = 
            1, 4, 6,
            3, 2, 5,
            2, 3, 4,
            5, 4, 6,
            7, 7, 7,
            3, 3, 5,
            8, 8, 8,
        ;

        Comparator<int[]> cmp = new Comparator<int[]>() 
            public int compare(int[] v1, int[] v2) 
                int cmp0 = Integer.signum(v1[0] - v2[0]);
                for (int i = 0; i < L; i++) 
                int cmp1 = Integer.signum(v1[i] - v2[i]);
                    if (cmp1 != 0) 
                        if (cmp1 != cmp0) 
                            return 0;
                        
                        cmp0 = cmp1;
                    
                
                return cmp0;
            
        ;

        Arrays.sort(vectors, cmp);

        System.out.println("minset:");
        int i = 0;
        int[] vPref = vectors[0];
        while (cmp.compare(vectors[i], vPref) == 0) 
            for (int x : vectors[i])
                System.out.print(x + ", ");
            
            System.out.println();
            vPref = vectors[i];
            i++;
        
    

【讨论】:

你能估计一下这个算法的复杂度吗? Arrays.sort()n*log(n) 对不起,但我意识到,这个算法没有做我需要的,对于你使用的集合,它返回获取 (3, 2, 5) 和 (3, 3, 5) 的集合)。这是不正确的,因为 (3, 2, 5) 你的意思是 (3, 2, 5) [v 是的,这正是我需要的,误会见谅。【参考方案2】:

伪代码:

foreach inputVector in vectors
    foreach minVector in minSet
        if (all components of inputVector <= components of minVector
            delete minVector
        elseif (all components of inputVector >= components of minVector)       
            skip to next inputVector
    if inputVector made it through the entire minSet, then add it to minSet

【讨论】:

我有相同的伪代码,但我正在尝试找出是否有可能找到具有更好计算复杂性的 minset【参考方案3】:

我在文章http://repository.cmu.edu/cgi/viewcontent.cgi?article=2758&context=compsci 中找到了我的问题的解决方案,其中是用于查找向量集的最大元素的算法,这是类似的问题。它的计算复杂度比我的第一个直观算法要好得多。

【讨论】:

这是一个有用答案的良好开端,但是当问题询问算法时指向论文的链接对答案的未来读者没有帮助(尤其是当链接失效时)。能否附上您阅读答案后编写的源代码或解决方案的简短描述?

以上是关于找到向量集的最小元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在向量的给定索引范围内找到最小元素?

查找向量中的最小项目列表

在一组三个向量中找到最接近的三元组?

查找向量的向量的最大值/最小值

matlab基本函数min

从二维向量中找出最小向量元素的更好方法