Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для ANT0NY
104 / 50 / 9
Регистрация: 06.01.2024
Сообщений: 383

Три максимума и пять минимумов

01.02.2024, 23:44. Показов 2043. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан массив из 100 случайных целых чисел от -10000 до 10000.
Pascal
1
var a:=ArrRandom(100, -10000, 10000);
Требуется найти три максимума и пять минимумов.
Предполагаю, что проще реализовать через отсортированный словарь cо счётчиком
Pascal
1
2
var d:=new SortedDictionary<integer, integer>;
foreach var x in a do d[x]:=d.Get(x)+1;
Как удобнее взять 5 минимумов в начале словаря и 3 максимума в хвосте, если допустимы повторы значений?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2024, 23:44
Ответы с готовыми решениями:

Поиск максимума и локальных минимумов в массиве
Помогите решить задачу, пожалуйста В массиве х, из n эл-ов, найти: Максимум(значение и номер). Два последовательных минимума.

Поиск максимума среди всех локадьных минимумов
Элемент двухмерного массива называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество...

Три максимума
Прочитайте последовательность целых чисел. Выведите список, в котором сначала будут стоять первые три самых больших числа...

18
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
02.02.2024, 06:30
Если максимумы и минимумы должны быть разными, можно так:
Pascal
1
2
3
4
##
var a:=ArrRandom(100, -10000, 10000);
var b := a.Sorted.Distinct.ToArray;
Print(b[:5] + b[^3:])
Если в выборке допускаются повторы, уберите .Distinct
2
 Аватар для ANT0NY
104 / 50 / 9
Регистрация: 06.01.2024
Сообщений: 383
02.02.2024, 14:24  [ТС]
Для пары сотен элементов сортировка прокатит, а для пары тысяч уже не столь эффективно, а дальше - сложнее.
Pascal
1
2
3
4
5
##
var a:=ArrRandom(100, -10000, 10000);
var tmp:= a.Order; //a.Sorted
var max3:=tmp.TakeLast(3).reverse.println;
var min5:=tmp.Take(5).println;
Пока всё же рассматриваю
1) Отсортированный по ходу заполнения словарь со счётчиком, чтобы набрать экстремумы.
2) На Хабре нашёл статью по теме, чтобы обмозговать отрицательные значения.
0
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
02.02.2024, 15:31
Цитата Сообщение от ANT0NY Посмотреть сообщение
Для пары сотен элементов сортировка прокатит, а для пары тысяч уже не столь эффективно, а дальше - сложнее.
А попробовать не пытались? Для миллиона элементов 0.21 с - это "не столь эффективно" и "сложнее"?
Pascal
1
2
3
4
5
6
7
8
9
10
11
##
var a := ArrRandom(1_000_000, -10_000, 10_000);
var sw := new StopWatch;
sw.Start;
 
var b := a.Sorted.Distinct.ToArray;
var r := b[:5] + b[^3:];
 
sw.Stop;
PrintLn(r);
PrintLn(sw.Elapsed);
Code
1
2
[-10000,-9999,-9998,-9997,-9996,9998,9999,10000]
00:00:00.2166247
 Комментарий модератора 
Вы, регистрируясь на форуме, пообещали следовать его правилам.
Дабы помочь в исполнении этого обещания, обращаю внимание, что правилами запрещается публикация текста в виде картинок.

Добавлено текстовое представление.

Ссылка на правила приложена, изучаем, впредь держим свое обещание.
Правила форума: https://www.cyberforum.ru/announcement.php?a=3
Миниатюры
Три максимума и пять минимумов  
1
 Аватар для ANT0NY
104 / 50 / 9
Регистрация: 06.01.2024
Сообщений: 383
02.02.2024, 17:01  [ТС]
И такое имеет место быть. Кстати, наглядное форматирование целых, не знал.

Через System.Diagnostics глянул, что пиковая нагрузка на процессор незначительна, а вот по памяти - более 4 гигабайтов.

Надо бы для чистоты эксперимента оставить 1, 2 или 3 гигабайта свободной памяти, чтобы оценить производительность со сбросом в файл подкачки.
0
 Аватар для agvego5
45 / 37 / 9
Регистрация: 18.09.2023
Сообщений: 254
02.02.2024, 18:56
Цитата Сообщение от ANT0NY Посмотреть сообщение
На Хабре нашёл статью по теме, .
Незачем придумывать велосипед, который ещё надо реализовывать и тестировать.
всё уже придумано для нас - бери и пользуйся.

