Особенности построения корректных программ с использованием метода вычисления индуктивных функций::Журнал СА 9.2014
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

 Читать далее...

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6225
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6931
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4213
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3006
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3806
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3819
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6315
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3168
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3459
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7276
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10645
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12364
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13998
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9123
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7077
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5387
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4615
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3426
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3154
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3399
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3024
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 Особенности построения корректных программ с использованием метода вычисления индуктивных функций

Архив номеров / 2014 / Выпуск №9 (142) / Особенности построения корректных программ с использованием метода вычисления индуктивных функций

Рубрика: Наука и технологии

No foto ТКАЧЕНКО К. С., инженер 1-й категории, аспирант, Севастопольский национальный технический университет, tkachenkokirillstanislavovich@mail.ru

Особенности построения корректных программ
с использованием метода вычисления индуктивных функций

Рассматриваются возможности метода построения алгоритмов с использованием индуктивного вычисления функций на пространстве последовательностей применительно к последующей реализации на языке Java. Данная статья не является оригинальным исследованием; лучше истолковывать ее как краткое методическое указание, а автора, соответственно, составителем

В настоящее время большое значение придается проверке корректности программного обеспечения (ПО), а также изначально верных алгоритмов проектирования и разработки. Для этих целей имеется значительное количество методов тестирования ПО и его формальной верификации.

При этом в открытой печати, современных учебных пособиях, информационно-новостных сайтах, коллективных и личных блогах, посвященных информационным технологиям, программированию, информатике и вычислительной технике, относительно редко встречаются упоминания о методе вычисления индуктивных функций.

Метод позволяет получать единственно возможные минимальные по потребляемой памяти однопроходные алгоритмы решения задач определенного класса. При этом программы, реализующие эти алгоритмы, могут иметь достаточно простую структуру, возможно решение при использовании потоковой обработки данных и в микропроцессорных системах. Данная публикация призвана заполнить существующий информационный пробел.

В учебном пособии для вузов [1] содержится большое количество теоретического материала по данной тематике и некоторые примеры решения задач методом.

Методический комплекс [2] содержит примеры использования метода на языке программирования Perl. При этом некоторые задачи на применение обозначенного метода, в том числе и из [1], не решены на кроссплатформенных, структурных, императивных языках программирования высокого уровня.

Целью данной работы является подробное описательное решение некоторых задач средней сложности обозначенным методом с приведением готовых программ на языке Java без использования сторонних библиотек. Это позволит заинтересованным программистам начать использовать метод сразу, «по аналогии», в том числе и на других императивных языках программирования высокого уровня.

Обозначения и краткие теоретические сведения

Как и в [1], используются обозначения:

  • X – произвольный алфавит;
  • Ω(X) = {x1 x2 ... xn|n ∈ Z+, xi ∈ X, i = 1,n} – пространство всех конечных последовательностей над X;
  • ∆ ∈ Ω – Ω(X) при n = 0;
  • Ωk(X) – Ω(X) при n ≥ 0;
  • * – операция дописывания элемента в конец последовательности.

И, наконец, функция F : Q → Y называется индуктивной, если F(ω * x) можно вычислить, зная F(ω) и x.

Для любой индуктивной функции на пространстве последовательностей существует минимальный по памяти однопроходный алгоритм. Чаще всего для некоторой последовательности Ω этот алгоритм будет выглядеть следующим образом:

f1 := F(x1), x1 ∈ Ω;

for each xi ∈ Ω, i ∈ 2,|Ω| do f1 := F(fi-1, xi)

Очевидно, что если функция является индуктивной, то на конечной последовательности возможно реализовать ее вычисление. При этом программа будет корректной с точностью до мутаций исходного кода.

В качестве примеров излагается решение двух задач из [1] с последующей реализацией на языке Java.

Задача 1. Найти минимальное и максимальное значения последовательности

Формализация задачи:

f = «минимальное и максимальное значения»,

f : Ω1(R) → M ∈ R2, M = {(x1, x2)|x1 ≤ x2}.

Аналитическое решение:

Пусть здесь и далее f (ω)i – значение i-ой компоненты результата. При этом хранение f (ω)i возможно реализовать и без массива и/или иной структуры данных, в виде совокупности переменных.

Начальная инициализация:

Формула 1 (1)

Основной цикл:

Формула 2 (2)

Программа, выполняющая вычисления по формулам (1)-(2), приводится в листинге 1. Первую строку условий в (2) можно не реализовывать. Для удобства демонстрации и отладки входная последовательность представлена в виде массива внутри кода, вывод осуществляется на стандартное устройство вывода.

Значения массива получены с использованием генератора псевдослучайной последовательности, нормальное распределение, µ = 10,0; σ2 = 5,0.

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

Листинг 1. Программа решения задачи 1

public class Main {

public static void main(String[] args) {

double[] o = { 8.1580e+0, 8.5010e+0, 1.7370e+1, 7.7220e+0, 1.3190e+1, 9.0350e+0, 1.1660e+1, 1.0920e+1, 6.4290e+0, 1.4050e+1, 1.3000e+1, 4.8380e+0, 9.8400e+0, 1.9450e+1, 9.8130e+0, 1.0770e+1, 5.2450e+0, 7.9320e+0, 1.0850e+1, 1.1060e+1, 8.8590e+0, 1.6640e+1, 1.7500e+0, 1.5080e+0, 2.1370e+1, 8.9400e+0, 8.8250e+0, 1.0410e+1, 7.6320e+0, 2.3720e+0, 1.2780e+1, 1.3780e+1, -1.1430e+0, 1.0470e+1, 8.7490e+0, 7.5710e+0, 1.7070e+1, 6.7480e+0, 1.0260e+1, 7.5710e+0, 8.6910e+0, 1.7790e+1, 1.4550e+1, 8.7880e+0, 1.7080e+1, 6.8140e+0, 8.1570e+0, 7.2240e+0, 9.9540e+0, -5.6870e-1 };

double fo1, fo2;

if (o[0] <= o[1]) {

fo1 = o[0];

fo2 = o[1];

} else {

fo1 = o[1];

fo2 = o[0];

}

for (int i = 2; i < o.length; i++) {

double x = o[i];

if (fo1 <= fo2 && fo2 <= x) {

fo2 = x;

} else if (x <= fo1 && fo1 <= fo2) {

fo1 = x;

}

}

System.out.println(String.format("%.4f\t%.4f", fo1, fo2));

}

}

