Có những trường hợp quan trọng khi người ta cần biết cách lập trình các thuật toán sắp xếp trong lập trình trò chơi? [đóng cửa]


7

Vâng, tôi đã đọc một chút về cách sắp xếp các thuật toán trên wikipedia, chủ đề này có vẻ rộng lớn, đặc biệt là khi xử lý một số trường hợp trong đó một số thuật toán nhanh hơn các thuật toán khác.

Điều đó có thể cần một số tổng hợp nhanh chóng, nhưng trước đó, ai đó có thể cho tôi biết nếu có các môn học lập trình trò chơi mà việc sắp xếp là cần thiết? (hoặc tùy chọn, cho các vấn đề thời gian thực hiện).

Có lẽ trong một bộ đệm sâu?

Câu trả lời:


19

Tôi sẽ nói có, với câu hỏi của bạn như phrased, nhưng với những cảnh báo quan trọng.

Vâng, bạn cần biết cách sắp xếp mọi thứ trong phát triển trò chơi lập trình. Có rất nhiều cách sắp xếp diễn ra, trong nhiều tình huống khác nhau. Không, bạn không cần biết chi tiết về cách tất cả (hoặc thậm chí nhiều) thuật toán sắp xếp khác nhau hoạt động, hầu như luôn luôn đủ để tìm kiếm nó trong một tài liệu tham khảo (trực tuyến hoặc sách) khi bạn cần.

Điều quan trọng không phải là cách thức và lý do của mỗi thuật toán, đó là sự hiểu biết sâu sắc hơn về lý do tại sao một số thuật toán hoạt động tốt hơn trong một số tình huống. Đó là sự hiểu biết chính xác về tình huống mà bạn có (tôi có cần sắp xếp tại chỗ không, tôi có thể chèn các mục vào danh sách với giá rẻ không). Nó biết các thuật toán phổ biến và linh hoạt nhất, không có nhiều chi tiết về cách chúng hoạt động, nhưng nhiều tình huống không nên sử dụng.

Và cuối cùng, việc biết hiệu suất sắp xếp là rất quan trọng (khi bạn có nhiều, nhiều mặt hàng và bạn cần sắp xếp chúng thật nhiều) và khi nó không quá quan trọng (khi bạn chỉ có một vài mặt hàng và / hoặc bạn chỉ cần sắp xếp khi danh sách thay đổi). Trong trường hợp sau, chỉ cần ném danh sách qua quicksort. Nếu các đối tượng của bạn lớn, thì hãy sắp xếp một danh sách các chỉ mục cho các đối tượng chứ không phải chính các đối tượng đó. Trong hơn chục năm qua tôi đã phát triển một cách chuyên nghiệp, tôi có thể đếm số lần tôi cần một thuật toán sắp xếp cụ thể hơn hoặc điều chỉnh cụ thể hơn và có lẽ ít hơn 20 lần.


2
bạn đã sắp xếp danh sách các thuật toán cụ thể điều chỉnh chưa?
slf

9

Vâng, bạn sắp xếp mọi thứ mọi lúc. Một ví dụ phổ biến là các cuộc gọi đồ họa.

Cho dù bạn cần biết cách thực hiện mọi thuật toán sắp xếp ngoài đỉnh đầu là một câu hỏi khác, nhưng ít nhất bạn nên có thể trả lời các câu hỏi như:

  • Tôi sử dụng loại nào nếu tôi cần một loại tại chỗ với chi phí ngăn xếp tối thiểu? (Quicksort lặp hoặc đệ quy đuôi.)
  • Làm thế nào tôi có thể sắp xếp một danh sách lớn các chuỗi càng nhanh càng tốt? (Burstsort, radix sort hoặc quick sort tùy theo kiến ​​trúc.)
  • Làm cách nào để sắp xếp các tài sản này theo thứ tự phụ thuộc? (Sắp xếp theo cấu trúc liên kết.)
  • Tôi chỉ cần sắp xếp một số dữ liệu chưa biết một cách hợp lý? (Timsort, quicksort.)

Tất cả các tình huống này xuất hiện trong tất cả các loại phần mềm, bao gồm các trò chơi.

Một lần nữa, bạn không cần tất cả những ghi nhớ này, nhưng bạn cần có khả năng mở một cuốn sách sắp xếp các thuật toán, đọc một mô tả ngắn gọn về từng thuật toán và chọn đúng. Điều đó có nghĩa là hiểu các yêu cầu về thời gian và không gian (big-O) và có ý tưởng về cách các thuật toán sắp xếp khác nhau hoạt động (hợp nhất, chọn, hoán đổi).

Các thuật toán sắp xếp cũng có tính năng nổi bật trong các cuộc phỏng vấn việc làm; thông thường các câu hỏi không phải là "hiện thực quicksort", nhưng "đây là một mô tả về các loại đầu vào, thuật toán sắp xếp nào hoạt động tốt cho việc này?"


5

