<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zerika</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zerika"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Zerika"/>
	<updated>2026-10-22T15:38:18Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30332</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30332"/>
		<updated>2025-12-09T21:11:13Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.4 Выводы для классов архитектур */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
    def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
Для всех запусков седловая точка не была найдена (No saddle point found). Значения времени усреднены по трём прогонам. Время показано в секундах.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Размер матрицы !! 1 процесс !! 2 процесса !! 4 процесса !! 8 процессов !! 16 процессов !! 32 процесса !! 64 процесса&lt;br /&gt;
|-&lt;br /&gt;
|1000x1000	||	0.000358	||	0.000233	||	0.000156		||0.000079	||	0.000064	||	0.000038	||	0.000015&lt;br /&gt;
|-&lt;br /&gt;
|2000x2000	||	0.001373	||	0.000926	||	0.000701	||	0.000536	||	0.000273	||	0.000090	||	0.000042&lt;br /&gt;
|-&lt;br /&gt;
|3000x3000	||	0.003451	||	0.002439	||	0.001691	||	0.001200	||	0.000617	||	0.000166	||	0.000085&lt;br /&gt;
|-&lt;br /&gt;
|4000x4000	||	0.007259	||	0.003992	||	0.002923	||	0.001972	||	0.001029	||	0.000298	||	0.000135&lt;br /&gt;
|-&lt;br /&gt;
|5000x5000	||	0.011327	||	0.006031	||	0.004380	||	0.002532	||	0.001452	||	0.000439	||	0.000236&lt;br /&gt;
|-&lt;br /&gt;
|6000x6000	||	0.016217	||	0.008659	||	0.007147	||	0.003346	||	0.002009	||	0.000606	||	0.000326&lt;br /&gt;
|-&lt;br /&gt;
|7000x7000	||	0.022054	||	0.011617	||	0.008796	||	0.004212	||	0.002220	||	0.000914	||	0.000399&lt;br /&gt;
|-&lt;br /&gt;
|8000x8000	||	0.028572	||	0.015224	||	0.009939	||	0.005330	||	0.002697	||	0.001254	||	0.000534&lt;br /&gt;
|-&lt;br /&gt;
|9000x9000	||	0.035642	||	0.019085	||	0.012258	||	0.006447	||	0.003769	||	0.001428	||	0.000769&lt;br /&gt;
|-&lt;br /&gt;
|10000x10000	||	0.043867	||	0.023461	||	0.012777	||	0.007889	||	0.004756	||	0.002258	||	0.000792&lt;br /&gt;
|-&lt;br /&gt;
|11000x11000	||	0.052932	||	0.028309	||	0.018155	||	0.009360	||	0.005155	||	0.002243	||	0.001000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
&#039;&#039;&#039;Сильные стороны для данного алгоритма:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* Высокая эффективность для больших матриц  &lt;br /&gt;
&lt;br /&gt;
* Минимальные накладные расходы на передачу данных (матрица в общей памяти) &lt;br /&gt;
&lt;br /&gt;
* Простота реализации &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ограничения:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Масштабируемость ограничена пропускной способностью памяти&lt;br /&gt;
&lt;br /&gt;
* Эффективность падает для маленьких задач (37.3% для 1000×1000 на 64 ядрах)&lt;br /&gt;
&lt;br /&gt;
* Конкуренция за доступ к памяти при проверке столбцов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рекомендации:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Использовать для матриц размером ≥5000×5000&lt;br /&gt;
&lt;br /&gt;
=== 2.5 Код на MPI ===&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    typedef struct {&lt;br /&gt;
    int row;&lt;br /&gt;
    int col;&lt;br /&gt;
    } SaddlePoint;&lt;br /&gt;
&lt;br /&gt;
    int main(int argc, char* argv[])&lt;br /&gt;
    {&lt;br /&gt;
    int rank, size;&lt;br /&gt;
    int m, n;&lt;br /&gt;
    int i, j;&lt;br /&gt;
&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;rank);&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    if (argc != 3) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Usage: %s &amp;lt;rows&amp;gt; &amp;lt;cols&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    m = atoi(argv[1]);&lt;br /&gt;
    n = atoi(argv[2]);&lt;br /&gt;
