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ọ?
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ọ?
Câu trả lời:
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:
Số nguyên với các trường hợp đặc biệt đã biết:
Sắp xếp thuật toán có thể thất bại trong các trường hợp biên sau:
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
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
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.
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.
Đâ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.
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ĩ).