Результат выполнения программы из листинга 1:

-1,1430 21,3700

Задача 2. Найти три наибольших значения последовательности

Формализация задачи:

f = «минимальное и максимальное значения»,

f : Ω1(R) → M ∈ R2, M = {(x1, x2)|x1 ≤ x2}.

Аналитическое решение:

Пусть здесь и далее f (ω)i – значение i-ой компоненты результата. При этом хранение f (ω)i возможно реализовать и без массива и/или иной структуры данных, в виде совокупности переменных.

Начальная инициализация:

Формула 3 (3)

Основной цикл:

Формула 2 (4)

Вычисления по (3) можно реализовать и иным способом, более эффективно. Программа, выполняющая вычисления по формулам (3)-(4), приводится в листинге 2. Последнюю строку условий в (4) можно не реализовывать. Организация входных и выходных значений – как и в программе из листинга 1.

Листинг 2. Программа решения задачи 2

public class Main {

public static void main(String[] args) {

double[] o = { 8.1580e+0, 8.5010e+0, 1.7370e+1, 7.7220e+0, 1.3190e+1, 9.0350e+0, 1.1660e+1, 1.0920e+1, 6.4290e+0, 1.4050e+1, 1.3000e+1, 4.8380e+0, 9.8400e+0, 1.9450e+1, 9.8130e+0, 1.0770e+1, 5.2450e+0, 7.9320e+0, 1.0850e+1, 1.1060e+1, 8.8590e+0, 1.6640e+1, 1.7500e+0, 1.5080e+0, 2.1370e+1, 8.9400e+0, 8.8250e+0, 1.0410e+1, 7.6320e+0, 2.3720e+0, 1.2780e+1, 1.3780e+1, -1.1430e+0, 1.0470e+1, 8.7490e+0, 7.5710e+0, 1.7070e+1, 6.7480e+0, 1.0260e+1, 7.5710e+0, 8.6910e+0, 1.7790e+1, 1.4550e+1, 8.7880e+0, 1.7080e+1, 6.8140e+0, 8.1570e+0, 7.2240e+0, 9.9540e+0, -5.6870e-1 };

double fo1, fo2, fo3;

if (o[0] <= o[1] && o[1] <= o[2]) {

fo1 = o[0];

fo2 = o[1];

fo3 = o[2];

} else if (o[0] <= o[2] && o[2] <= o[1]) {

fo1 = o[0];

fo2 = o[2];

fo3 = o[1];

} else if (o[1] <= o[0] && o[0] <= o[2]) {

fo1 = o[1];

fo2 = o[0];

fo3 = o[2];

} else if (o[1] <= o[2] && o[2] <= o[0]) {

fo1 = o[1];

fo2 = o[2];

fo3 = o[0];

} else if (o[2] <= o[0] && o[0] <= o[1]) {

fo1 = o[2];

fo2 = o[0];

fo3 = o[1];

} else {

fo1 = o[2];

fo2 = o[1];

fo3 = o[0];

}

for (int i = 3; i < o.length; i++) {

double x = o[i];

if (fo1 <= x && x <= fo2) {

fo1 = x;

} else if (fo2 <= x && x <= fo3) {

fo1 = fo2;

fo2 = x;

} else if (fo3 <= x) {

fo1 = fo2;

fo2 = fo3;

fo3 = x;

}

}

System.out.println(String.format("%.4f\t%.4f\t%.4f", fo1, fo2, fo3));

}

}

Результат выполнения программы из листинга 2:

17,7900 19,4500 21,3700

Видно, что решения задач 1, 2 однопроходные, потребляют сравнительно мало памяти, не требуют организации сортировки и вызова каких-либо библиотечных методов. Читатели могут самостоятельно решить эти две задачи, не используя вычисление индуктивных функций и стандартные библиотеки применяемых языков, и убедиться в громоздкости и сложности получаемых решений. Кроме того, в качестве «домашнего задания» можно предложить реализовать сравнения в программе из листинга 2 более экономно.

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

  1. Кушниренко А.Г. Программирование для математиков: Учеб. пособие для вузов/ А.Г. Кушниренко, Г.В. Лебедев. – М.: Наука, 1988. – 384 с.
  2. Щвец А.Н. Perl. Примеры программ [Электронный ресурс] /А.Н. Щвец. – Режим доступа: http://mech.math.msu.su/~shvetz/54/inf/perl-problems, свободный. – Загл. с экрана.

Ключевые слова: индуктивные функции, обработка последовательностей, языки высокого уровня.


Features for correct programs development with the using of the inductive functions calculations method

К.S. Tkachenko, 1st cat. Engineer, graduate student, Sevastopol National Technical University, tkachenkokirillstanislavovich@mail.ru

Annotation. This article describes the possibilities of the method of constructing algorithms using inductive functions computing on the space of sequences applied to the subsequent implementation in Java. This article is not original research; better interpret it as short guideline, and the author, accodingly, as the compiler.

Кеуwords: inductive functions; processing of sequences; high-level languages.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru