Цитата из: kidd 79ый on 15-12-2005, 14:49:09
киддать

Я согласен. Только ссылки надо будет в обеих темах - на начало и на конец.
Mrrl, я сегодня больше вспоминать об этих седловых точках, скорее всего, не буду. Напишу в сыром виде одну мысль, возможно, с ее помощью можно интересный алгоритм построить.
Прежде всего, отметим следующее: в матрице m*n элементов, и в начале работы алгоритма у нас ровно столько претендентов на гордое имя "седловой точки". Алгоритм поиска проводит k сравнений. Можно сказать, что в среднем каждое сравнение будет вычеркивать из списка элементов матрицы mn/k элементов, так что в итоге вычеркнутся все или останутся только те, которые дадут ответ. Мерой хорошести алгоритма, значит, будет то количество элементов, которые можно будет вычеркнуть из избирательного бюллетеня на одном шаге.
Второе: можно попробовать поискать алгоритм, который будет работать не фиксированное число шагов. Оптимальность такого алгоритма будет оцениваться в среднем, на множестве всех матриц данной размерности.
Вот теперь пример: если мы ищем минимум в строке, то мы на каждом шаге вычеркиваем из списка кандидатов только один элемент - тот, который больше текущего минимума. За n-1 шаг мы вычеркнем n-1 элемент. Могу предложить подход (недоведенный еще до ума), который вычеркнет
в среднем больше элементов.
Давай искать минимум не в строке, а на диагонали. Что это нам даст? Пусть у нас есть два неравных элемента M(i,k) < M(j,l). Из этого неравенства можно сразу сделать вывод, что строка
i не может доминировать над столбцом
l (все элементы строки
i не могут быть не меньше всех элементов столбца
l - у нас есть контрпример).
Значит, по этому сравнению можно вычеркнуть элемент M(i,l) (при обратном знаке неравенства мы вычеркнем элемент M(j,k) ).
Пока что это неинтересно - по одному сравнению вычеркнули один элемент. Рассмотрим, однако, следующий пример:
о о о о 1
о о о 2 о
о о 3 о о
о 4 о о о
5 о о о о
Буквой "о" отмечены элементы, которые пока в сравнении не участвуют, отрезанную часть прямоугольной матрицы я не рисовал. Если мы пойдем по этой диагонали справа налево в поисках минимума, то мы будем по очереди сравнивать единицу с остальными элементами и вычеркивать в ее строке позиции, в которых точно нет седловых точек. После четырех шагов получим:
x x x x 1
о о о 2 о
о о 3 о о
о 4 о о о
5 о о о о
Как видим, в этой ситуации поиск минимума в такой диагонали дал нам результат ничем не лучше и не хуже поиска минимума в первой строке.
Но! Если мы будм искать минимум в диагонали, начиная с нижнего угла, то, сравнивая 4 и 5 мы вычеркнем элемент в строке с четверкой, сравнивая 3 и 4 - элемент в строке с тройкой и столбце с четверкой
плюс (мы ведь помним, что "4" у нас - текущий минимум, значит, все ранее просмотренное было больше, значит, оно больше и трех) элемент в строке с тройкой и столбцом с пятеркой. Дойдя до конца, получим:
x x x x 1
x x x 2 о
x x 3 о о
x 4 о о о
5 о о о о
Этот пример показывает, что в хорошем случае за четыре сравнения мы можем вычеркнуть 10 элементов. Это была общая мысль, теперь нужно, во-первых, посчитать средную эффективность этого подхода, во-вторых, довести его до окончательного решения - как конкретно выбирать маршруты обхода матрицы и что сравнивать на последнем шаге (по аналогии с поиском максимума из всех промежуточных минимумов по строкам). Не знаю, получится ли что-то хорошее...
Вдогонку: метод поиска с.т., если известно её значение, попросту лишен смысла. Её и ищут для того, чтобы значение найти, а расположение в матрице - малоинтересно.