OberonCore
https://forum.oberoncore.ru/

ЦД для подсчёта количества повторяющихся элементов
https://forum.oberoncore.ru/viewtopic.php?f=82&t=4027
Страница 2 из 2

Автор:  albobin [ Пятница, 20 Июль, 2012 12:59 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Илья Ермаков писал(а):
Ну да, это получается, по сути, оптимизированная запись ЦД (упаковка двух циклов в один с "щёлкающими" ветками остаётся).

Я имел ввиду исходный ЦД-код, не совсем пойму , а зачем тут говорить о двух циклах?
Цикл один - последовательно "двигаем" правую границу окна одинаковых элементов до конца и в нужных местах "подтягиваем" левую.

Автор:  Илья Ермаков [ Пятница, 20 Июль, 2012 13:48 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Я имею виду в сравнении с напрашивающимся интуитивно построением вложенного цикла....

Придумать Ваш цикл можно таким же образом мыслей, как ЦД. Только надёжнее начать таки с чистого ЦД...

Автор:  Madzi [ Пятница, 20 Июль, 2012 14:44 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Зачем тут вложенный цикл?
Зачем тут цикл Дейкстры?

Задачка элементарная однопроходная:
Код:
    was := pass[0];  count := 1;
    FOR i := 1 TO total - 1 DO
        IF was # pass[i] THEN  stat[was] := count;  was := pass[i];  count := 1;
        ELSE INC(count);
        END;
    END;


pass - массив с номерами паспортов (pass[Индекс] = номер паспорта),
stat - массив со статистикой (stat[НомерПаспорта] = сколько раз сдавал экзамен)

Автор:  albobin [ Пятница, 20 Июль, 2012 14:46 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Илья Ермаков писал(а):
Я имею виду в сравнении с напрашивающимся интуитивно построением вложенного цикла....

Придумать Ваш цикл можно таким же образом мыслей, как ЦД. Только надёжнее начать таки с чистого ЦД...

Моего здесь ничего нет - я перефразировал Ваш исходный цикл. А сам я привык несколько к другими способам реализации подобных задач.
Вот на МАМПСе как то так:
Код:
 ;пусть в неком массиве pasp[i] (i от 1 до len)  несортированные номера паспортов
 ;определим к-во вхождений каждого номера
 N cnt,i
 F i=1:1:len  S cnt(pasp(i))=$g(cnt(pasp(i)))+1
 ;подсчитаем статистику
 N p  S p=""
 F  S p=$o(cnt(p))  Q:p=""  S stat(cnt(p))=$g(stat(cnt(p)))+1
 

PS.
Ляп небрежности в коде исправлен. :)

Автор:  Info21 [ Пятница, 20 Июль, 2012 14:48 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Неплохое упражнение. Притом из реальной жизни.

Программиста -- пороть.

Автор:  Илья Ермаков [ Пятница, 20 Июль, 2012 14:56 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Madzi писал(а):
Задачка элементарная однопроходная:


Это эквивалентно
viewtopic.php?p=73513#p73513 в другой системе переменных (не i, j, а i, count).
Т.е. это тоже оптимизированный ЦД.

Вернее строить неоптимизированный, а потом уже посмотреть, про что и разговор.

Автор:  Alexey_Donskoy [ Пятница, 20 Июль, 2012 15:53 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Madzi писал(а):
stat - массив со статистикой (stat[НомерПаспорта] = сколько раз сдавал экзамен)
Уловие задачи другое :)

Автор:  Madzi [ Пятница, 20 Июль, 2012 16:00 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Alexey_Donskoy писал(а):
Madzi писал(а):
stat - массив со статистикой (stat[НомерПаспорта] = сколько раз сдавал экзамен)
Уловие задачи другое :)

Не принципиально. Сути это не меняет. Однопроходная задача где ЦД - ненужное усложнение.
Код:
    was := pass[0];  count := 1;
    FOR i := 1 TO total - 1 DO
        IF was # pass[i] THEN  INC(stat[count]);  was := pass[i];  count := 1;
        ELSE INC(count);
        END;
    END;

поменялся всего 1 оператор.
stat[i] - число людей, сдававших i экзаменов.

Автор:  Илья Ермаков [ Пятница, 20 Июль, 2012 16:30 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Я, "распробовав" ЦД, теперь воспринимаю его как общую, наиболее регулярную форму цикла, с которой удобно работать при построении - и по которой потом можно выполнить любые целесообразные "свёртки".
С ЦД стоит начинать построение, если задача требует вложенных циклов или цикла с вложенным IF, где внутри IF идёт манипулирование переменными цикла.

Автор:  Madzi [ Пятница, 20 Июль, 2012 16:40 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Илья Ермаков писал(а):
Я, "распробовав" ЦД, теперь воспринимаю его как общую, наиболее регулярную форму цикла, с которой удобно работать при построении - и по которой потом можно выполнить любые целесообразные "свёртки".
С ЦД стоит начинать построение, если задача требует вложенных циклов или цикла с вложенным IF, где внутри IF идёт манипулирование переменными цикла.

Согласен. Однако в данном случае манипулирования переменными цикла (i) не происходит, так как стоит элементарная задача подсчёта числа вхождений элемента (плюс ещё и в отсортированном массиве). Я к тому что не нужно всегда искать чёрную кошку в тёмной комнате. Иногда её там не бывает.

Автор:  Info21 [ Пятница, 20 Июль, 2012 19:32 ]
Заголовок сообщения:  Re: ЦД для подсчёта количества повторяющихся элементов

Madzi писал(а):
не нужно всегда искать чёрную кошку в тёмной комнате. Иногда её там не бывает.
Но упражнение (как учебное упражнение) все равно полезное в силу полной обозримости.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/