Tôi đã đọc một câu hỏi và tôi đang tìm kiếm đầu vào về cách giải quyết nó:
Các số được tạo ngẫu nhiên và được lưu trữ thành một mảng (mở rộng), Làm thế nào bạn theo dõi trung vị?
Có hai cấu trúc dữ liệu có thể giải quyết vấn đề. Một là cây nhị phân cân bằng, hai là hai đống giữ dấu vết của nửa lớn nhất và nửa nhỏ nhất của các phần tử. Tôi nghĩ rằng hai giải pháp này có cùng thời gian chạy O(n lg n)
, nhưng tôi không chắc về phán đoán của mình.
Cách tốt nhất để theo dõi trung vị là gì?
Nỗ lực của tôi:
Trong câu hỏi này Tôi nghĩ rằng một đống là cách tốt nhất để theo dõi trung vị. Có hai đống, đống lớn và đống nhỏ, không cần phải tuần tự. Đầu tiên, chúng tôi tính giá trị trung bình của các phần tử trong mảng. Nếu phần tử nhỏ hơn giá trị trung bình, chúng ta đặt num vào heap nhỏ. Ngược lại, chúng tôi đặt num vào đống lớn. Nếu số lượng của đống lớn bằng số lượng của đống nhỏ, thì cái lớn nhất trong đống nhỏ và cái nhỏ nhất trong đống lớn là trung vị. Nếu hai heap có kích thước khác nhau, chúng ta chỉ cần bật phần tử gốc từ heap với kích thước lớn hơn và đẩy nó vào phần gốc của heap kích thước nhỏ hơn. Đối với heap lớn, phần tử gốc là phần tử nhỏ nhất và đối với phần heap nhỏ, phần tử gốc là phần tử lớn nhất. Theo cách này, nếu hai đống có cùng kích thước hoặc chênh lệch kỹ thuật số,
Tôi nghĩ giải pháp này có thời gian chạy là O (m * n), m có nghĩa là thời gian chúng ta điều chỉnh các đống không cân bằng.
Đây có phải là cách tốt nhất để theo dõi trung vị?
std::nth_element
ai không?