2010-01-20 26 views
15

Tôi đã tìm thấy một cách cải thiện (theo như tôi đã thử nghiệm) khi thuật toán quicksort vượt quá những gì đã được thực hiện. Tôi đang làm việc để thử nghiệm nó và sau đó tôi muốn nhận được từ ra về nó. Tuy nhiên, tôi sẽ đánh giá cao một số trợ giúp với một số điều. Vì vậy, đây là những câu hỏi của tôi. Tất cả các mã của tôi là trong C + + bằng cách này.Một vài câu hỏi sắp xếp

  1. Một trong những loại tôi đã so sánh với quicksort của tôi là tiêu chuẩn :: sắp xếp từ Thư viện chuẩn C++. Tuy nhiên, nó có vẻ rất chậm. Tôi chỉ phân loại các mảng ints và longs, nhưng nó có vẻ chậm hơn khoảng 8-10 lần so với quicksort của tôi và quicksort tiêu chuẩn của Bentley và McIlroy (và có thể là Sedgewick). Có ai có bất kỳ ý tưởng nào về lý do tại sao nó quá chậm? Mã tôi sử dụng cho loại này chỉ là std :: sort (a, a + numelem); trong đó a là một mảng dài hoặc int và numelem là số phần tử trong mảng. Các con số này rất ngẫu nhiên và tôi đã thử các kích thước khác nhau cũng như số lượng các yếu tố lặp lại khác nhau. Tôi cũng đã thử qsort, nhưng nó thậm chí còn tồi tệ hơn như tôi mong đợi. Chỉnh sửa: Bỏ qua câu hỏi đầu tiên này - câu hỏi đã được giải quyết.

  2. Tôi muốn tìm thêm các triển khai nhanh khác để so sánh với quicksort của tôi. Cho đến nay tôi có một chiếc Bentley-McIlroy và tôi cũng đã so sánh với phiên bản đầu tiên của chiếc tua nhanh hai trục của Vladimir Yaroslavskiy. Ngoài ra, tôi dự định chuyển đổi timsort (đây là một loại hợp nhất mà tôi tin) và các quicksort hai trục được tối ưu hóa từ nguồn jdk 7. Bạn biết gì về những triển khai quicksorts tốt khác? Nếu chúng không có trong C hoặc C++ thì có thể không sao vì tôi khá giỏi trong việc chuyển, nhưng tôi thích C hoặc C++ nếu bạn biết chúng.

  3. Bạn khuyên bạn nên tìm hiểu thêm về các bổ sung của tôi cho quicksort như thế nào? Cho đến nay quicksort của tôi dường như nhanh hơn đáng kể so với tất cả các quicksorts khác mà tôi đã thử nghiệm nó chống lại. Nguồn chính của tốc độ của nó là nó xử lý các yếu tố lặp đi lặp lại hiệu quả hơn nhiều so với các phương pháp khác mà tôi đã tìm thấy. Nó gần như hoàn toàn loại trừ hành vi trường hợp xấu nhất mà không cần thêm nhiều thời gian trong việc kiểm tra các yếu tố lặp đi lặp lại. Tôi đăng về nó trên các diễn đàn Java, nhưng không có phản hồi. Tôi cũng đã cố gắng viết thư cho Jon Bentley bởi vì anh ấy đã làm việc với Vladimir về cuộc đua nhanh hai trục của mình và không nhận được phản hồi nào (mặc dù tôi không ngạc nhiên bởi điều này). Tôi có nên viết một bài báo về nó và đặt nó trên arxiv.org không? Tôi có nên đăng bài trên một số diễn đàn không? Có một số danh sách gửi thư mà tôi nên đăng không? Tôi đã làm việc này một thời gian và phương pháp của tôi là hợp pháp. Tôi có một số kinh nghiệm với nghiên cứu xuất bản bởi vì tôi là một ứng cử viên tiến sĩ trong vật lý tính toán. Tôi có nên thử tiếp cận một người nào đó trong khoa Khoa học Máy tính của trường đại học của tôi không? Nhân tiện, tôi cũng đã phát triển một chế độ nhanh hai trục khác, nhưng nó không tốt hơn so với quicksort trục đơn của tôi (mặc dù nó tốt hơn so với quicksort dual-pivot của Vladimir với một số bộ dữ liệu).

Tôi thực sự đánh giá cao sự trợ giúp của bạn. Tôi chỉ muốn thêm những gì tôi có thể vào thế giới điện toán. Tôi không quan tâm đến việc sáng chế điều này hay bất cứ điều gì vô lý như thế.

+2

Vui lòng cho tôi biết bạn đã biên dịch và lược tả bằng cách bật tối ưu hóa. – GManNickG

+1

