2013-05-10 32 views
16

Trong JavaScript (phần nào có thể áp dụng ở nơi khác), nơi bạn không biết mã đang chạy đang triển khai đích nào, có cách nào để phát hiện nếu thuật toán sắp xếp cơ bản (của Array.sort) ổn định hay không, chỉ biết rằng sau the specification?Có phương pháp hộp đen nào để phát hiện xem thuật toán sắp xếp có ổn định không?

Tôi có thể tìm thấy 2 thử nghiệm trong webkit (1)(2), nhưng các thử nghiệm đó đáng tin cậy như thế nào? (Có thể kiểm tra này được thực hiện với một PCP?) Tôi đang tìm một giải pháp mà có thể là âm thanh toán học.

Đây là một vấn đề phức tạp, vì thuật toán sắp xếp nâng cao hơn có thể thay đổi thuật toán phụ tùy thuộc vào độ dài của mảng nguồn (như Timsort). Tôi đã nhầm lẫn vì mọi thử nghiệm tôi đã chạy cho thấy sắp xếp của Google Chrome ổn định, nhưng tất cả tài liệu tôi đã thấy đều cho biết rằng nó không ổn định (the source sẽ cho bạn biết lý do).

(Thông thường, tôi sử dụng this strategy để làm cho các loại của tôi ổn định, nó có nhỏ nhưng đôi khi đáng chú ý tác động hiệu suất)

Source code để phân loại trong việc triển khai khác nhau:
+0

Bạn chỉ có thể thực hiện xác suất như vậy một cách xác thực: ví dụ: tôi có thể xác định thuật toán sắp xếp 'S' có đầu vào' I'. Thông thường, 'S' tạo ra công việc phân loại thực tế cho một số thuật toán ổn định' T', * nhưng * khi 'I' bằng một số giá trị đặc biệt' I'', nó sử dụng một loại không ổn định 'U'.Bạn sẽ không bao giờ chứng minh rằng 'S' là không ổn định trừ khi bạn may mắn ra và xảy ra để vượt qua' I'' như đầu vào. Thực tế hơn, có lẽ 'S' sử dụng các loại ổn định trừ khi' I' rất dài. Một lần nữa, bạn sẽ chỉ quan sát các loại không ổn định nếu bạn thử nghiệm trên đầu vào phù hợp dài. – apsillers

+2

Nếu spec nói rằng nó không ổn định, điều đó không có nghĩa là bạn có thể mong đợi các mục để hoán đổi thứ tự khi bạn sắp xếp mảng, nhưng đúng hơn là bạn không thể dựa vào nó; không có lời hứa. Việc triển khai (hiện tại) diễn ra ổn định không có nghĩa là nó sẽ luôn luôn, hoặc cho tất cả các nền tảng mà Chrome chạy trên đó. – frozenkoi

+0

Tôi đồng ý với @MarZab rằng đây là sự cố tạm dừng. Bạn có thể thấy một số sự chú ý nhiều hơn nếu bạn gắn thẻ nó '[computer-science]' và/hoặc '[computer-science-theory]'. – apsillers

Trả lời

0

Chạy thử nghiệm nội bộ nhỏ, để kiểm tra? Bạn có thể sử dụng "thẻ bài theo xếp hạng, sau đó là phù hợp" ví dụ từ Wikipedia để kiểm tra sự ổn định.

Xem: https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

Tôi không biết có bao nhiêu thẻ bạn cần phải kiểm tra sự ổn định - có lẽ 5 hay như vậy?

1

Âm thanh toán học, eh? Điều đó sẽ yêu cầu mọi đường dẫn trong thuật toán được chứng minh là ổn định - và mọi kết hợp của chúng. Đối với bất kỳ dữ liệu nào có thể.

Các thuật toán chắc chắn như vậy tồn tại - nhưng chúng hầu như được thực hiện để phù hợp với yêu cầu đó. Vì vậy, nếu có, nó có thể nói nó là một nơi nào đó.

Đối với thử nghiệm để chứng minh điều gì đó tương tự, điều đó có thể nằm trong các sự cố tương tự như sự cố tạm dừng.

http://en.wikipedia.org/wiki/Halting_problem

+0

Không chắc chắn nếu cần thiết để gọi Halting vấn đề, nhưng nó phải được rõ ràng rằng tìm kiếm superexponential là cần thiết để trang trải * tất cả * khả năng cho một kích thước đầu vào nhất định –

5

kiểm tra hộp đen không thể được sử dụng để xác định rằng một chương trình đáp ứng bất kỳ tiêu chuẩn, trừ khi bạn có thể kiểm tra tất cả các đầu vào có thể liên quan đến các tiêu chí. Một hộp đen miễn phí chỉ đơn giản là có bảng tra cứu ánh xạ đầu vào cho đầu ra (xem Pentium FDIV bug cho lỗi bảng tra cứu thế giới thực) để bạn không thể chắc chắn rằng các thử nghiệm của bạn loại bỏ khả năng một số đầu vào khác kích hoạt vi phạm.

1

Tại sao lại có rủi ro? Đối với hầu hết các tập hợp dữ liệu hợp lý, việc triển khai javascript sắp xếp hợp nhất phải đủ nhanh. Chọn một cặp vợ chồng và đánh giá chúng và sử dụng tốt nhất.