Có chức năng JavaScript tích hợp nào để thực hiện partial sort không? Nếu không, cách tốt nhất để thực hiện nó là gì?Sắp xếp một phần trong JavaScript
Với một mảng không được phân loại của N yếu tố, tôi muốn tìm K yếu tố đó là tối thiểu đối với một số chức năng trọng với. K nhỏ hơn nhiều so với N, vì vậy sẽ không hiệu quả để sắp xếp toàn bộ mảng và lấy các phần tử K đầu tiên.
Tôi sẽ rất vui ngay cả khi có điều gì đó không chuẩn, phụ thuộc vào trình duyệt. Tôi vẫn có thể dự phòng triển khai JavaScript tùy chỉnh.
PS: Đây là thực hiện tùy chỉnh hiện tại của tôi (mà không cần dùng một hàm trọng số vào tài khoản, chỉ cần sắp xếp các yếu tố như họ đang có vì đơn giản):
function bisect(items, x, lo, hi) {
var mid;
if (typeof(lo) == 'undefined') lo = 0;
if (typeof(hi) == 'undefined') hi = items.length;
while (lo < hi) {
mid = Math.floor((lo + hi)/2);
if (x < items[mid]) hi = mid;
else lo = mid + 1;
}
return lo;
}
function insort(items, x) {
items.splice(bisect(items, x), 0, x);
}
function partialSort(items, k) {
var smallest = [];
for (var i = 0, len = items.length; i < len; ++i) {
var item = items[i];
if (smallest.length < k || item < smallest[smallest.length - 1]) {
insort(smallest, item);
if (smallest.length > k)
smallest.splice(k, 1);
}
}
return smallest;
}
console.log(partialSort([5, 4, 3, 2, 1, 6, 7, 8, 1, 9], 3));
Thuật toán đi qua các mảng cho một lần duy nhất, theo dõi danh sách được sắp xếp của k các mục nhỏ nhất cho đến nay, bằng cách sử dụng tìm kiếm nhị phân để chèn các phần tử mới.
Vui lòng đăng các giải pháp thay thế nếu bạn nghĩ rằng chúng có thể nhanh hơn hoặc thanh lịch hơn. Thời gian rất được hoan nghênh.
Tôi không rõ cách thức hoạt động của K. ví dụ: bạn đang tìm kiếm 20% hàng đầu? –
Không, đó là hằng số, thường là * K * = 5, trong khi * N * có thể là vài nghìn. Ví dụ: –
Vì vậy, bạn có hàng nghìn đối thủ cạnh tranh với điểm số và bạn muốn biết ai có 5 điểm số cao nhất? –