Có rất nhiều trường hợp bạn có thể cần sắp xếp mọi thứ, tùy thuộc vào loại chương trình trò chơi bạn đang làm:

  • Sắp xếp các đối tượng mờ đục theo khoảng cách từ máy ảnh trước khi vẽ ( thuật toán họa sĩ đảo ngược )
  • Sắp xếp các hình tam giác trong suốt theo khoảng cách từ máy ảnh trước khi vẽ chúng theo thứ tự ngược lại.
  • Loại biểu đồ phụ thuộc mục tiêu để xây dựng một trật tự hợp lý để cố gắng đạt được mục tiêu (hữu ích trong AI hoặc đưa ra gợi ý tự động).
  • Sắp xếp các đối tượng dọc theo một số phối hợp để thử nghiệm va chạm nhanh.
  • Sắp xếp các sự kiện theo thời gian để tìm ra cái nào sẽ xử lý tiếp theo.
  • Sắp xếp các đối tượng theo id duy nhất để có được thứ tự chính tắc để so sánh hoặc tuần tự hóa.
  • Sắp xếp thống kê hồ sơ để tìm ra khu vực nào sẽ có lợi nhất để tối ưu hóa.

Thật hiếm khi bạn cần thực hiện thuật toán sắp xếp của riêng mình: nói chung bạn sẽ chỉ chọn một chức năng phù hợp từ thư viện. Nhưng nghiên cứu và viết các thuật toán sắp xếp là cách thực hành tốt để viết và phân tích thuật toán, và kiến ​​thức của bạn sẽ có ích khi chọn một thuật toán tốt từ thư viện hoặc phát hiện ra các trường hợp (hiếm) trong đó các tính năng đặc biệt của vấn đề của bạn rằng bạn có thể cải thiện thói quen thư viện chung.


1

Tôi sẽ chỉ thêm một câu trả lời ngắn ở đây: bảng CAO CẤP ...


1

Hầu hết các ngôn ngữ đi kèm với một thực hiện quicksort mục đích chung tốt.

Chúng không nhất thiết phải đi kèm với việc triển khai các loại ổn định, các loại không so sánh trực tiếp các giá trị, các loại không bị ảnh hưởng khi sử dụng trên dữ liệu được sắp xếp trước, các loại hoạt động tốt trên dữ liệu dựa trên đĩa, sắp xếp hoạt động tốt hơn nếu được cung cấp rất nhiều bộ nhớ, sắp xếp hoạt động mà không cần thêm bất kỳ bộ nhớ nào, sắp xếp một phần có hiệu quả chỉ là một tập hợp con của dữ liệu, các phân vùng chỉ sắp xếp dữ liệu theo ngưỡng xoay vòng, v.v.

Đây là tất cả hữu ích theo thời gian.


-1

Như một câu trả lời tổng quát hơn, ngay cả khi bạn chưa bao giờ thực sự viết thuật toán sắp xếp của riêng mình "trong trường" (xét cho cùng, như bạn không nghi ngờ gì trên Wikipedia, việc sắp xếp giống vườn trung bình của bạn là một vấn đề đã được giải quyết), sắp xếp là một trong những khía cạnh cốt lõi của khoa học máy tính giúp ích cho kiểu tư duy tính toán mà một lập trình viên cần. Hãy nghĩ về nó như là "wax on, wax off" mà bạn học được trước khi bạn nhận ra rằng bạn cũng có thể sử dụng kỹ năng đó cho karate :)


1
"Phân loại giống vườn trung bình của bạn là một vấn đề đã được giải quyết" - Không thực sự. Timsort được phát minh gần đây như năm 2002, vụ nổ năm 2003, v.v. Tôi đã nghe "sắp xếp là một vấn đề được giải quyết" kể từ khi tôi bắt đầu nghiên cứu CS vào đầu những năm 90, và bây giờ chúng tôi có thuật toán sắp xếp tốt hơn rất nhiều.

Đủ công bằng, Joe. Điều tôi muốn nói là "đa dạng khu vườn" là, với mục đích đơn giản là một danh sách <100 mặt hàng (như được tìm thấy trong bảng điểm cao hoặc danh sách vật phẩm tồn kho), bạn không cần toàn bộ rất nhiều tối ưu hóa; quicksort hoặc thậm chí sắp xếp bong bóng sẽ hoạt động tốt và bạn không thực sự cần phải có thuật toán sắp xếp cạnh chảy máu cho điều đó.
Ian Schreiber

Trên thực tế, quicksort thực sự khủng khiếp trong những trường hợp đó, về chi phí cho mỗi món đồ. Có thể trong sơ đồ lớn của chương trình của bạn, điều đó không thành vấn đề vì bạn chỉ sắp xếp nó một lần mỗi ngày và không cần thực hiện nhanh, nhưng nếu tôi có, hãy nói, 1000 danh sách 10 mục (kho vật phẩm của tất cả người chơi trực tuyến trong một MMO, ví dụ), áp dụng quicksort 1000 lần là một trong những giải pháp tồi tệ nhất có thể.
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.