Tôi muốn hợp nhất các danh sách được sắp xếp thành một danh sách duy nhất. Làm thế nào là giải pháp này? Tôi tin rằng nó chạy trong thời gian O (n). Bất kỳ sai sót, thiếu hiệu quả hoặc các vấn đề về phong cách rõ ràng?Xem lại mã Java: Hợp nhất các danh sách được sắp xếp thành một danh sách được sắp xếp duy nhất
Tôi không thực sự thích thành ngữ thiết lập cờ cho "đây là lần lặp đầu tiên" và sử dụng nó để đảm bảo "thấp nhất" có giá trị mặc định. Có cách nào tốt hơn không?
public static <T extends Comparable<? super T>> List<T> merge(Set<List<T>> lists) {
List<T> result = new ArrayList<T>();
int totalSize = 0; // every element in the set
for (List<T> l : lists) {
totalSize += l.size();
}
boolean first; //awkward
List<T> lowest = lists.iterator().next(); // the list with the lowest item to add
while (result.size() < totalSize) { // while we still have something to add
first = true;
for (List<T> l : lists) {
if (! l.isEmpty()) {
if (first) {
lowest = l;
first = false;
}
else if (l.get(0).compareTo(lowest.get(0)) <= 0) {
lowest = l;
}
}
}
result.add(lowest.get(0));
lowest.remove(0);
}
return result;
}
Lưu ý: đây không phải là bài tập về nhà, nhưng cũng không phải là mã sản xuất.
Kiểm tra thuật toán "đống". – Anton
Tôi nghĩ rằng việc triển khai của bạn là tốt, nhưng một lưu ý về độ phức tạp của thuật toán: Giả sử số lượng danh sách đầu vào không đổi, đó là O (n). Nhưng vì phương thức của bạn có thể xử lý một số danh sách đầu vào tùy ý, thời gian chạy là O (M * n) - bạn phải tính đến số lượng danh sách biến. Nếu M> log2 (n) +1 (tôi nghĩ), nó sẽ thực sự nhanh hơn để chỉ cần ghép nối tất cả các danh sách và hợp nhất chúng, lấy O (n * log2 (n)). Đây không phải là trường hợp rất thường xuyên, nhưng nó đáng chú ý. – Dathan
Đây là mã phân loại hợp nhất tiêu chuẩn. Bạn có thể tìm thấy nguồn cảm hứng cho cách tối ưu hóa vòng lặp của mình tại http://www.google.com/codesearch#search/&q=merge%5C%20sort&type=cs. Bạn không cần phải có 'boolean' đầu tiên. –