&lt;br /&gt;
    if (m &amp;lt;= 0 || n &amp;lt;= 0) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Matrix dimensions must be positive.\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс выделяет память под всю матрицу */&lt;br /&gt;
    int* A = (int*)malloc(m * n * sizeof(int));&lt;br /&gt;
    if (A == NULL) {&lt;br /&gt;
        if (rank == 0) fprintf(stderr, &amp;quot;Memory allocation failed.\n&amp;quot;);&lt;br /&gt;
        MPI_Abort(MPI_COMM_WORLD, 1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Процесс 0 генерирует матрицу */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        srand((unsigned int)time(NULL));&lt;br /&gt;
        for (i = 0; i &amp;lt; m; i++) {&lt;br /&gt;
            for (j = 0; j &amp;lt; n; j++) {&lt;br /&gt;
                A[i * n + j] = rand() % 1000;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Рассылаем всю матрицу всем процессам */&lt;br /&gt;
    MPI_Bcast(A, m * n, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    /* === НАЧАЛО ЗАМЕРА ВРЕМЕНИ === */&lt;br /&gt;
    MPI_Barrier(MPI_COMM_WORLD);&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс обрабатывает строки: i % size == rank */&lt;br /&gt;
    int max_local = (m + size - 1) / size; /* верхняя оценка числа строк на процесс */&lt;br /&gt;
    SaddlePoint* local_saddles = (SaddlePoint*)malloc(max_local * sizeof(SaddlePoint));&lt;br /&gt;
    int local_count = 0;&lt;br /&gt;
&lt;br /&gt;
    for (i = rank; i &amp;lt; m; i += size) {&lt;br /&gt;
        /* Уровень 1: найти минимум в строке i */&lt;br /&gt;
        int min_val = A[i * n + 0];&lt;br /&gt;
        int min_j = 0;&lt;br /&gt;
        for (j = 1; j &amp;lt; n; j++) {&lt;br /&gt;
            if (A[i * n + j] &amp;lt; min_val) {&lt;br /&gt;
                min_val = A[i * n + j];&lt;br /&gt;
                min_j = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Уровень 2: проверить максимум в столбце min_j */&lt;br /&gt;
        int is_max = 1;&lt;br /&gt;
        for (j = 0; j &amp;lt; m; j++) {&lt;br /&gt;
            if (A[j * n + min_j] &amp;gt; min_val) {&lt;br /&gt;
                is_max = 0;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (is_max) {&lt;br /&gt;
            local_saddles[local_count].row = i;&lt;br /&gt;
            local_saddles[local_count].col = min_j;&lt;br /&gt;
            local_count++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Собрать результаты */&lt;br /&gt;
    int* all_counts = NULL;&lt;br /&gt;
    int total_saddles = 0;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        all_counts = (int*)malloc(size * sizeof(int));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gather(&amp;amp;local_count, 1, MPI_INT, all_counts, 1, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        for (i = 0; i &amp;lt; size; i++) {&lt;br /&gt;
            total_saddles += all_counts[i];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    SaddlePoint* global_saddles = NULL;&lt;br /&gt;
    int* displs = NULL;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        global_saddles = (SaddlePoint*)malloc(total_saddles * sizeof(SaddlePoint));&lt;br /&gt;
        displs = (int*)malloc(size * sizeof(int));&lt;br /&gt;
        displs[0] = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt; size; i++) {&lt;br /&gt;
            displs[i] = displs[i - 1] + all_counts[i - 1];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gatherv(&lt;br /&gt;
        local_saddles, local_count, MPI_BYTE,&lt;br /&gt;
        global_saddles, all_counts, displs, MPI_BYTE,&lt;br /&gt;
        0, MPI_COMM_WORLD&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    /* Вывод */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        FILE* fout = fopen(&amp;quot;result.out&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
        if (fout) {&lt;br /&gt;
            fprintf(fout, &amp;quot;%d %d %.6f\n&amp;quot;, m, size, t2 - t1);&lt;br /&gt;
            fclose(fout);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (total_saddles == 0) {&lt;br /&gt;
            printf(&amp;quot;No saddle point found.\n&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            printf(&amp;quot;Found %d saddle point(s):\n&amp;quot;, total_saddles);&lt;br /&gt;
            for (i = 0; i &amp;lt; total_saddles; i++) {&lt;br /&gt;
                printf(&amp;quot;  (%d, %d)\n&amp;quot;, global_saddles[i].row, global_saddles[i].col);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;Matrix: %dx%d, Processes: %d, Time: %.6f seconds\n&amp;quot;, m, n, size, t2 - t1);&lt;br /&gt;
&lt;br /&gt;
        free(all_counts);&lt;br /&gt;
        free(displs);&lt;br /&gt;
        free(global_saddles);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(local_saddles);&lt;br /&gt;
    free(A);&lt;br /&gt;
    MPI_Finalize();&lt;br /&gt;
    return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30331</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30331"/>
		<updated>2025-12-09T21:06:58Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.5 Код на MPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
    def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
Для всех запусков седловая точка не была найдена (No saddle point found). Значения времени усреднены по трём прогонам. Время показано в секундах.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Размер матрицы !! 1 процесс !! 2 процесса !! 4 процесса !! 8 процессов !! 16 процессов !! 32 процесса !! 64 процесса&lt;br /&gt;
|-&lt;br /&gt;
|1000x1000	||	0.000358	||	0.000233	||	0.000156		||0.000079	||	0.000064	||	0.000038	||	0.000015&lt;br /&gt;
|-&lt;br /&gt;
|2000x2000	||	0.001373	||	0.000926	||	0.000701	||	0.000536	||	0.000273	||	0.000090	||	0.000042&lt;br /&gt;
|-&lt;br /&gt;
|3000x3000	||	0.003451	||	0.002439	||	0.001691	||	0.001200	||	0.000617	||	0.000166	||	0.000085&lt;br /&gt;
|-&lt;br /&gt;
|4000x4000	||	0.007259	||	0.003992	||	0.002923	||	0.001972	||	0.001029	||	0.000298	||	0.000135&lt;br /&gt;
|-&lt;br /&gt;
|5000x5000	||	0.011327	||	0.006031	||	0.004380	||	0.002532	||	0.001452	||	0.000439	||	0.000236&lt;br /&gt;
|-&lt;br /&gt;
|6000x6000	||	0.016217	||	0.008659	||	0.007147	||	0.003346	||	0.002009	||	0.000606	||	0.000326&lt;br /&gt;
|-&lt;br /&gt;
|7000x7000	||	0.022054	||	0.011617	||	0.008796	||	0.004212	||	0.002220	||	0.000914	||	0.000399&lt;br /&gt;
|-&lt;br /&gt;
|8000x8000	||	0.028572	||	0.015224	||	0.009939	||	0.005330	||	0.002697	||	0.001254	||	0.000534&lt;br /&gt;
|-&lt;br /&gt;
|9000x9000	||	0.035642	||	0.019085	||	0.012258	||	0.006447	||	0.003769	||	0.001428	||	0.000769&lt;br /&gt;
|-&lt;br /&gt;
|10000x10000	||	0.043867	||	0.023461	||	0.012777	||	0.007889	||	0.004756	||	0.002258	||	0.000792&lt;br /&gt;
|-&lt;br /&gt;
|11000x11000	||	0.052932	||	0.028309	||	0.018155	||	0.009360	||	0.005155	||	0.002243	||	0.001000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
=== 2.5 Код на MPI ===&lt;br /&gt;
    #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    typedef struct {&lt;br /&gt;
    int row;&lt;br /&gt;
    int col;&lt;br /&gt;
    } SaddlePoint;&lt;br /&gt;
&lt;br /&gt;
    int main(int argc, char* argv[])&lt;br /&gt;
    {&lt;br /&gt;
    int rank, size;&lt;br /&gt;
    int m, n;&lt;br /&gt;
    int i, j;&lt;br /&gt;
&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;rank);&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    if (argc != 3) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Usage: %s &amp;lt;rows&amp;gt; &amp;lt;cols&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    m = atoi(argv[1]);&lt;br /&gt;
    n = atoi(argv[2]);&lt;br /&gt;
&lt;br /&gt;
    if (m &amp;lt;= 0 || n &amp;lt;= 0) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Matrix dimensions must be positive.\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс выделяет память под всю матрицу */&lt;br /&gt;
    int* A = (int*)malloc(m * n * sizeof(int));&lt;br /&gt;
    if (A == NULL) {&lt;br /&gt;
        if (rank == 0) fprintf(stderr, &amp;quot;Memory allocation failed.\n&amp;quot;);&lt;br /&gt;
        MPI_Abort(MPI_COMM_WORLD, 1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Процесс 0 генерирует матрицу */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        srand((unsigned int)time(NULL));&lt;br /&gt;
        for (i = 0; i &amp;lt; m; i++) {&lt;br /&gt;
            for (j = 0; j &amp;lt; n; j++) {&lt;br /&gt;
                A[i * n + j] = rand() % 1000;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Рассылаем всю матрицу всем процессам */&lt;br /&gt;
    MPI_Bcast(A, m * n, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    /* === НАЧАЛО ЗАМЕРА ВРЕМЕНИ === */&lt;br /&gt;
    MPI_Barrier(MPI_COMM_WORLD);&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс обрабатывает строки: i % size == rank */&lt;br /&gt;
    int max_local = (m + size - 1) / size; /* верхняя оценка числа строк на процесс */&lt;br /&gt;
    SaddlePoint* local_saddles = (SaddlePoint*)malloc(max_local * sizeof(SaddlePoint));&lt;br /&gt;
    int local_count = 0;&lt;br /&gt;
&lt;br /&gt;
    for (i = rank; i &amp;lt; m; i += size) {&lt;br /&gt;
        /* Уровень 1: найти минимум в строке i */&lt;br /&gt;
        int min_val = A[i * n + 0];&lt;br /&gt;
        int min_j = 0;&lt;br /&gt;
        for (j = 1; j &amp;lt; n; j++) {&lt;br /&gt;
            if (A[i * n + j] &amp;lt; min_val) {&lt;br /&gt;
                min_val = A[i * n + j];&lt;br /&gt;
                min_j = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Уровень 2: проверить максимум в столбце min_j */&lt;br /&gt;
        int is_max = 1;&lt;br /&gt;
        for (j = 0; j &amp;lt; m; j++) {&lt;br /&gt;
            if (A[j * n + min_j] &amp;gt; min_val) {&lt;br /&gt;
                is_max = 0;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (is_max) {&lt;br /&gt;
            local_saddles[local_count].row = i;&lt;br /&gt;
            local_saddles[local_count].col = min_j;&lt;br /&gt;
            local_count++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Собрать результаты */&lt;br /&gt;
    int* all_counts = NULL;&lt;br /&gt;
    int total_saddles = 0;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        all_counts = (int*)malloc(size * sizeof(int));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gather(&amp;amp;local_count, 1, MPI_INT, all_counts, 1, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        for (i = 0; i &amp;lt; size; i++) {&lt;br /&gt;
            total_saddles += all_counts[i];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    SaddlePoint* global_saddles = NULL;&lt;br /&gt;
    int* displs = NULL;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        global_saddles = (SaddlePoint*)malloc(total_saddles * sizeof(SaddlePoint));&lt;br /&gt;
        displs = (int*)malloc(size * sizeof(int));&lt;br /&gt;
        displs[0] = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt; size; i++) {&lt;br /&gt;
            displs[i] = displs[i - 1] + all_counts[i - 1];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gatherv(&lt;br /&gt;
        local_saddles, local_count, MPI_BYTE,&lt;br /&gt;
        global_saddles, all_counts, displs, MPI_BYTE,&lt;br /&gt;
        0, MPI_COMM_WORLD&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    /* Вывод */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        FILE* fout = fopen(&amp;quot;result.out&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
        if (fout) {&lt;br /&gt;
            fprintf(fout, &amp;quot;%d %d %.6f\n&amp;quot;, m, size, t2 - t1);&lt;br /&gt;
            fclose(fout);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (total_saddles == 0) {&lt;br /&gt;
            printf(&amp;quot;No saddle point found.\n&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            printf(&amp;quot;Found %d saddle point(s):\n&amp;quot;, total_saddles);&lt;br /&gt;
            for (i = 0; i &amp;lt; total_saddles; i++) {&lt;br /&gt;
                printf(&amp;quot;  (%d, %d)\n&amp;quot;, global_saddles[i].row, global_saddles[i].col);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;Matrix: %dx%d, Processes: %d, Time: %.6f seconds\n&amp;quot;, m, n, size, t2 - t1);&lt;br /&gt;
&lt;br /&gt;
        free(all_counts);&lt;br /&gt;
        free(displs);&lt;br /&gt;
        free(global_saddles);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(local_saddles);&lt;br /&gt;
    free(A);&lt;br /&gt;
    MPI_Finalize();&lt;br /&gt;
    return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30330</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30330"/>
		<updated>2025-12-09T21:06:03Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /*  Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
    def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
Для всех запусков седловая точка не была найдена (No saddle point found). Значения времени усреднены по трём прогонам. Время показано в секундах.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Размер матрицы !! 1 процесс !! 2 процесса !! 4 процесса !! 8 процессов !! 16 процессов !! 32 процесса !! 64 процесса&lt;br /&gt;
|-&lt;br /&gt;
|1000x1000	||	0.000358	||	0.000233	||	0.000156		||0.000079	||	0.000064	||	0.000038	||	0.000015&lt;br /&gt;
|-&lt;br /&gt;
|2000x2000	||	0.001373	||	0.000926	||	0.000701	||	0.000536	||	0.000273	||	0.000090	||	0.000042&lt;br /&gt;
|-&lt;br /&gt;
|3000x3000	||	0.003451	||	0.002439	||	0.001691	||	0.001200	||	0.000617	||	0.000166	||	0.000085&lt;br /&gt;
|-&lt;br /&gt;
|4000x4000	||	0.007259	||	0.003992	||	0.002923	||	0.001972	||	0.001029	||	0.000298	||	0.000135&lt;br /&gt;
|-&lt;br /&gt;
|5000x5000	||	0.011327	||	0.006031	||	0.004380	||	0.002532	||	0.001452	||	0.000439	||	0.000236&lt;br /&gt;
|-&lt;br /&gt;
|6000x6000	||	0.016217	||	0.008659	||	0.007147	||	0.003346	||	0.002009	||	0.000606	||	0.000326&lt;br /&gt;
|-&lt;br /&gt;
|7000x7000	||	0.022054	||	0.011617	||	0.008796	||	0.004212	||	0.002220	||	0.000914	||	0.000399&lt;br /&gt;
|-&lt;br /&gt;
|8000x8000	||	0.028572	||	0.015224	||	0.009939	||	0.005330	||	0.002697	||	0.001254	||	0.000534&lt;br /&gt;
|-&lt;br /&gt;
|9000x9000	||	0.035642	||	0.019085	||	0.012258	||	0.006447	||	0.003769	||	0.001428	||	0.000769&lt;br /&gt;
|-&lt;br /&gt;
|10000x10000	||	0.043867	||	0.023461	||	0.012777	||	0.007889	||	0.004756	||	0.002258	||	0.000792&lt;br /&gt;
|-&lt;br /&gt;
|11000x11000	||	0.052932	||	0.028309	||	0.018155	||	0.009360	||	0.005155	||	0.002243	||	0.001000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
=== 2.5 Код на MPI ===&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;mpi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
    int row;&lt;br /&gt;
    int col;&lt;br /&gt;
} SaddlePoint;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
    int rank, size;&lt;br /&gt;
    int m, n;&lt;br /&gt;
    int i, j;&lt;br /&gt;
&lt;br /&gt;
    MPI_Init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;amp;rank);&lt;br /&gt;
    MPI_Comm_size(MPI_COMM_WORLD, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    if (argc != 3) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Usage: %s &amp;lt;rows&amp;gt; &amp;lt;cols&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    m = atoi(argv[1]);&lt;br /&gt;
    n = atoi(argv[2]);&lt;br /&gt;
&lt;br /&gt;
    if (m &amp;lt;= 0 || n &amp;lt;= 0) {&lt;br /&gt;
        if (rank == 0) {&lt;br /&gt;
            fprintf(stderr, &amp;quot;Matrix dimensions must be positive.\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        MPI_Finalize();&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс выделяет память под всю матрицу */&lt;br /&gt;
    int* A = (int*)malloc(m * n * sizeof(int));&lt;br /&gt;
    if (A == NULL) {&lt;br /&gt;
        if (rank == 0) fprintf(stderr, &amp;quot;Memory allocation failed.\n&amp;quot;);&lt;br /&gt;
        MPI_Abort(MPI_COMM_WORLD, 1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Процесс 0 генерирует матрицу */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        srand((unsigned int)time(NULL));&lt;br /&gt;
        for (i = 0; i &amp;lt; m; i++) {&lt;br /&gt;
            for (j = 0; j &amp;lt; n; j++) {&lt;br /&gt;
                A[i * n + j] = rand() % 1000;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Рассылаем всю матрицу всем процессам */&lt;br /&gt;
    MPI_Bcast(A, m * n, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    /* === НАЧАЛО ЗАМЕРА ВРЕМЕНИ === */&lt;br /&gt;
    MPI_Barrier(MPI_COMM_WORLD);&lt;br /&gt;
    double t1 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Каждый процесс обрабатывает строки: i % size == rank */&lt;br /&gt;
    int max_local = (m + size - 1) / size; /* верхняя оценка числа строк на процесс */&lt;br /&gt;
    SaddlePoint* local_saddles = (SaddlePoint*)malloc(max_local * sizeof(SaddlePoint));&lt;br /&gt;
    int local_count = 0;&lt;br /&gt;
&lt;br /&gt;
    for (i = rank; i &amp;lt; m; i += size) {&lt;br /&gt;
        /* Уровень 1: найти минимум в строке i */&lt;br /&gt;
        int min_val = A[i * n + 0];&lt;br /&gt;
        int min_j = 0;&lt;br /&gt;
        for (j = 1; j &amp;lt; n; j++) {&lt;br /&gt;
            if (A[i * n + j] &amp;lt; min_val) {&lt;br /&gt;
                min_val = A[i * n + j];&lt;br /&gt;
                min_j = j;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Уровень 2: проверить максимум в столбце min_j */&lt;br /&gt;
        int is_max = 1;&lt;br /&gt;
        for (j = 0; j &amp;lt; m; j++) {&lt;br /&gt;
            if (A[j * n + min_j] &amp;gt; min_val) {&lt;br /&gt;
                is_max = 0;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (is_max) {&lt;br /&gt;
            local_saddles[local_count].row = i;&lt;br /&gt;
            local_saddles[local_count].col = min_j;&lt;br /&gt;
            local_count++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    double t2 = MPI_Wtime();&lt;br /&gt;
&lt;br /&gt;
    /* Собрать результаты */&lt;br /&gt;
    int* all_counts = NULL;&lt;br /&gt;
    int total_saddles = 0;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        all_counts = (int*)malloc(size * sizeof(int));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gather(&amp;amp;local_count, 1, MPI_INT, all_counts, 1, MPI_INT, 0, MPI_COMM_WORLD);&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        for (i = 0; i &amp;lt; size; i++) {&lt;br /&gt;
            total_saddles += all_counts[i];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    SaddlePoint* global_saddles = NULL;&lt;br /&gt;
    int* displs = NULL;&lt;br /&gt;
&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        global_saddles = (SaddlePoint*)malloc(total_saddles * sizeof(SaddlePoint));&lt;br /&gt;
        displs = (int*)malloc(size * sizeof(int));&lt;br /&gt;
        displs[0] = 0;&lt;br /&gt;
        for (i = 1; i &amp;lt; size; i++) {&lt;br /&gt;
            displs[i] = displs[i - 1] + all_counts[i - 1];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MPI_Gatherv(&lt;br /&gt;
        local_saddles, local_count, MPI_BYTE,&lt;br /&gt;
        global_saddles, all_counts, displs, MPI_BYTE,&lt;br /&gt;
        0, MPI_COMM_WORLD&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    /* Вывод */&lt;br /&gt;
    if (rank == 0) {&lt;br /&gt;
        FILE* fout = fopen(&amp;quot;result.out&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
        if (fout) {&lt;br /&gt;
            fprintf(fout, &amp;quot;%d %d %.6f\n&amp;quot;, m, size, t2 - t1);&lt;br /&gt;
            fclose(fout);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (total_saddles == 0) {&lt;br /&gt;
            printf(&amp;quot;No saddle point found.\n&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            printf(&amp;quot;Found %d saddle point(s):\n&amp;quot;, total_saddles);&lt;br /&gt;
            for (i = 0; i &amp;lt; total_saddles; i++) {&lt;br /&gt;
                printf(&amp;quot;  (%d, %d)\n&amp;quot;, global_saddles[i].row, global_saddles[i].col);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;Matrix: %dx%d, Processes: %d, Time: %.6f seconds\n&amp;quot;, m, n, size, t2 - t1);&lt;br /&gt;
&lt;br /&gt;
        free(all_counts);&lt;br /&gt;
        free(displs);&lt;br /&gt;
        free(global_saddles);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(local_saddles);&lt;br /&gt;
    free(A);&lt;br /&gt;
    MPI_Finalize();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30325</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30325"/>
		<updated>2025-12-09T20:16:12Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.3 Результаты прогонов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
    def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
Для всех запусков седловая точка не была найдена (No saddle point found). Значения времени усреднены по трём прогонам. Время показано в секундах.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
! Размер матрицы !! 1 процесс !! 2 процесса !! 4 процесса !! 8 процессов !! 16 процессов !! 32 процесса !! 64 процесса&lt;br /&gt;
|-&lt;br /&gt;
|1000x1000	||	0.000358	||	0.000233	||	0.000156		||0.000079	||	0.000064	||	0.000038	||	0.000015&lt;br /&gt;
|-&lt;br /&gt;
|2000x2000	||	0.001373	||	0.000926	||	0.000701	||	0.000536	||	0.000273	||	0.000090	||	0.000042&lt;br /&gt;
|-&lt;br /&gt;
|3000x3000	||	0.003451	||	0.002439	||	0.001691	||	0.001200	||	0.000617	||	0.000166	||	0.000085&lt;br /&gt;
|-&lt;br /&gt;
|4000x4000	||	0.007259	||	0.003992	||	0.002923	||	0.001972	||	0.001029	||	0.000298	||	0.000135&lt;br /&gt;
|-&lt;br /&gt;
|5000x5000	||	0.011327	||	0.006031	||	0.004380	||	0.002532	||	0.001452	||	0.000439	||	0.000236&lt;br /&gt;
|-&lt;br /&gt;
|6000x6000	||	0.016217	||	0.008659	||	0.007147	||	0.003346	||	0.002009	||	0.000606	||	0.000326&lt;br /&gt;
|-&lt;br /&gt;
|7000x7000	||	0.022054	||	0.011617	||	0.008796	||	0.004212	||	0.002220	||	0.000914	||	0.000399&lt;br /&gt;
|-&lt;br /&gt;
|8000x8000	||	0.028572	||	0.015224	||	0.009939	||	0.005330	||	0.002697	||	0.001254	||	0.000534&lt;br /&gt;
|-&lt;br /&gt;
|9000x9000	||	0.035642	||	0.019085	||	0.012258	||	0.006447	||	0.003769	||	0.001428	||	0.000769&lt;br /&gt;
|-&lt;br /&gt;
|10000x10000	||	0.043867	||	0.023461	||	0.012777	||	0.007889	||	0.004756	||	0.002258	||	0.000792&lt;br /&gt;
|-&lt;br /&gt;
|11000x11000	||	0.052932	||	0.028309	||	0.018155	||	0.009360	||	0.005155	||	0.002243	||	0.001000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30324</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30324"/>
		<updated>2025-12-09T20:02:13Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.1 Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
    def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30323</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30323"/>
		<updated>2025-12-09T20:02:02Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.2 Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
    def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30321</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30321"/>
		<updated>2025-12-09T14:00:24Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.2 Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
def find_all_saddle_points_parallel(matrix):&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)&lt;br /&gt;
    n = len(matrix[0])&lt;br /&gt;
    &lt;br /&gt;
    def process_row(i):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Обработка одной строки для поиска ВСЕХ потенциальных седловых точек&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        row_results = []&lt;br /&gt;
        &lt;br /&gt;
        # Находим все минимальные элементы в строке&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Для каждого минимального элемента проверяем условие&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                row_results.append((i, j, matrix[i][j]))&lt;br /&gt;
        &lt;br /&gt;
        return row_results&lt;br /&gt;
    &lt;br /&gt;
    # Параллельная обработка строк&lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    with concurrent.futures.ThreadPoolExecutor(max_workers=min(m, 4)) as executor:&lt;br /&gt;
        futures = [executor.submit(process_row, i) for i in range(m)]&lt;br /&gt;
        &lt;br /&gt;
        # Собираем все результаты&lt;br /&gt;
        for future in concurrent.futures.as_completed(futures):&lt;br /&gt;
            row_results = future.result()&lt;br /&gt;
            for result in row_results:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: result[0],&lt;br /&gt;
                    &#039;col&#039;: result[1],&lt;br /&gt;
                    &#039;value&#039;: result[2]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30320</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30320"/>
		<updated>2025-12-09T13:58:57Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* 2.1 Особенности реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
def find_all_saddle_points_optimized(matrix):&lt;br /&gt;
&lt;br /&gt;
    if not matrix or not matrix[0]:&lt;br /&gt;
        return []&lt;br /&gt;
    &lt;br /&gt;
    m = len(matrix)  # количество строк&lt;br /&gt;
    n = len(matrix[0])  # количество столбцов&lt;br /&gt;
    &lt;br /&gt;
    saddle_points = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        # Шаг 1: Находим все индексы минимальных элементов в строке i&lt;br /&gt;
        min_in_row = matrix[i][0]&lt;br /&gt;
        min_indices = [0]&lt;br /&gt;
        &lt;br /&gt;
        for j in range(1, n):&lt;br /&gt;
            if matrix[i][j] &amp;lt; min_in_row:&lt;br /&gt;
                min_in_row = matrix[i][j]&lt;br /&gt;
                min_indices = [j]&lt;br /&gt;
            elif matrix[i][j] == min_in_row:&lt;br /&gt;
                min_indices.append(j)&lt;br /&gt;
        &lt;br /&gt;
        # Шаг 2: Для каждого минимального элемента проверяем,&lt;br /&gt;
        # является ли он максимальным в своем столбце&lt;br /&gt;
        for j in min_indices:&lt;br /&gt;
            is_saddle = True&lt;br /&gt;
            for k in range(m):&lt;br /&gt;
                if matrix[k][j] &amp;gt; matrix[i][j]:&lt;br /&gt;
                    is_saddle = False&lt;br /&gt;
                    break&lt;br /&gt;
            &lt;br /&gt;
            if is_saddle:&lt;br /&gt;
                saddle_points.append({&lt;br /&gt;
                    &#039;row&#039;: i,&lt;br /&gt;
                    &#039;col&#039;: j,&lt;br /&gt;
                    &#039;value&#039;: matrix[i][j]&lt;br /&gt;
                })&lt;br /&gt;
    &lt;br /&gt;
    return saddle_points&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30319</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30319"/>
		<updated>2025-12-09T13:49:37Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30318</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30318"/>
		<updated>2025-12-09T13:43:20Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
* Все седловые точки имеют одинаковое значение&lt;br /&gt;
* Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30317</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=30317"/>
		<updated>2025-12-09T13:42:39Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
В матрице может быть несколько седловых точек или ни одной&lt;br /&gt;
&lt;br /&gt;
Все седловые точки имеют одинаковое значение&lt;br /&gt;
&lt;br /&gt;
Алгоритм устойчив к дублирующимся значениям&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29950</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29950"/>
		<updated>2025-11-04T18:03:29Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Координаты найденных седловых точек (i, j) или индикатор ее отсутствия (например, None).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29949</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29949"/>
		<updated>2025-11-04T18:01:49Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graf sedl.png |500px|thumb|center|Граф поиска седловой точки матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств (как диагональное преобладание) от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: Координаты найденной седловой точки (i, j) или индикатор ее отсутствия (например, None). Если седловых точек несколько, алгоритм может быть модифицирован для поиска всех, но в базовой версии возвращается первая найденная.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graf_sedl.png&amp;diff=29948</id>
		<title>Файл:Graf sedl.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graf_sedl.png&amp;diff=29948"/>
		<updated>2025-11-04T17:57:03Z</updated>

		<summary type="html">&lt;p&gt;Zerika: Граф алгоритма поиска седловой точки.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Краткое описание ==&lt;br /&gt;
Граф алгоритма поиска седловой точки.&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29945</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29945"/>
		<updated>2025-11-04T17:52:34Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Информационный граф отражает две основные операции над каждой строкой: поиск минимума и проверку максимума в столбце. Между итерациями отсутствуют зависимости, параллелизм возможен по строкам.&lt;br /&gt;
&lt;br /&gt;
Граф относительно прост и состоит из двух последовательных уровней вычислений для каждой строки.&lt;br /&gt;
&lt;br /&gt;
* Уровень 1 (Поиск минимумов): m независимых вершин (по одной на каждую строку), каждая из которых выполняет операцию нахождения минимума в своем наборе данных (элементах строки) и номер его столбца d. Эти вершины не связаны между собой.&lt;br /&gt;
&lt;br /&gt;
* Уровень 2 (Проверка кандидатов): m вершин (по одной на каждого кандидата). Каждая вершина i на этом уровне использует результат вершины i с первого уровня (столбец-кандидат) и требует данные всего столбца d из исходной матрицы для проверки на максимум. Вершины этого уровня также независимы друг от друга.&lt;br /&gt;
&lt;br /&gt;
Связь между уровнями: Результат работы вершины i Уровня 1 (значение d) является входным данным для вершины i Уровня 2.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Example.jpg|Описание1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств (как диагональное преобладание) от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: Координаты найденной седловой точки (i, j) или индикатор ее отсутствия (например, None). Если седловых точек несколько, алгоритм может быть модифицирован для поиска всех, но в базовой версии возвращается первая найденная.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29937</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29937"/>
		<updated>2025-11-04T17:23:47Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента строки.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств (как диагональное преобладание) от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: Координаты найденной седловой точки (i, j) или индикатор ее отсутствия (например, None). Если седловых точек несколько, алгоритм может быть модифицирован для поиска всех, но в базовой версии возвращается первая найденная.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29936</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29936"/>
		<updated>2025-11-04T17:23:07Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
	Для каждой строки i:&lt;br /&gt;
	&lt;br /&gt;
# Найти индекс позиции j минимального элемента.&lt;br /&gt;
# Проверить, является ли A&amp;lt;sub&amp;gt;i,j&amp;lt;/sub&amp;gt; максимальным в столбце j.&lt;br /&gt;
# Если да — вернуть (i,j) как седловую точку.&lt;br /&gt;
# Если ни для одной строки условие не выполнено — сообщить об отсутствии седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств (как диагональное преобладание) от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: Координаты найденной седловой точки (i, j) или индикатор ее отсутствия (например, None). Если седловых точек несколько, алгоритм может быть модифицирован для поиска всех, но в базовой версии возвращается первая найденная.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29934</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29934"/>
		<updated>2025-11-04T17:14:42Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
&lt;br /&gt;
Алгоритм применяется для решения задач выпукло-вогнутой оптимизации, игр с нулевой суммой, экономики и машиностроения. Входными данными служат функция двух переменных с соответствующими пространствами определения (часто выпуклыми и ограниченными) и дополнительные параметрические сведения (градиенты, Гессианы, при наличии). Выходом является приближённое значение седловой точки.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для матрицы размером &#039;&#039;&#039;m×n&#039;&#039;&#039;	&lt;br /&gt;
&amp;lt;br&amp;gt;Поиск минимума в строке занимает — &#039;&#039;&#039;O(n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Проверка максимума в столбце — &#039;&#039;&#039;O(m)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
	Итого на каждую строку — &#039;&#039;&#039;O(m+n)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Общая сложность — &#039;&#039;&#039;O(m(m+n))&#039;&#039;&#039;, что при квадратной матрице &#039;&#039;&#039;n = m&#039;&#039;&#039; равно &#039;&#039;&#039;O(n^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
* Параллелизм на макроуровне (между строками): Поиск минимумов в строках может выполняться полностью параллельно. Все m задач Уровня 1 независимы. Аналогично, проверка всех m кандидатов на Уровне 2 также может выполняться параллельно.&lt;br /&gt;
* Параллельная сложность:&lt;br /&gt;
# При наличии m процессоров поиск минимумов во всех строках можно выполнить за O(n) времени (время обработки одной строки). &lt;br /&gt;
# Проверку всех кандидатов на наличие максимума в столбцах, при наличии m процессоров, можно выполнить за O(m) времени (время прохода по одному столбцу). Таким образом, общая параллельная сложность составляет O(n + m).&lt;br /&gt;
#Параллелизм реализуется на уровне итераций по строкам — независимые проверки каждой строки и связанных с ними операций.&lt;br /&gt;
Для матрицы большого размера этот подход позволяет ускорить алгоритм на многопроцессорных системах.&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: Прямоугольная числовая матрица A размером m x n. Тип элементов - целый или вещественный. Особых свойств (как диагональное преобладание) от матрицы не требуется.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: Координаты найденной седловой точки (i, j) или индикатор ее отсутствия (например, None). Если седловых точек несколько, алгоритм может быть модифицирован для поиска всех, но в базовой версии возвращается первая найденная.&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29928</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29928"/>
		<updated>2025-11-04T16:46:16Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
1. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
2. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Поиск минимумов в строках: Требуется просмотреть каждый элемент матрицы ровно один раз. Сложность = O(m * n).&lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов: В худшем случае (когда все минимумы строк находятся в разных столбцах) требуется для каждой из m строк проверить m элементов в столбце. Сложность = O(m * m) = O(m^2).&lt;br /&gt;
&lt;br /&gt;
Общая последовательная сложность: O(m * n) + O(m^2). В худшем случае, когда матрица квадратная (m = n), сложность составляет O(n^2) + O(n^2) = O(n^2)&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29927</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29927"/>
		<updated>2025-11-04T16:42:10Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;&#039;Седловой  элемент матрицы&#039;&#039;&#039; &amp;lt;math&amp;gt; A = (a_{i, j})_{i = 1, j = 1}^{m, n}&amp;lt;/math&amp;gt; — элемент матрицы &amp;lt;math&amp;gt;a_{k, d}&amp;lt;/math&amp;gt;, удовлетворяющий условиям &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m} a_{i, d} = \min_{1 \le j \le n} a_{k, j}&amp;lt;/math&amp;gt;, то есть элемент матрицы, который одновременно является минимальным элементом в соответствующей строке матрицы и максимальным элементом в соответствующем столбце матрицы. Из определения следует, что &amp;lt;math&amp;gt;a_{k, d} = \max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;. Более того, для матрицы существует седловой элемент тогда и только тогда, когда &amp;lt;math&amp;gt;\max_{1 \le i \le m}\ \min_{1 \le j \le n}a_{i, j} = \min_{1 \le j \le n}\ \max_{1 \le i \le m}a_{i, j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Примеры&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 5 &amp;amp; 6 &amp;amp;  4 &amp;amp; 5\\&lt;br /&gt;
-2 &amp;amp; 5 &amp;amp;  3 &amp;amp; 7\\&lt;br /&gt;
 8 &amp;amp; 7 &amp;amp; -2 &amp;amp; 6\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 1 седловой элемент, равный 4, который расположен в первой строке в третьем столбце матрицы, так как он одновременно является минимальным элементом в соответствующей строке матрицы (в данном случае в первой строке матрицы) и максимальным элементом в соответствующем столбце матрицы (в данном случае в третьем столбце матрицы).&lt;br /&gt;
&lt;br /&gt;
Матрица&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 2 &amp;amp; 3 &amp;amp; 5 &amp;amp; 2\\&lt;br /&gt;
 2 &amp;amp; 4 &amp;amp; 6 &amp;amp; 2\\&lt;br /&gt;
-2 &amp;amp; 7 &amp;amp; 2 &amp;amp; 0\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
имеет 4 седловых элемента, равных 2, которые расположены в первой строке в первом столбце, в первой строке в четвёртом столбце, во второй строке в первом столбце, во второй строке в четвёртом столбце матрицы, соответственно.&lt;br /&gt;
&lt;br /&gt;
Данный пример показывает, что матрица может иметь несколько (более одной) седловых точек.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
2. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
1. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Поиск минимумов в строках: Требуется просмотреть каждый элемент матрицы ровно один раз. Сложность = O(m * n).&lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов: В худшем случае (когда все минимумы строк находятся в разных столбцах) требуется для каждой из m строк проверить m элементов в столбце. Сложность = O(m * m) = O(m^2).&lt;br /&gt;
&lt;br /&gt;
Общая последовательная сложность: O(m * n) + O(m^2). В худшем случае, когда матрица квадратная (m = n), сложность составляет O(n^2) + O(n^2) = O(n^2)&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29814</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29814"/>
		<updated>2025-10-31T22:37:16Z</updated>

		<summary type="html">&lt;p&gt;Zerika: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== &#039;&#039;&#039;Свойства и структура алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
=== Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма состоит из двух последовательных этапов:&lt;br /&gt;
&lt;br /&gt;
Поиск минимумов в строках, в котором для каждой строки i матрицы A последовательно сравниваются элементы A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; с текущим минимумом, и при нахождении меньшего значения обновляются минимальный элемент и его позиция столбец (d). &lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов в столбцах d, в котором для каждого найденного минимума строки последовательно сравниваются элементы A&amp;lt;sub&amp;gt;id&amp;lt;/sub&amp;gt; соответствующего столбца с кандидатом, и при обнаружении большего элемента проверка прекращается. &lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух последовательных макроопераций:&lt;br /&gt;
&lt;br /&gt;
2. Поиск минимума в каждой строке матрицы. Эта операция представляет собой цикл по всем строкам, внутри которого выполняется сканирование элементов строки.&lt;br /&gt;
&lt;br /&gt;
1. Проверка найденных кандидатов на максимальность в их столбцах. Эта операция представляет собой цикл по всем строкам-кандидатам, внутри которого для каждого кандидата выполняется полный проход по его столбцу.&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Поиск минимумов в строках: Требуется просмотреть каждый элемент матрицы ровно один раз. Сложность = O(m * n).&lt;br /&gt;
&lt;br /&gt;
Проверка кандидатов: В худшем случае (когда все минимумы строк находятся в разных столбцах) требуется для каждой из m строк проверить m элементов в столбце. Сложность = O(m * m) = O(m^2).&lt;br /&gt;
&lt;br /&gt;
Общая последовательная сложность: O(m * n) + O(m^2). В худшем случае, когда матрица квадратная (m = n), сложность составляет O(n^2) + O(n^2) = O(n^2)&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29813</id>
		<title>Участник:Zerika</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zerika&amp;diff=29813"/>
		<updated>2025-10-30T18:49:32Z</updated>

		<summary type="html">&lt;p&gt;Zerika: Создание страницы и внесение первых правок, резервное сохранение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== &#039;&#039;&#039;Свойства и структура алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 1.1 Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для поиска седловой точки в числовой матрице A. Седловой точкой называется элемент матрицы, который одновременно является минимальным в своей строке и максимальным в своем столбце. Алгоритм является прямым (не итерационным) и детерминированным. Его суть заключается в последовательном сканировании строк матрицы для поиска минимумов, а затем в проверке этих кандидатов на максимальность в соответствующих столбцах. В матрице может быть несколько седловых точек или не быть ни одной.&lt;br /&gt;
=== 1.2 Математическое описание ===&lt;br /&gt;
Пусть задана матрица &#039;&#039;&#039;A&#039;&#039;&#039; размерности &#039;&#039;&#039;m x n&#039;&#039;&#039; (m строк, n столбцов).&lt;br /&gt;
&lt;br /&gt;
Элемент &#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt;&#039;&#039;&#039; является седловой точкой, если выполняются два условия:&lt;br /&gt;
&lt;br /&gt;
Он является минимальным элементом в своей строке i:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = min A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt;, k от 1 до n&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Он является максимальным элементом в своем столбце j:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; = max A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;, d от 1 до m&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм можно описать как поиск таких индексов (i, j), для которых:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;∀k: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≤ A&amp;lt;sub&amp;gt;ik&amp;lt;/sub&amp;gt; и ∀d: A&amp;lt;sub&amp;gt;ij&amp;lt;/sub&amp;gt; ≥ A&amp;lt;sub&amp;gt;dj&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
=== 1.3 Вычислительное ядро алгоритма ===&lt;br /&gt;
=== 1.4 Макроструктура алгоритма ===&lt;br /&gt;
=== 1.5 Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== 1.6 Последовательная сложность алгоритма ===&lt;br /&gt;
=== 1.7 Информационный граф ===&lt;br /&gt;
=== 1.8 Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== 1.9 Входные и выходные данные алгоритма ===&lt;br /&gt;
=== 1.10 Свойства алгоритма ===&lt;br /&gt;
== &#039;&#039;&#039; Программная реализация алгоритма&#039;&#039;&#039; ==&lt;br /&gt;
=== 2.1 Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== 2.2 Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
=== 2.3 Результаты прогонов ===&lt;br /&gt;
=== 2.4 Выводы для классов архитектур ===&lt;br /&gt;
== &#039;&#039;&#039; Литература&#039;&#039;&#039; ==&lt;/div&gt;</summary>
		<author><name>Zerika</name></author>
	</entry>
</feed>