2010-02-12 5 views
0

Мне нужно выполнить некоторые задачи. Есть числа, дающие две строки и они действуют как пары целых чисел (a, b). Я должен найти максимум 5 чисел a-строки, а затем выбрать максимум этих 5, но на этот раз из b-строки. Пример:Идеи для конкретной структуры данных в C++

1 4 
5 2 
3 3 
7 5 
6 6 
2 9 
3 1 

В этом примере пара я нужен (6,6), так как 6 (а) находится в верхнем 5 а [я] числа и 6 (б) является максимальным в b этих 5 пар. Я думал об этом с помощью векторов и моих собственных определенных структур, также использую некоторые массивы temp, но я не знаю, правильно ли это делать, может быть, есть более простой способ сделать это.

Любые идеи?

EDIT: Мне также нужен номер индекса пары (в случае 5, это пятая пара i.e).

+0

Если это домашняя работа, вы должны пометить ее как таковой – Manuel

ответ

2

Удовлетворяют пары удержания очереди с приоритетом, которые выполняют оценки порядка, основанные на первом элементе пары. Вы можете вставить все пары, а затем извлечь верхнюю часть 5. Затем просто перейдите в этот список пар, ища максимальный второй элемент каждой пары.

редактировать

я должен сказать, что это достойное решение, только если вы можете принять выполнения порядка О (п * Л.Г. п)

+1

Так как он также нуждается в индексе, приоритетная очередь должна фактически удерживать тройки (первый элемент, второй элемент, индекс). –

+0

о да, хороший момент. –

0

Альтернативные подходы:

Нажмите тройки (первый, второй, индекс) в вектор, а затем std :: partial_sort первые 5 элементов с использованием функтора нисходящего порядка на первом элементе. Затем используйте std :: max_element со вторым функтором, чтобы найти максимум второго элемента и захватите его индекс. Если я правильно читаю сложность partial_sort, это должно выполняться в линейном времени (O (n)), потому что мы всегда сортируем максимум 5 элементов, а не O (n * log n).

Аналогичным образом, чтобы вектор содержал только пары и сортировал второй вектор, содержащий индексы в первом.

+0

Я думал об этом типе решения, но перечитывая вопрос, кажется, что вы хотите заказать второй столбец для всех элементов, у первого столбца которого есть одно из самых высоких значений. Это означает, что может быть повторен элемент (пример имеет повторяющиеся значения первого столбца), и поэтому вы не знаете, сколько элементов вы хотите «частично» сортировать. Конечно, для решения O (N log N) вы можете просто использовать 'std :: sort' для всего вектора. –

+0

Внесение изменений в мое решение, все, что вам нужно сделать, это сделать сортировку предикатов первым спускаемым элементом, а второй элемент спускается, когда первый элемент равен. Таким образом, связь с первым элементом разрешена, давая вам максимум второго элемента, который идет с соответствующим первым элементом. Это должно быть линейное время. –

+0

(1, 100), (1, 101), (1, 102), (1,103), (1, 104), (2, 1) удалят (1,100) от вектора и используют (2,1) как часть решения, при заказе вторым элементом (ограниченным самыми большими 5 первыми элементами) должны включать все (1, x) пары –

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