У меня есть набор векторов, и мне нужно написать алгоритм в 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 для оптимизации этого алгоритма? Спасибо за все ответы.Найти минимальные элементы набора векторов
ответ
Я нашел решение моей проблемы в статье http://repository.cmu.edu/cgi/viewcontent.cgi?article=2758&context=compsci, где есть алгоритм нахождения максимальных элементов множества векторов, который является подобная проблема. Он работает намного более усложняющей сложностью, чем мой интуитивно понятный алгоритм.
Это хороший старт для полезного ответа, но ссылка на бумагу, когда вопрос задан для алгоритма isn ' t полезно будущим читателям ответа (особенно когда связь умирает).Можете ли вы включить исходный код, который вы написали после прочтения ответа или краткое описание решения? –
Я создал a 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++;
}
}
}
Можете ли вы оценить сложность этого алгоритма? – lulish89
'Arrays.sort()' is 'n * log (n)'. – ValarDohaeris
ОК, спасибо большое – lulish89
псевдокод:
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
У меня такой же псевдокод, но я пытаюсь выяснить, можно ли найти мини-карту с лучшей усложнённостью сложности. – lulish89
- 1. C++ лямбда удалить элементы из набора векторов
- 2. Найти минимальные и максимальные элементы массива
- 3. Найти максимальные минимальные значения
- 4. Как найти общие элементы из нескольких векторов?
- 5. Как найти неидентичные элементы из нескольких векторов?
- 6. Сравнивая два набора векторов
- 7. Найти минимальные функции
- 8. Найти минимальные элементы, которые покрывают матрицу в Python
- 9. Суммирование набора векторов в Prolog
- 10. Изучение представления из набора векторов
- 11. ошибка в обработке набора векторов
- 12. Как удалить элементы векторов в наборе векторов?
- 13. Как суммировать элементы векторов
- 14. Переместить элементы векторов C++
- 15. фильтрации результирующего набора, чтобы определить минимальные значения
- 16. Создание декартова произведения набора векторов в Python?
- 17. минимальные элементы в куче для Python
- 18. Минимальные элементы во всех смежных подмассивах
- 19. R: как определить минимальные репрезентативные наборы векторов/строк из списка векторов/dataframe
- 20. Как найти общие элементы из нескольких векторов и из матрицы?
- 21. Как найти минимальные даты из списка товаров?
- 22. Найти максимальные/минимальные значения текущего видового окна
- 23. Найти минимальные шаги для сортировки Массив
- 24. Максимальные и минимальные элементы в дереве B +
- 25. Как найти минимальные шаги, чтобы пересечь реку?
- 26. Управление набора векторов шаблонных производных типов
- 27. Оптимизация 2 набора векторов переменной длины
- 28. Программа убита: использование вектора набора векторов
- 29. Кластеризация разреженного набора данных двоичных векторов
- 30. Рисование набора векторов с использованием металла
Что вы используете для сравнения векторов? – assylias
Какие элементы считаются «несравненными»? Я не понимаю, почему minset {(1,4,6), (3,2,5), (2,3,4), (5,4,6)} = {(1,4,6), (3,2,5), (2,3,4)}. Можете ли вы определить проблему более четко? – javic
О, я понимаю, что вы имеете в виду. Вы хотите получить подмножество векторов, так что каждый вектор исходного набора либо находится в новом наборе, либо больше некоторого вектора в новом наборе в каждом компоненте. Я подумаю об этом. – javic