В основном, как вы узнаете, какой может быть ваш худший или лучший случай, и какие-либо другие «крайние» случаи, которые у вас могут быть, ДО их наличия и так, как вы готовите свой код для них?
В основном, как вы узнаете, какой может быть ваш худший или лучший случай, и какие-либо другие «крайние» случаи, которые у вас могут быть, ДО их наличия и так, как вы готовите свой код для них?
Ответы:
На основе содержания алгоритма вы можете определить, какие структуры данных / типы / конструкции используются. Затем вы пытаетесь понять (возможные) слабые стороны этих программ и попытаетесь придумать план выполнения, который обеспечит его выполнение в этих случаях.
Например, алгоритм принимает строку и целое число в качестве входных данных и выполняет некоторую сортировку символов строки.
Здесь мы имеем:
Строка с некоторыми известными частными случаями:
Целое число с известными частными случаями:
Алгоритм сортировки, который может выйти из строя в следующих граничных случаях:
Затем возьмите все эти случаи и создайте длинный список, пытаясь понять, как они перекрываются. Пример:
Теперь создайте для них контрольные примеры :)
Краткое резюме : разбейте алгоритм на базовые блоки, для которых вы знаете граничные случаи, а затем пересоберите их, создавая глобальные граничные случаи
Я не думаю, что есть какой-либо алгоритм для определения краевых условий .... просто опыт.
Пример: для параметра байта вы хотели бы проверить числа, такие как 0, 127, 128, 255, 256, -1, все, что может вызвать проблемы.
«Край» имеет два значения, и оба имеют отношение, когда дело доходит до краевых случаев. Край - это либо область, где небольшое изменение на входе приводит к значительному изменению на выходе, либо конец диапазона.
Итак, чтобы определить крайние случаи алгоритма, я сначала посмотрю на входную область. Его граничные значения могут привести к граничным случаям алгоритма.
Во-вторых, я смотрю на выходной домен и оглядываюсь на входные значения, которые могут их создать. Это менее часто проблема с алгоритмами, но она помогает найти проблемы в алгоритмах, которые предназначены для генерации выходных данных, которые охватывают заданную область вывода. Например, генератор случайных чисел должен иметь возможность генерировать все предполагаемые выходные значения.
Наконец, я проверяю алгоритм, чтобы увидеть, есть ли входные случаи, которые похожи, но приводят к разным выходам. Найти эти крайние случаи сложнее всего, потому что в нем участвуют как домены, так и пара входов.
Это очень общий вопрос, поэтому все, что я могу сделать, это выбросить некоторые общие, смутные идеи :)
Изучить граничные случаи. Ex. если вы анализируете строку, что произойдет, если строка будет пустой или нулевой? Если вы считаете от х до у, что происходит в х и у?
-Код, который может быть упрощен или СУХОЙ. Любая ненужная сложность может добавить к вещам, которые могут пойти не так.
Часть навыков использования алгоритмов - знание их слабых сторон и патологических ситуаций. Ответ Виктора дает несколько хороших советов, но в целом я бы посоветовал вам изучить эту тему более подробно, чтобы почувствовать это, я не думаю, что вы можете следовать эмпирическим правилам, чтобы полностью ответить на этот вопрос. Например, см. Cormen или Skiena (в частности, у Skiena есть очень хороший раздел о том, где использовать алгоритмы и что хорошо работает в определенных случаях, я думаю, что Cormen углубляется в теорию).