В большинстве случаев задачу стоит решать сортировкой = сортировка есть в любом языке.
максимум с одной стороны, минимум с другой. Бери сколько надо. ничего изобретать не требуется.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
02.02.2024, 19:46
Цитата Сообщение от Alvico Посмотреть сообщение
это "не столь эффективно"
В этом конкретном случае:
- по процессору на 2 десятичных порядка хуже чем 1 проход по источнику с поддержанием сортировки в 8-элементном массиве,
- по памяти минимум в 2 раза хуже.
1
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
03.02.2024, 02:11
Цитата Сообщение от ANT0NY Посмотреть сообщение
Надо бы для чистоты эксперимента оставить 1, 2 или 3 гигабайта свободной памяти, чтобы оценить производительность со сбросом в файл подкачки.
Ну разве только если Вам не задачу решить нужно, а потроллить сообщество, пытаясь вернуть решение задачи во времена, когда восемь мегабайт оперативной памяти стоили дороже "Жигулей" и занимали объем в пару кубометров. Сейчас, когда операционная система легко сжирает несколько гигабайт оперативной памяти (у меня в данную минуту примерно 14 Гб), рассуждать о лишней паре гигабайт нелепо. Вы видели вживую планку памяти на 16 Гб, например? И искать часами (сутками, неделями...) какие-то "оптимальные" алгоритмы сегодня, когда 16 Гб памяти стоят примерно столько, сколько организация тратит на оплату нескольких часов работы программиста - это расточительство.
0
 Аватар для ANT0NY
104 / 50 / 9
Регистрация: 06.01.2024
Сообщений: 383
05.02.2024, 12:45  [ТС]
Alvico,

Не по теме:

всё верно - для лабораторных работ и экспериментов можно и так, даже учителя и проверяющие рекомендуют игнорировать ошибки, чтобы не отвлекаться от решения. А вот для актуального ПО, модулей и портирования обязательно нагрузочное тестирование. Например, на офисном ноуте из 16 гигабайт постоянно занято около трёх, хотя несколько раз были задачи, где понадобился файл подкачки. Поставили ещё планку на 16 и угадайте что?
Кроме того, платформа .NET весьма экспоненциально выделяет память, не говоря о сборщике и технологии сжатия памяти в Windows 10+ и подобных комбинациях.

0
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
05.02.2024, 13:35
Цитата Сообщение от ANT0NY Посмотреть сообщение
А вот для актуального ПО, модулей и портирования
Я понимаю, что Вы всячески будете отстаивать свою позицию - Ваше право. Может быть даже кому-то не повезет работать под Вашим руководством - мне их откровенно жаль. За свои более чем полвека программистской жизни я видел всяких людей, занимавшихся программированием. Был свидетелем, как в жестокие времена хозрасчета коллективы безжалостно избавлялись от перфекционистов, мешающих выполнять работы в срок и создавать легко читаемый и модифицируемый код, простой в сопровождении. Именно в те годы я понял почему промышленному программированию не по пути с "олимпиадниками" и другими "прима-балеринами", привыкшими писать немодифицируемый дерьмокод или наоборот, создавать витиеватые решения, неочевидные коллективу. Когда внезапно заболевший "гений" был причиной срыва сроков проекта с последующим депремированием всех, потому что его код никто не мог толком понять. Возможно, Вы работаете в области, где нужны уникальные алгоритмы и требуется в 4 килобайта впихнуть код по обращению матрицы 100х100, но мне это уже давно не интересно.
0
 Аватар для ANT0NY
104 / 50 / 9
Регистрация: 06.01.2024
Сообщений: 383
06.02.2024, 14:31  [ТС]
Буду рад, если кому-то известны идеи, которые игнорируют хранение срединных (ненужных) значений, а выбирают требуемое количество экстремумов.

Alvico,
Кликните здесь для просмотра всего текста
так как модераторы не посчитали ваш ответ переходом на личности (попытка обесценить Человека, а не обоснованная критика его идей или работы), тоже воздержусь от неидеальных соболезнований. Хорошо?

Хотя в данном случае решение «в лоб» вроде приемлемо, подозреваю, что аналогичный подход применил бывший кодер для преобразования баз бухгалтерии за счёт более 30 гигабайт оперативки и постоянным повтором
C#
1
2
GC.Collect();
GC.WaitForPendingFinalizers();
Кому как, а я предпочитаю узнавать, разбирать и сравнивать хотя бы для общего развития.
0
Модератор
10373 / 5661 / 3398
Регистрация: 17.08.2012
Сообщений: 17,298
06.02.2024, 22:17
Цитата Сообщение от ANT0NY Посмотреть сообщение
если кому-то известны идеи, которые игнорируют хранение срединных (ненужных) значений
bormant'у известны. О чём он и намекнул в сообщении #7.

