找到矢量集的最小元素

时间:2013-05-12 08:41:45

标签: algorithm sorting

我有一组向量,我需要在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)}。我已经有了算法,但我认为可以通过更好的计算复杂性来完成。我的算法采用一个元素,将其标记为最小,然后采用其他元素,比较它们,如果存在无法比拟,则将两者标记为最小,如果第二个较小则将其标记为最小等...是否可以使用mergesort或heapsort优化这个算法?感谢所有回复。

3 个答案:

答案 0 :(得分:0)

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

来自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++;
        }
    }
}

答案 1 :(得分:-1)

伪代码:

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

答案 2 :(得分:-1)

我在文章http://repository.cmu.edu/cgi/viewcontent.cgi?article=2758&context=compsci中找到了我的问题的解决方案,其中是用于查找类似问题的向量集的最大元素的算法。它的工作效率要比我最直观的算法更好。