2013-11-13 2 views
1

В основном у меня есть очень большой массив объектов, и мне нужно удалить 10% объектов с наименьшей степенью точности.Данные выборки из большого массива

Каждый объект имеет связанную с ним переменную пригодности (двойную). У меня нет числа, которое определяет, подходит ли объект, я просто хочу, чтобы он был наименее приспособлен.

Каков наилучший способ получения (выборки) наименее подходящих объектов?

Один способ может быть случайным образом выбирает путь 20%, сортирует данные, а затем удаляет 10%. Но я думаю, что это не очень умный способ сделать это.

Другой способ сохранить массив отсортированным во все времена, а затем удалить первые 10%. Но я не думаю, что это очень хорошо, потому что вам придется всегда сортировать массив при вставке/обновлении, что является большим накладным расходами.

+1

Почему вы не попробуете [Приоритетную очередь] (http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html), что заказы по фитнесу? Затем просто вызовите 'remove()' до тех пор, пока вы не очистите свои 10%? – thegrinner

+0

Спасибо, я не знал о очередях Priority, позвольте мне попробовать: – RegUser

+0

@thegrinner Я понял, что не могу использовать приоритетную очередь, потому что мне нужно иметь возможность извлекать элементы, используя их индексированную позицию. Есть ли какая-либо другая структура данных, которую я могу использовать? – RegUser

ответ

2

Пусть k будет yourCollection.length() * 0.1 и n = yourCollection.length().

Найти k-й самый маленький элемент (QuickSelect или Median of 5), где ключ - ваш фитнес. Назовем это p. Это можно сделать в O(n).

Затем пройдите через коллекцию и удалите все предметы с помощью фитнеса меньше, чем p.fitness. У нас есть решение O(n).

Или вы можете создать кучу в O(n) с key=fitness и удалить k элементов из него в O(k * log(n)).

+0

Спасибо. Я немного смущен, не могли бы вы углубиться в подробности? Это хорошая идея использовать фитнес как ключ? потому что он будет постоянно обновляться. – RegUser

+0

@RegUser: Не могли бы вы предоставить дополнительную информацию об использовании? Предполагая, что фитнес можно вычислить в постоянное время, первое решение работает в '' 'O (n)' '' даже для множественного удаления вместе ('' '" O (n) + 9/10 O (n) + 81/100 O (n) "... ~ O (n)' '', см. Http://en.wikipedia.org/wiki/Geometric_progression). Если вам требуется более быстрое одиночное удаление, вы можете сохранить дерево записей и сохранить размеры поддеревьев, что позволит вам найти ваш набор в '' 'O (k + log n)' ''. Но это потребует дополнительного обслуживания дерева, и он будет медленным, если фитнес обновляется часто. – Danstahr

+0

Использование модифицированного генетического алгоритма для решения TSP. После каждого поколения я хочу удалить 10% наихудших людей без итерации по всему населению и с очень небольшим вычислительным потенциалом. Самое главное, что он эффективен. – RegUser

Смежные вопросы