Tôi có một danh sách liên kết hình tròn trông giống như thế này:Tách danh sách STL?
4 -> 3 -> 2 -> 5 -> 0 -> 1 -> beginning
Tôi muốn chia danh sách này thành hai đoạn, đảo ngược một trong những phân đoạn, và sau đó gia nhập lại danh sách. Một cái gì đó như thế này:
Split, một O (1) hoạt động 4 ** 3 -> 2 -> 5 ** 0 -> 1 -> beginning
Xếp, một O (n) hoạt động 0 ** 3 -> 2 -> 5 ** 4 -> 1 -> beginning
nỗi, một O (1) hoạt động 0 -> 3 -> 2 -> 5 -> 4 -> 1 -> beginning
STL dường như không có một danh sách liên kết vòng tròn, nhưng tôi hy vọng tôi có thể thoát khỏi với đại diện cho danh sách như là một (chuyển tiếp) danh sách. Này, yêu cầu: * Một cách để phân chia các danh mục vào danh sách con * Một cách để hợp nhất danh sách với nhau
Kết hợp các danh sách con cùng nhau nên dễ sử dụng std::list::splice, và nó phải là một O (1) hoạt động. Yay!
Tuy nhiên, tôi không thể tìm thấy cách O (1) tốt để chia danh sách thành danh sách phụ. One approach là sử dụng trình vòng lặp, nhưng tôi không nghĩ rằng nó hoạt động trong trường hợp của tôi vì danh sách con đi ra khỏi danh sách và tiếp tục lại ở đầu danh sách.
Có cách nào hiệu quả để triển khai thuật toán này bằng STL không? Hay tôi nên từ bỏ và viết thư viện danh sách liên kết tròn của riêng mình?
Cảm ơn!
Nếu tổng hoạt động của bạn là O (N), tại sao bạn muốn hoạt động chia tách của bạn là O (1)? Theo liên kết này, không có triển khai chuẩn nào của danh sách được liên kết vòng tròn.http: //stackoverflow.com/questions/947489/does-a-standard-implementation-of-a-circular-list-exist-for-c –
Cuối cùng , Tôi muốn làm cho chương trình của mình nhanh nhất có thể. O (N) split + O (N) ngược lại sẽ chậm hơn O (1) split + O (N) ngược lại. Ngoài ra, tôi khá chắc chắn rằng tôi có thể lấy đi với luôn luôn đảo ngược danh sách con ngắn nhất, vì vậy hy vọng N là nhỏ trong trường hợp đó. –
Đây có phải là TSP không? Bạn có thể muốn một cây hai cấp thay vì một danh sách liên kết, làm giảm thời gian chạy thành O (sqrt (n)) mà không có hệ số không đổi lớn của cây nhị phân (O (log (n))). –