В основному, як ви дізнаєтесь, що може бути вашим найгіршим чи найкращим випадком та будь-якими іншими "кращими" випадками, які ви можете мати ДО ПЕРЕД наявності їх і так, як ви підготуєте свій код для них?
В основному, як ви дізнаєтесь, що може бути вашим найгіршим чи найкращим випадком та будь-якими іншими "кращими" випадками, які ви можете мати ДО ПЕРЕД наявності їх і так, як ви підготуєте свій код для них?
Відповіді:
На основі вмісту алгоритму можна визначити, які структури даних / типи / конструкції використовуються. Потім ви намагаєтесь зрозуміти (можливі) слабкі місця тих і намагаєтесь скласти план виконання, який змусить його виконуватись у цих випадках.
Наприклад, алгоритм приймає рядок і ціле число як вхідні дані і виконує сортування символів рядка.
Тут ми маємо:
Рядок з деякими відомими особливими випадками:
Цілий з відомими особливими випадками:
Алгоритм сортування, який може вийти з ладу у таких граничних випадках:
Потім візьміть усі ці випадки і створіть довгий список, намагаючись зрозуміти, як вони перетинаються. Наприклад:
Тепер створіть для них тестові приклади :)
Короткий підсумок : розбийте алгоритм на основні блоки, для яких ви знаєте крайові випадки, а потім зібрати їх, створюючи глобальні крайові випадки
Я не думаю, що існує якийсь алгоритм для визначення граничних умов .... просто досвід.
Приклад: для байтового параметра ви хочете перевірити числа, такі як 0, 127, 128, 255, 256, -1, все, що може спричинити проблеми.
"Край" має два значення, і обидва є актуальними, коли мова йде про крайові випадки. Край - це або область, де невелика зміна вводу призводить до значних змін у виході, або до кінця діапазону.
Отже, щоб виявити крайові випадки алгоритму, я спочатку переглянув вхідну область. Його граничні значення можуть призвести до крайових випадків алгоритму.
По-друге, я переглядаю вихідний домен та оглядаюсь на вхідні значення, які можуть їх створити. Рідше це проблема з алгоритмами, але це допомагає знаходити проблеми в алгоритмах, призначених для отримання результатів, що охоплюють заданий вихідний домен. Наприклад, генератор випадкових чисел повинен мати можливість генерувати всі передбачені вихідні значення.
Нарешті, я перевіряю алгоритм, щоб побачити, чи є випадки введення, подібні, але приводять до різних результатів. Знайти ці крайові випадки найскладніше, оскільки він включає як домени, так і пару входів.
Це дуже загальне питання, тому все, що я можу зробити, - це викинути деякі загальні, розпливчасті ідеї :)
-Ексамінові крайові випадки. Вих. якщо ви розбираєте рядок, що станеться, якщо рядок порожній або недійсний? Якщо ви рахуєте від x до y, що відбувається в x і y?
-Код, який можна спростити або висушити. Будь-яка непотрібна складність може доповнити речі, які можуть піти не так.
Частина навички використання алгоритмів - це знання їх слабких та патологічних випадків. Відповідь Віктора дає кілька хороших порад, але загалом я б порадив, що вам потрібно вивчити цю тему більш глибоко, щоб зрозуміти це, я не думаю, що ви можете дотримуватися правил, щоб повністю відповісти на це питання. Наприклад, див. Кормен або Скіену (зокрема, у Скіени є дуже хороший розділ про те, де використовувати алгоритми і що добре працює в певних випадках; Кормен переходить до більшої теорії, я думаю).