ios21 0 / 0 / 0 Регистрация: 11.12.2017 Сообщений: 76 |
||||
1 |
||||
11.12.2017, 21:30. Показов 10118. Ответов 5 Метки нет (Все метки)
Код есть, но не знаю как подправить, выводит массив целиком
0 |
1718 / 567 / 187 Регистрация: 12.03.2016 Сообщений: 2,169 |
|
11.12.2017, 22:02 |
2 |
Сообщение было отмечено Kuzia domovenok как решение РешениеЭтот код по идее и компилиться не должен, не то что еще 3 наибольших находить.
1 |
Gaveyn 99 / 98 / 11 Регистрация: 12.09.2016 Сообщений: 195 |
||||
12.12.2017, 00:08 |
3 |
|||
Ты сначала говоришь что у тебя есть целая константа N=20,в следующей строке ты уже говоришь что это у тебя просто целое число,а потом предлагаешь пользователю его ввести!
2 |
Lyumary 3 / 3 / 3 Регистрация: 10.12.2017 Сообщений: 3 |
||||||||
12.12.2017, 02:41 |
4 |
|||||||
Сообщение было отмечено ios21 как решение Решение
+STL
2 |
kolit 12 / 9 / 5 Регистрация: 02.06.2012 Сообщений: 25 |
||||
12.12.2017, 03:56 |
5 |
|||
вот как пример работы со статическим и динамическим массивом программа создает динамический массив случайных чисел и находит sizeLargestArr=3 наибольших числа.
1 |
12 / 9 / 5 Регистрация: 02.06.2012 Сообщений: 25 |
|
12.12.2017, 04:02 |
6 |
результат работы программы:
1 |
Нужно вывести три самых больших числа, но я не понимаю как это сделать.
int buf;
int max;
for (int i = 1; i <= 20; ++i) {
cout << "number " << i << ": ";
cin >> buf;
if (i == 1 || (i > 1 && buf > max)) {
max = buf;
}
}
cout << "Max: " << max;
diralik
9,2956 золотых знаков23 серебряных знака57 бронзовых знаков
задан 21 окт 2018 в 9:56
4
Для трёх чисел выгоднее всего, видимо, создать буфер на три наибольших элемента (по сути – очередь по приоритетам), положить первые числа в правильном порядке, а дальше проверять, не больше ли очередное число, чем наименьшее число в буфере. Если да, то вытеснять наименьшее число, и вставлять новое в нужное место.
ответ дан 21 окт 2018 в 10:14
MBoMBo
47.8k1 золотой знак17 серебряных знаков40 бронзовых знаков
13
#include <iostream>
using namespace std;
int main() {
int Arr[20];
for(int f=0; f <20; f++)
{
cin >> Arr[f];//ввод значений массива
}
for (int i = 0; i < 20; i++) { //сортировк
for (int j = 0; j < 19; j++) {
if (Arr[j] > Arr[j + 1]) {
int b = Arr[j];
Arr[j] = Arr[j + 1];
Arr[j + 1] = b;
}
}
}
for(int z=19; z >= 17; z--)
cout <<Arr[z]<<endl;
return 0;
}
ответ дан 21 окт 2018 в 10:19
spaisspais
4163 серебряных знака12 бронзовых знаков
2
To find the three greatest elements in an array(length 100), is a combination of a for loop and an if statement(s) the most effective way, or is there a more efficient method?
asked Oct 7, 2010 at 15:54
1
Your question is not very clear to me.
The most efficient way would be to maintain a max heap of size 3
and insert the array elements into the max heap one by one.
At the end the 3
elements in your max heap are the 3
largest elements in the original array.
In general the problem of finding max M
elements in an array of size N
is best solved by maintaining a max heap of size M
.
answered Oct 7, 2010 at 16:06
codaddictcodaddict
443k81 gold badges490 silver badges528 bronze badges
0
For an array of length 100, and a max-3 items, you can even sort the array first and then take the top three elements – the performance difference is negligible.
For an array of greater size, a for-loop with an if comparing the 3 elements to the current one sounds fine.
If you have to find the top N elements of an M-sized array, then I think sorting would be most efficient.
answered Oct 7, 2010 at 15:58
BozhoBozho
585k143 gold badges1057 silver badges1137 bronze badges
I think you could do it with a single loop through the array, and I don’t think you could do it faster. Something like:
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE; //assuming integer elements in the array
for (int i = 0; i < theArray.length; i++)
{
if (theArray[i] > max1)
{
max3 = max2; max2 = max1; max1 = theArray[i];
}
else if (theArray[i] > max2)
{
max3 = max2; max2 = theArray[i];
}
else if (theArray[i] > max3)
{
max3 = theArray[i];
}
}
If you want the top N elements in the array, you probably just want to sort it.
answered Oct 7, 2010 at 16:01
Riley LarkRiley Lark
20.6k15 gold badges80 silver badges128 bronze badges
3
As this is java, you can always use a SortedSet (TreeSet for instance), that performs the sorting when elements are inserted, at a minimal cost (log(n)), and when you’re done inserting, you can use descendingIterator() to retrieve the three greatest elements.
answered Oct 7, 2010 at 16:05
SirDariusSirDarius
40.9k8 gold badges85 silver badges100 bronze badges
Building onto Riley logic which skipped consideration for duplicated elements in the top 3 position here is what I propose to rectify that problem:
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE; // assuming integer elements in the array
for (int i = 0; i < theArray.length; i++) {
if (theArray[i] > max1) {
max3 = max2;
max2 = max1;
max1 = theArray[i];
} else if (theArray[i] > max2) {
if (max1 == theArray[i]) {
// Neglect as already present in max1
} else {
max3 = max2;
max2 = theArray[i];
}
} else if (theArray[i] > max3) {
if (max1 == theArray[i] || max2 == theArray[i]) {
// Neglect as already present in max1 OR max2
} else {
max3 = theArray[i];
}
}
}
answered Oct 8, 2015 at 0:43
Assuming the array is not sorted, you have to go through each element with a for loop (or something equivalent.)
There really isn’t a more efficient way but to iterate for each element.
answered Oct 7, 2010 at 15:59
StarkeyStarkey
9,6436 gold badges31 silver badges51 bronze badges
You should only have to traverse the list once, but yes, you will have to traverse it.(assuming it is not sorted).
answered Oct 7, 2010 at 16:00
BradBrad
15.3k6 gold badges36 silver badges57 bronze badges
The best and most efficient way (in my own opinion) would be sorting the array first (preferably with Merge Sort
) then get the top 3 values.
answered Oct 7, 2010 at 16:02
RuelRuel
15.3k7 gold badges38 silver badges49 bronze badges
A few people are posting saying that sorting is the way to go and then grab the top 3. However if there is a O(log N) insert into a sorted collection your will have to do it N times or to do a O(NlogN) sort (which by the way is a N^2 worst case scenario) you end up with NlogN efficiency as opposed to a simple O(N) of iterating through the array with a max1/max2/max3 like Riley posted above. Sorting or inserting into a sorted collection is the easiest but not the most efficient.
answered Oct 7, 2010 at 18:51
Chris LohfinkChris Lohfink
16.1k1 gold badge29 silver badges38 bronze badges
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10] = {-10,50,200,30,45,70,780,850,10,900};
int i=0;
int Max[3]={0};
for(i=0;i<10;i++){
if(Max[2]<a[i])
Max[2] = a[i];
}
for(i=0;i<10;i++){
if(Max[1]<a[i] && a[i]<Max[2])
Max[1] = a[i];
}
for(i=0;i<10;i++){
if(Max[0]<a[i] && a[i]<Max[1])
Max[0] = a[i];
}
printf("%d %d %d",Max[2],Max[1],Max[0]);
return 0;
}
answered Jan 14, 2016 at 6:24
uses crt; const n=10; var a:array [1..n] of integer; i,max1,max2,max3,nmax1,nmax2,nmax3:integer; begin clrscr; randomize; writeln('Massive :'); for i:=1 to n do begin a[i]:=random(100); write(a[i],' '); end; writeln; max1:=-maxint; max2:=-maxint; max3:=-maxint; for i:=1 to n do if a[i]>max1 then begin max1:=a[i]; nmax1:=i; end; for i:=1 to n do if a[i]>max2 then if i<>nmax1 then begin max2:=a[i]; nmax2:=i; end; for i:=1 to n do if a[i]>max3 then if (i<>nmax1) and (i<>nmax2) then begin max3:=a[i]; nmax3:=i; end; writeln; writeln('Max 1 = a[',nmax1,']=',max1); writeln('Max 2 = a[',nmax2,']=',max2); writeln('Max 3 = a[',nmax3,']=',max3); readkey; end.
Форум программистов Vingrad
Страницы: (2) Все [1] 2 |
Поиск: |
|
Поиск 3 максимальных в массиве |
Опции темы |
HMLd |
|
||
Шустрый Профиль
Репутация: нет
|
Дае масив длинной n. Какой есть оптимальный по быстродействию алгоритм поиска 3 максимальных элементов? Банальные модификации BubbleSort не предлагать. И второе, вроде как в STL в какои-то контейнере реалтзован такой алгоритм. Подскажете? |
||
|
|||
Akina |
|
||
Советчик Профиль
Репутация: 20
|
Прямой поиск ——————– О(б)суждение моих действий – в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция – Администрация форума. |
||
|
|||
Peter |
|
||
Опытный Профиль
Репутация: нет
|
std::set. В нем элементы отсортированы. ——————– всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
||
|
|||
Pavia |
|
||
Опытный Профиль Репутация: 11
|
Модифицируй BFPRT. сложность O(n) А проще всего конечно написать прямой поиск. |
||
|
|||
MaxPayneC |
|
||
Опытный Профиль Репутация: нет
|
Три раза найти максимум – сложность O(n). |
||
|
|||
Akina |
|
||
Советчик Профиль
Репутация: 20
|
зачем? запоминаем три текущих максимума, берём следующий элемент и сравниваем с минимаксом. Один проход. ——————– О(б)суждение моих действий – в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция – Администрация форума. |
||
|
|||
Earnest |
|
||
Эксперт Профиль
Репутация: 7
|
не в контейнере, а в алгоритмах: partial_sort ——————– … |
||
|
|||
HMLd |
|
||
Шустрый Профиль
Репутация: нет
|
Akina, и сколько придётся сделать сравнений? |
||
|
|||
Akina |
|
||
Советчик Профиль
Репутация: 20
|
Ровно N. ——————– О(б)суждение моих действий – в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция – Администрация форума. |
||
|
|||
HMLd |
|
||
Шустрый Профиль
Репутация: нет
|
Akina, не знаю. Наверное туплю. Можно пример на каком-нить языке? Или хотя бы словесное описание алгоритма. |
||
|
|||
Peter |
|
||
Опытный Профиль
Репутация: нет
|
Поскольку в std::set элементы отсортированы, то там и будем хранить три максимальных элемента. Добавлено через 1 минуту и 12 секунд ——————– всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
||
|
|||
Pavia |
|
||||
Опытный Профиль Репутация: 11
|
Akina,
По моему вы ошибаетесь сравнений понадобиться в лучшем случае N в худшем 3*N
|
||||
|
|||||
esperanto |
|
||||
Бывалый Профиль Репутация: 2
|
Нет. ——————– B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) – > Skype SDET |
||||
|
|||||
MaxPayneC |
|
||
Опытный Профиль Репутация: нет
|
O(n) = O(3 * n) по определению символов Ландау. Не путайте асимптотическую сложность и константу алгоритма. По теме: изящнее реализации Pavia я придумать не могу, за исключением того, что начинать имеет смысл от третьего, а не от нулевого элемента, и сравнений в худшем случае будет действительно 3n. |
||
|
|||
gcc |
|
||
Агент алкомафии Профиль
Репутация: нет
|
я бы нашел максимальный элемент в массиве, а потом бы перебрал массив и удалил бы это значение… так 3 раза, а сам поиск макс. значения будет быстрый (в большом массиве)…. и имеется ввиду что простой перебор массива тоже быстрый? если да, то операция быстрая должна получится…
(может быть как-то можно еще, именно 3 последние вывести сразу… а не по одному) пример сочинил от сюда http://www.opennet.ru/docs/RUS/perl_obzor/…s/quantium.html Это сообщение отредактировал(а) gcc – 7.3.2010, 11:39 ——————– Perl FAQ |
||
|
|||
Страницы: (2) Все [1] 2 |
|
Правила форума “Алгоритмы” | |
|
Форум “Алгоритмы” предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Алгоритмы | Следующая тема » |