Tôi được hỏi trong một cuộc phỏng vấn để đưa ra thuật toán O (n) để in một phần tử xuất hiện nhiều hơn n/2 lần trong một mảng, nếu có một yếu tố như vậy. n là kích thước của mảng. Tôi không có bất kỳ đầu mối nào về cách thực hiện việc này. Có ai giúp được không?Thuật toán O (n) để tìm ra phần tử xuất hiện nhiều hơn n/2 lần
Trả lời
Đó là Boyer's Voting algorithm.
Nó cũng là O (1) trong không gian !.
Sửa
Đối với những phàn nàn về kế hoạch trang web màu (như tôi) ... here is the original paper.
Lược đồ màu trên liên kết đó thật khủng khiếp. –
Dưới đây là một số thông tin khác: http://stackoverflow.com/questions/780937/linear-time-voting-algorithm-i-dont-get-it – chrisaycock
Đọc tốt. Đã cho tôi một phút để tìm ra logic tinh tế giúp tránh duy trì số lượng độc lập: "..._ tăng hoặc giảm số đếm ngược theo e là ứng cử viên hiện tại ..." –
Trong psuedocode:
int n = array.length
Hash<elementType,int> hash
foreach element in array
hash[element] += 1
foreach entry in hash
if entry.value > n/2
print entry.key
break
Điều này có được coi là O (2n) không? –
O (2n) == O (n) Tôi tin – Samuel
@Eric Đây sẽ là 'O (n + m)'. Nhân tiện, không có thứ gì như "O (2n)" khi big-O không sử dụng các hệ số không đổi; trong trường hợp này, nó chỉ là 'O (n)'. – chrisaycock
Nó cũng là giá trị trung bình, trong đó có O (n) để tìm cách sử dụng median-of-medians algorithm. Trong C++, bạn có thể thực hiện điều này trong một dòng:
std::nth_element(begin, begin + n/2, begin + n)
Lưu ý rằng mặc dù 'std :: nth_element' chỉ được yêu cầu để được mong đợi O (n) và do đó có khả năng không sử dụng thuật toán trung vị-trung bình. Việc lựa chọn nhanh như sắp xếp có xu hướng tốt hơn trong thực tế so với m-of-m. –
- 1. chuỗi dài nhất xuất hiện n lần
- 2. Thuật toán khoảng cách Levenshtein tốt hơn O (n * m)?
- 3. Tìm phần tử xuất hiện sau khi
- 4. Ví dụ về các thuật toán có các phức tạp O (1), O (n log n) và O (log n)
- 5. Thuật toán đếm số lần xuất hiện của ma trận bên trong một lớn hơn
- 6. O (log n) luôn luôn nhanh hơn O (n)
- 7. PHP preg_match để tìm nhiều lần xuất hiện
- 8. Thuật toán tìm giá trị phần tử của dãy
- 9. Ước tính tần số của một phần tử trong một mảng trong thời gian O (n)
- 10. Mảng có kích thước n, với một phần tử n/2 lần
- 11. Nơi để tìm thấy những gì O (n^2) và O (n) vv có nghĩa là?
- 12. Thuật toán đố phỏng vấn
- 13. Tìm phần tử có khoảng cách dài nhất trong một mảng nhất định trong đó mỗi phần tử xuất hiện hai lần?
- 14. Thuật toán để tìm chuỗi con chung trên các chuỗi N
- 15. Thuật toán để xóa một phần tử trong một danh sách liên kết đơn với O (1) phức tạp
- 16. Tại sao độ phức tạp của thuật toán này là O (1)
- 17. Có một thuật toán O (n) để xây dựng một vùng tối đa không?
- 18. Tìm lượng tử thứ k của tập hợp các phần tử n. (Từ cormen)
- 19. Thuật toán Javascript để tìm các phần tử trong mảng không nằm trong mảng khác
- 20. Thuật toán nhanh nhất để tìm một chuỗi trong một chuỗi các chuỗi?
- 21. Làm thế nào để tìm k lân cận gần nhất với trung bình của n số khác biệt trong thời gian O (n)?
- 22. Thuật toán để tìm tổng số phần tử tối đa trong một mảng sao cho không quá k phần tử nằm liền kề
- 23. Thời gian chạy (lớn O)) của thuật toán
- 24. MySQL Chọn số lượng mục nhập xuất hiện "N" lần
- 25. Thuật toán đề xuất
- 26. Thuật toán để giải quyết câu đố N Queens Domination
- 27. Tìm Element Xảy ra lần b trong một loạt các kích thước n * k + b
- 28. C# Lặp qua một IEnumerable để tính toán sử dụng n phần tử trước đó và n
- 29. Lỗi nhóm iReports - Nhiều lần xuất hiện?
- 30. Kiến trúc MySQL cho n * (n - 1)/2 thuật toán
Bạn có thể sử dụng hàm băm và đếm số phần tử khi quét qua mảng không? – chrisaycock
Không chắc chắn. Tôi nghĩ rằng nên có một giải pháp đơn giản và thanh lịch hơn. – devnull
Ồ. Bạn đã không yêu cầu thanh lịch nhất, chỉ cần O (n) – Samuel