Наверное, можно как-то оптимальнее, но как идея сойдёт:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
##
  var a := ArrRandom(1000000, -10000, 10000);
  var sw := new StopWatch;
  sw.Start;
 
  var b := |a[0]|;
  var k := 1;
  repeat
    if b.FindIndex(x -> x = a[k]) < 0 then b := b + |a[k]|;
    inc(k)
  until length(b) = 5;
  var c := b[:3];
  for var i := k to High(a) do
    if (b.FindIndex(x -> x = a[i]) < 0) and (b[b.IndexMax] > a[i]) then b[b.IndexMax] := a[i]
    else
      if (c.FindIndex(x -> x = a[i]) < 0) and (c[c.IndexMin] < a[i]) then c[c.Indexmin] := a[i];
  var r := (b + c).Sorted;
 
  sw.Stop;
  Println(r);
  Println(sw.Elapsed)
Сравнение времени выполнения на моём компьютере:

Программа Alvico:
Окно вывода[-10000,-9999,-9998,-9997,-9996,9998,9999,10000]
00:00:00.7180884


Моя программа:
Окно вывода[-10000,-9999,-9998,-9997,-9996,9998,9999,10000]
00:00:00.5572453
0
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
06.02.2024, 23:53
21 строка вместо четырех - и все для того, чтобы на миллионе значений выгадать 0.16с )))
0
Модератор
10373 / 5661 / 3398
Регистрация: 17.08.2012
Сообщений: 17,298
07.02.2024, 01:26
Какая разница, сколько строк. Сами же сказали: незачем память жалеть. Ваша программа лаконичнее, чем моя, но моя быстрее. 12 строк вместо 2? А почему бы и нет?
0
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
07.02.2024, 13:25
Главное из того, что я хотел сказать, похоже, выпало. Речь была о том, что час работы программиста дороже 16 Гб оперативки. Поэтому если программа написана за пару минут и, потратив достаточное время, за которое программист может сделать (и должен по мнению его начальника) еще что-то полезное для проекта сделать, ее улучшат на несколько процентов пр скорости, оно того не стоит. Так уж устроен нынешний мир, где сплошная коммерция...

Часовщик. Мне приказали там работать, я пошел и взялся за работу, которую никто не мог сделать. Мне попался поразительный экземпляр английских часов. Это настоящий Нортон. Им не меньше трехсот лет. Их сделал мастер своими руками… еще до изобретения железных дорог. Я работал месяц и сделал. За это мне устроили общее собрание и сказали, что я даром ем хлеб. А я в ответ имел неосторожность привести им басню Эзопа.

Ленин. Эзопа? Что же вы им сказали из Эзопа?

Часовщик. Я сказал им о той лисице, которая упрекала львицу за то, что несчастная львица рождает одного детеныша. А львица ей на это отвечала: «Зато я рождаю льва». Эзоп говорит — дело не в количестве, а в качестве.

Ленин. А что же они вам на это сказали?

Часовщик. Председатель собрания сказал, что Эзоп контрреволюционер и агент Антанты, а я являюсь агентом Эзопа. И меня выгнали оттуда.

(Н.Погодин. "Кремлёвские куранты")
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
07.02.2024, 14:35
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
bormant'у известны. О чём он и намекнул в сообщении #7.
Может, что-нибудь вроде этого(извините, на древнепаскальском)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TestMinMax;
type
  THelper = specialize TGOrdinalArrayHelper<Integer>;
 
var
  MinList: array of Integer = nil;
  MaxList: array of Integer = nil;
  MinHi: Integer = -1;
  MaxHi: Integer = -1;
 
  procedure AddMin(Value: Integer); inline;
  var
    I: Integer;
  begin
    if Value < MinList[MinHi] then
      for I := 0 to MinHi do
        if Value <= MinList[I] then begin
          MinList[I] := Value; break;
        end;
  end;
 
  procedure AddMax(Value: Integer); inline;
  var
    I: Integer;
  begin
    if Value > MaxList[0] then
      for I := MaxHi downto 0 do
        if Value >= MaxList[I] then begin
          MaxList[I] := Value; break;
        end;
  end;
 
var
  Data, r: array of Integer;
  I: Integer;
  Timer: TStopWatch;
const
  RangeLo  = -10000;
  RangeHi  = 10000;
  DataSize = 1000000;
  MaxCount = 3;
  MinCount = 5;
