Як ви визначаєте «крайні» випадки в алгоритмах?


25

В основному, як ви дізнаєтесь, що може бути вашим найгіршим чи найкращим випадком та будь-якими іншими "кращими" випадками, які ви можете мати ДО ПЕРЕД наявності їх і так, як ви підготуєте свій код для них?


2
Альтернатива: коли це можливо, я великий шанувальник нечітких тестувань. Дивовижно, як велика маса випадково генерованих входів може виявити помилки в межах функції, яка не виявила жодної кількості перевірок / крайового тестування. Двоє дійсно добре працюють разом ... і вони, очевидно, доповнені помилками реєстрації в точності під час роботи на "справжніх" входах :)
Матьє М.

Відповіді:


28

На основі вмісту алгоритму можна визначити, які структури даних / типи / конструкції використовуються. Потім ви намагаєтесь зрозуміти (можливі) слабкі місця тих і намагаєтесь скласти план виконання, який змусить його виконуватись у цих випадках.

Наприклад, алгоритм приймає рядок і ціле число як вхідні дані і виконує сортування символів рядка.

Тут ми маємо:

Рядок з деякими відомими особливими випадками:

  • Порожній рядок
  • Довга струна
  • Рядок Unicode (спеціальні символи)
  • Якщо обмежується певним набором символів, що відбувається, коли деякі не знаходяться в діапазоні
  • Рядок непарної / парної довжини
  • Нуль (як аргумент)
  • Недійсне припинення

Цілий з відомими особливими випадками:

  • 0
  • Min / MaxInt
  • Негативний / позитивний

Алгоритм сортування, який може вийти з ладу у таких граничних випадках:

  • Порожній ввід
  • 1 елемент введення
  • Дуже довгий вхід (можливо, максимум довжини (тип даних використовується для індексу))
  • Сміття всередині колекції, яке буде відсортовано
  • Недійсне введення
  • Дублюючі елементи
  • Колекція з усіма елементами рівна
  • Непарна / парна довжина вводу

Потім візьміть усі ці випадки і створіть довгий список, намагаючись зрозуміти, як вони перетинаються. Наприклад:

  • Корпус порожнього рядка охоплює порожній регістр колекції
  • Null string == null collection
  • тощо.

Тепер створіть для них тестові приклади :)

Короткий підсумок : розбийте алгоритм на основні блоки, для яких ви знаєте крайові випадки, а потім зібрати їх, створюючи глобальні крайові випадки


5
Ще одне, що потрібно додати. . . проаналізуйте код і шукайте в коді особливі випадки. Якщо розробник обробляє 0 до 13 інакше, ніж 14 і більше - можливо, розробник використовує різні алгоритми для малих і великих значень з міркувань продуктивності - у вас є крайні випадки в 13 і 14. +1 для відмінного списку.
Етел Еванс

2

Я не думаю, що існує якийсь алгоритм для визначення граничних умов .... просто досвід.

Приклад: для байтового параметра ви хочете перевірити числа, такі як 0, 127, 128, 255, 256, -1, все, що може спричинити проблеми.


2

"Край" має два значення, і обидва є актуальними, коли мова йде про крайові випадки. Край - це або область, де невелика зміна вводу призводить до значних змін у виході, або до кінця діапазону.

Отже, щоб виявити крайові випадки алгоритму, я спочатку переглянув вхідну область. Його граничні значення можуть призвести до крайових випадків алгоритму.

По-друге, я переглядаю вихідний домен та оглядаюсь на вхідні значення, які можуть їх створити. Рідше це проблема з алгоритмами, але це допомагає знаходити проблеми в алгоритмах, призначених для отримання результатів, що охоплюють заданий вихідний домен. Наприклад, генератор випадкових чисел повинен мати можливість генерувати всі передбачені вихідні значення.

Нарешті, я перевіряю алгоритм, щоб побачити, чи є випадки введення, подібні, але приводять до різних результатів. Знайти ці крайові випадки найскладніше, оскільки він включає як домени, так і пару входів.


0

Це дуже загальне питання, тому все, що я можу зробити, - це викинути деякі загальні, розпливчасті ідеї :)

-Ексамінові крайові випадки. Вих. якщо ви розбираєте рядок, що станеться, якщо рядок порожній або недійсний? Якщо ви рахуєте від x до y, що відбувається в x і y?
-Код, який можна спростити або висушити. Будь-яка непотрібна складність може доповнити речі, які можуть піти не так.


0

Частина навички використання алгоритмів - це знання їх слабких та патологічних випадків. Відповідь Віктора дає кілька хороших порад, але загалом я б порадив, що вам потрібно вивчити цю тему більш глибоко, щоб зрозуміти це, я не думаю, що ви можете дотримуватися правил, щоб повністю відповісти на це питання. Наприклад, див. Кормен або Скіену (зокрема, у Скіени є дуже хороший розділ про те, де використовувати алгоритми і що добре працює в певних випадках; Кормен переходить до більшої теорії, я думаю).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.