Điều này có vẻ thực sự rõ ràng, nhưng khi sử dụng 'std :: sort' bạn đã bật tối ưu hóa đầy đủ? Nếu không có chúng - phụ thuộc thực hiện' - có thể có phí gọi điện đáng kể. Nếu không, nó có thể sẽ giúp nếu bạn đăng mã của bạn và thời gian tương đối. Hiệu suất thực tế của 'qsort' và' std :: sort' sẽ được thực thi phụ thuộc. –

+0

câu hỏi ngu ngốc (chỉ vì tôi đã bị cắn bởi nó trước đây): bạn có một bộ thử nghiệm của ngày? Và không đủ để kiểm tra xem đầu ra có được sắp xếp hay không. Đồng thời kiểm tra xem mọi mục nhập có xuất hiện trong đầu ra hay không. –

Trả lời

11

Nếu bạn tin tưởng vào công việc của mình, hãy cố gắng thảo luận với một người nào đó có kiến ​​thức tại trường đại học của bạn càng sớm càng tốt. Không đủ để cho thấy mã của bạn chạy nhanh hơn một quy trình khác trên máy của bạn. Bạn phải chứng minh toán học về bất kỳ hiệu suất đạt được mà bạn yêu cầu đã đạt được thông qua phân tích thuật toán của bạn. Tôi muốn nói điều đầu tiên cần làm là đảm bảo cả hai thuật toán bạn đang so sánh được triển khai và biên dịch một cách tối ưu - bạn có thể chỉ đang lừa mình ở đây. Khả năng của một cá nhân đạt được một cải tiến rõ rệt như vậy khi một phương pháp phân loại quan trọng như vậy mà không có kiến ​​thức thấu đáo về các biến thể được chấp nhận của nó chỉ có vẻ như là nhỏ. Tuy nhiên, đừng để tôi không khuyến khích bạn. Nó sẽ là thú vị anyway. Bạn có sẵn lòng đăng mã ở đây không? ...Ngoài ra, vì quicksort đặc biệt dễ bị tấn công trong các trường hợp xấu nhất, các bài kiểm tra bạn chọn để chạy có thể có ảnh hưởng rất lớn, cũng như sự lựa chọn của các trục xoay. Nói chung, tôi sẽ nói rằng bất kỳ tập dữ liệu nào có số lượng lớn các phần tử tương đương hoặc một phần đã được sắp xếp cao sẽ không bao giờ là lựa chọn tốt cho quicksort - và đã có những cách nổi tiếng để chống lại tình huống đó và các phương pháp sắp xếp thay thế tốt hơn .

+0

Tôi đã làm việc thông qua các cải tiến khác nhau cho quicksorts và tắt trong một vài tháng. Tôi cảm thấy như tôi biết khá rõ về những cải tiến chính bao gồm lựa chọn trục xoay tốt hơn (trung bình-3 hoặc ngẫu nhiên), sử dụng phép lặp thay vì đệ quy (mà bây giờ tôi bỏ qua để đơn giản và chỉ so sánh các hàm đệ quy), phân loại nhỏ hơn phân vùng đầu tiên, sử dụng sắp xếp chèn khi kích thước của một mảng đủ nhỏ, phương pháp converging converging của Sedgewick, và một số khác. Ngoài ra còn có các phương pháp để xử lý các yếu tố lặp đi lặp lại (Cờ Quốc gia Hà Lan và Bentley-McIlroy) –

+0

Tôi cũng đã cố gắng để tìm thấy sự cải thiện của tôi bởi vì tôi nghĩ rằng ai đó đã nghĩ nó, nhưng tôi đã không thể tìm thấy nó ở bất cứ đâu . –

+0

@Justin Tôi thấy kỳ lạ là bạn có một mảng kiến ​​thức về chủ đề của quicksort, đủ để làm cho bạn tin rằng bạn đã cải thiện thuật toán, nhưng không biết cách kiểm tra cải tiến của bạn ngay cả đến điểm không cô lập cải tiến vô hướng do môi trường phát triển và điều hành của bạn cung cấp. –

7

Nếu bạn đã thực sự thực hiện một bước đột phá và có toán học để chứng minh điều đó, bạn nên cố gắng để nó được xuất bản trong Journal of the ACM. Nó chắc chắn là một trong những tạp chí uy tín nhất cho khoa học máy tính.

Điều tốt nhất thứ hai là một trong số IEEE journals chẳng hạn như Transactions on Software Engineering.

+0

Yea, trước tiên hãy thực hiện một số phân tích về thuật toán của bạn. Cụ thể hơn: tính số lượng so sánh dự kiến ​​và hoán đổi và thực hiện phân tích trường hợp xấu nhất. Nếu bạn gửi trong ý tưởng của bạn mà không cần phải thực hiện nghiên cứu thích hợp, sau đó tôi nghi ngờ họ sẽ bao giờ mất ý tưởng của bạn nghiêm trọng. – marcusklaas

Các vấn đề liên quan