我有一组向量,我需要在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优化这个算法?感谢所有回复。
答案 0 :(得分:0)
我创建了runnable example。它使用Java的内置Arrays.sort()
和Comparator
来比较两个大小为L
的向量。如果您希望在数组上使用Collections.sort()
数据结构,则可以使用List
执行类似操作。
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中找到了我的问题的解决方案,其中是用于查找类似问题的向量集的最大元素的算法。它的工作效率要比我最直观的算法更好。