begin
  Data := THelper.CreateRandomInRange(DataSize, RangeLo, RangeHi);
  Timer := TStopWatch.StartNew;
  MinList := Copy(Data, 0, MinCount);
  MaxList := Copy(Data, 0, MaxCount);
  THelper.Sort(MinList);
  THelper.Sort(MaxList);
  MinHi := High(MinList);
  MaxHi := High(MaxList);
  for I := Succ(Min(MaxCount, MinCount)) to High(Data) do begin
    AddMin(Data[I]);
    AddMax(Data[I]);
  end;
  r := MinList + MaxList;
  Timer.Stop;
  WriteLn(Stringify(TypeInfo(r), r));
  WriteLn(Timer.ElapsedMilliseconds.ToString);
end;
печатает
Code
1
2
[-10000, -9999, -9998, -9997, -9996, 9998, 9999, 10000]
1,4619
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
07.02.2024, 15:56
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
намекнул в сообщении #7
Да чего там намекать-то, тривиальщина же:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const mnSize=5; mxSize=3;
var
  mn: array [0..mnSize-1] of Integer;
  mx: array [0..mxSize-1] of Integer;
  mnCnt, mxCnt: Integer;
 
begin
  var a := ArrRandom(1_000_000, -10_000, 10_000);
  // First
  var sw1:=new StopWatch; sw1.Start;
  var b := a.Sorted.Distinct.ToArray;
  var r := b[:5] + b[^3:];
  sw1.Stop; PrintLn(r, sw1.Elapsed);
  
  // Second
  var sw2:=new StopWatch; sw2.Start;
  for var k:=0 to Length(a)-1 do begin
    var i: Integer;
    var t:=a[k];
    i:=mnCnt; while (i>0) and (mn[i-1]>t) do Dec(i);
    if i<mnSize then if (i=0) or (mn[i-1]<>t) then begin
      Inc(mnCnt,Ord(mnCnt<mnSize));
      for var j:=mnCnt-1 downto i+1 do mn[j]:=mn[j-1]; mn[i]:=t;
    end;
    i:=mxCnt; while (i>0) and (mx[i-1]<t) do Dec(i);
    if i<mxSize then if (i=0) or (mx[i-1]<>t) then begin
      Inc(mxCnt,Ord(mxCnt<mxSize));
      for var j:=mxCnt-1 downto i+1 do mx[j]:=mx[j-1]; mx[i]:=t;
    end;
  end;
  sw2.Stop; PrintLn(mn, mx, sw2.Elapsed);
end.
Code
1
2
[-10000,-9999,-9998,-9997,-9996,9998,9999,10000] 00:00:00.4205455 
[-10000,-9999,-9998,-9997,-9996] [10000,9999,9998] 00:00:00.0072518
Добавлено через 2 минуты
Универсальный короткий код оказался всего-то в 58 раз медленнее...
0
100 / 74 / 21
Регистрация: 12.04.2017
Сообщений: 269
07.02.2024, 20:02
Цитата Сообщение от bormant Посмотреть сообщение
Универсальный короткий код оказался всего-то в 58 раз медленнее...
Да, только появился он на пять(!) дней раньше и был написан за несколько минут. И заработал без единой отладки. Я больше ничего не буду писать в этой теме, потому что смысла не вижу: для меня очевидно, что В ДАННОЙ СИТУАЦИИ короткий код выгоднее во всех отношениях. У кого другое мнение - да ради бога!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
07.02.2024, 22:51
Alvico,
он появился через 5 минут после того, как я увидел # 12, 14, 16 и сильно удивился тому, что опубликованное сильно медленнее того, что было написано вместе с # 7 (но не опубликовано и после примерки скорострельности выкинуто как и прочая тривиальщина)

Добавлено через 3 минуты
Опубликовано в том числе и для того, что бы кто-то мог сказать, что у него разрыв меньше/больше/наоборот и прочия аномалии
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2024, 22:51
Помогаю со студенческими работами здесь

Задача «Три и пять»
Задача «Три и пять» Саша любит цифры 3 и 5. Он взял старую книгу по математике, выписал оттуда одну строчку и решил заменить все цифры...

Ребус: два + три = пять
Решить ребус ДВА + ТРИ = ПЯТЬ при условии, что сумма цифр в числе ПЯТЬ будет минимальной REM REM ДВА + ТРИ = ПЯТЬ REM REM ...

Три значения вписать в файл справа от его максимума
Сформировать файл , компонентами которого являются действительные числа. Найти и распечатать сумму компонент файла, произведение...

Вывести элементы, которые делятся на три, пять и десять
Создайте массив размером 100 элементов, заполните массив случайными целыми числами (используйте функцию rand()). Выведите на экран...

Разработать программу, позволяющую при вводе '352', выводить - 'три пять два'
Разработать программу, позволяющее при вводе '352', выводить - 'три пять два.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru