Tôi hiện đang phải đối mặt với một vấn đề phân loại khó khăn. Tôi có một bộ sưu tập các sự kiện cần được sắp xếp với nhau (một số comparison sort) và chống lại vị trí tương đối của chúng trong danh sách. Trong điều kiện đơn giản nhất, tôi có danh sách các sự kiện mà mỗi người có một ưu tiên (số nguyên), một khoảng thời gian (giây), và một thời gian sớm nhất mà sự kiện có thể xuất hiện trong danh sách. Tôi cần sắp xếp các sự kiện dựa trên mức độ ưu tiên, nhưng không có sự kiện nào có thể xuất hiện trong danh sách trước thời gian xuất hiện sớm nhất của nó. Đây là một ví dụ để (hy vọng) làm cho nó rõ ràng hơn:Thuật toán sắp xếp cho một vấn đề sắp xếp dựa trên không so sánh?
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration = 2.0, earliestTime = 0.0 };
// assume list starts at 0.0 seconds
List<Event> results = Sort(new List<Event> { a, b, c, d });
assert(results[ 0 ] == a); // 4.0 seconds elapsed
assert(results[ 1 ] == c); // 7.0 seconds elapsed
assert(results[ 2 ] == b); // 12.0 seconds elapsed
assert(results[ 3 ] == d); // 14.0 seconds elapsed
}
Mục "b" phải đến cuối cùng vì nó không được phép bắt đầu cho đến 6,0 giây trong danh sách, do đó, nó được hoãn lại và "c" được để đi trước "b" mặc dù ưu tiên của nó thấp hơn. (Hy vọng rằng ở trên giải thích vấn đề của tôi, nếu không cho tôi biết và tôi sẽ chỉnh sửa nó.)
Ý tưởng hiện tại của tôi là sử dụng insertion sort để quản lý quá trình sắp xếp. Không giống như nhiều thuật toán phân loại phổ biến khác, sắp xếp chèn sẽ quyết định thứ tự của danh sách một lần và theo thứ tự. Vì vậy, đối với mỗi chỉ số tôi sẽ có thể tìm thấy sự kiện ưu tiên thấp nhất tiếp theo có thời gian xuất hiện sớm nhất sẽ được thỏa mãn.
Tôi hy vọng tìm được tài nguyên về sắp xếp thuật toán và cấu trúc dữ liệu để giúp tôi thiết kế giải pháp tốt cho "sắp xếp" sự cố này. Vấn đề thực sự của tôi thực sự phức tạp hơn điều này: phân loại phân cấp, bộ đệm biến giữa các sự kiện, nhiều ràng buộc thời gian không liên tục, vì vậy càng có nhiều thông tin hoặc ý tưởng càng tốt. Tốc độ và không gian không thực sự là một mối quan tâm. Độ chính xác trong phân loại và bảo trì mã là một mối quan tâm.
Edit: Làm rõ (dựa trên ý kiến)
- Sự kiện tiêu thụ toàn bộ thời gian của họ (có nghĩa là không có sự chồng chéo của các sự kiện cho phép)
- Sự kiện phải xảy ra tại hoặc sau earliestTime của họ, chúng không thể xảy ra trước thời gian sớm nhất của chúng.
- Sự kiện có thể xảy ra muộn hơn earliestTime họ nếu sự kiện ưu tiên thấp hơn tồn tại
- Sự kiện không thể bị gián đoạn
- Có một khoảng thời gian tối đa tổng của tất cả các sự kiện mà có thể phù hợp trong một danh sách. Điều này không được hiển thị ở trên. (Trong thực tế, thời gian của tất cả các sự kiện sẽ lớn hơn nhiều so với thời gian tối đa của danh sách thời gian.)
- Không thể có bất kỳ khoảng trống nào. (Hiện tại không có lỗ để thử và điền lại.)
Edit: trả lời
Trong khi David Nehme đã đưa ra câu trả lời tôi đã chọn, tôi muốn chỉ ra rằng câu trả lời của ông là một loại chèn vào tim và một số người khác đã cung cấp câu trả lời loại câu trả lời. Điều này xác nhận với tôi rằng một loại chèn chuyên dụng có lẽ là con đường để đi. Nhờ tất cả các bạn cho câu trả lời của bạn.
Câu hỏi: Khoảng trống có được phép không? Bạn có muốn lấp đầy chúng không? tức là bạn có muốn a, d, b, c làm giải pháp đảm bảo b xảy ra tại t = 6, thay vì t = 7 không? –
# Có thời lượng tối đa tổng của tất cả các sự kiện có thể phù hợp trong danh sách. >> điều này có nghĩa là gì. Một số sự kiện sẽ không được lên lịch? –
# Không thể có bất kỳ khoảng trống nào. (Không có lỗ để thử và điền lại.) Bạn có chắc chắn rằng điều này là có thể? Ví dụ, chỉ hai sự kiện này. Sự kiện a = Sự kiện mới {duration = 4.0, thời gian sớm nhất = 0.0}; Sự kiện b = Sự kiện mới {duration = 5.0, thời gian sớm nhất = 6.0}; –