Làm thế nào để bạn xác định các trường hợp cạnh góc cạnh trên các thuật toán?


25

Về cơ bản làm thế nào để bạn tìm ra trường hợp xấu nhất hoặc tốt nhất của bạn và bất kỳ trường hợp "cạnh" nào khác mà bạn có thể có TRƯỚC KHI có chúng và vì vậy, làm thế nào để bạn chuẩn bị mã cho họ?


2
Thay thế: khi có thể, tôi là một fan hâm mộ lớn của thử nghiệm mờ. Thật đáng ngạc nhiên khi khối lượng đầu vào được tạo ngẫu nhiên có thể phát hiện ra các lỗi trong một chức năng mà không có sự kiểm tra / kiểm tra cạnh nào được tiết lộ. Cả hai hoạt động rất tốt với nhau ... và rõ ràng chúng được bổ sung bằng cách ghi nhật ký lỗi chính xác khi chạy trên đầu vào "đúng" :)
Matthieu M.

Câu trả lời:


28

Dựa trên nội dung của thuật toán, bạn có thể xác định cấu trúc / loại / cấu trúc dữ liệu nào được sử dụng. Sau đó, bạn cố gắng hiểu những điểm yếu (có thể) của những điểm đó và cố gắng đưa ra một kế hoạch thực hiện sẽ khiến nó chạy trong những trường hợp đó.

Ví dụ, thuật toán lấy một chuỗi và một số nguyên làm đầu vào và thực hiện một số cách sắp xếp các ký tự của chuỗi.

Ở đây chúng tôi có:

Chuỗi với một số trường hợp đặc biệt đã biết:

  • Chuỗi rỗng
  • Chuỗi dài
  • Chuỗi Unicode (ký tự đặc biệt)
  • Nếu giới hạn ở một bộ ký tự cụ thể, điều gì xảy ra khi một số không nằm trong phạm vi
  • Chuỗi độ dài / chẵn
  • Null (như đối số)
  • Không chấm dứt

Số nguyên với các trường hợp đặc biệt đã biết:

  • 0
  • Tối thiểu / tối đa
  • Tiêu cực / tích cực

Sắp xếp thuật toán có thể thất bại trong các trường hợp biên sau:

  • Đầu vào trống
  • 1 yếu tố đầu vào
  • Đầu vào rất dài (có thể có độ dài tối đa (loại dữ liệu được sử dụng cho chỉ mục))
  • Rác bên trong bộ sưu tập sẽ được sắp xếp
  • Đầu vào không
  • Các yếu tố trùng lặp
  • Bộ sưu tập với tất cả các yếu tố bằng nhau
  • Đầu vào lẻ ​​/ chẵn

Sau đó, lấy tất cả các trường hợp này và tạo một danh sách dài cố gắng hiểu làm thế nào chúng trùng nhau. Vd

  • Trường hợp chuỗi rỗng bao gồm trường hợp bộ sưu tập trống
  • Chuỗi rỗng == bộ sưu tập null
  • v.v.

Bây giờ tạo trường hợp thử nghiệm cho họ :)

Tóm tắt ngắn gọn : phá vỡ thuật toán trong các khối cơ bản mà bạn biết các trường hợp biên và sau đó ghép lại chúng, tạo ra các trường hợp biên toàn cầu


5
Một điều nữa để thêm. . . phân tích mã và tìm kiếm các trường hợp đặc biệt trong mã. Nếu nhà phát triển xử lý 0 đến 13 khác nhau từ 14 trở lên - có thể nhà phát triển đang sử dụng các thuật toán khác nhau cho các giá trị nhỏ và lớn vì lý do hiệu suất - bạn có các trường hợp cạnh ở 13 và 14. +1 cho danh sách tuyệt vời.
Ethel Evans

2

Tôi không nghĩ có bất kỳ thuật toán nào để xác định các điều kiện cạnh .... chỉ cần trải nghiệm.

Ví dụ: đối với tham số byte, bạn sẽ muốn kiểm tra các số như 0, 127, 128, 255, 256, -1, bất cứ điều gì có thể gây rắc rối.


2

Một "cạnh" có hai ý nghĩa và cả hai đều có liên quan khi nói đến các trường hợp cạnh. Một cạnh là một khu vực nơi một thay đổi nhỏ trong đầu vào dẫn đến một thay đổi lớn trong đầu ra hoặc kết thúc một phạm vi.

Vì vậy, để xác định các trường hợp cạnh của thuật toán, trước tiên tôi nhìn vào miền đầu vào. Giá trị cạnh của nó có thể dẫn đến các trường hợp cạnh của thuật toán.

Thứ hai, tôi nhìn vào miền đầu ra và nhìn lại các giá trị đầu vào có thể tạo ra chúng. Đây không phải là một vấn đề phổ biến với các thuật toán, nhưng nó giúp tìm ra các vấn đề trong các thuật toán được thiết kế để tạo đầu ra kéo dài một miền đầu ra nhất định. Ví dụ: trình tạo số ngẫu nhiên sẽ có thể tạo tất cả các giá trị đầu ra dự định.

Cuối cùng, tôi kiểm tra thuật toán để xem liệu có trường hợp đầu vào nào giống nhau không, nhưng dẫn đến đầu ra không giống nhau. Tìm các trường hợp cạnh này là khó nhất, bởi vì nó liên quan đến cả hai miền và một cặp đầu vào.


0

Đây là một câu hỏi rất chung chung vì vậy tất cả những gì tôi có thể làm là đưa ra một số ý tưởng chung chung, mơ hồ :)

Trường hợp ranh giới -Examine. Vd nếu bạn đang phân tích một chuỗi thì điều gì xảy ra nếu chuỗi trống hoặc null? Nếu bạn đang đếm từ x đến y thì chuyện gì xảy ra ở x và y?
-Mã có thể được đơn giản hóa hoặc DRY-ed ra. Bất kỳ sự phức tạp không cần thiết có thể thêm vào những điều có thể đi sai.


0

Một phần của kỹ năng sử dụng thuật toán là biết điểm yếu và các trường hợp bệnh lý của chúng. Câu trả lời của Victor đưa ra một số lời khuyên tốt, nhưng nói chung tôi sẽ khuyên bạn nên nghiên cứu sâu hơn về chủ đề này để cảm nhận về điều này, tôi không nghĩ bạn có thể làm theo quy tắc để trả lời câu hỏi này đầy đủ. Ví dụ, xem Cormen , hoặc Skiena (đặc biệt là Skiena có một phần rất tốt về nơi sử dụng thuật toán và những gì hoạt động tốt trong một số trường hợp nhất định, Cormen đi vào lý thuyết nhiều hơn tôi nghĩ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.