Một số thuật toán phân cụm có thể sử dụng các cấu trúc chỉ mục không gian. Điều này cho phép ví dụ DBSCAN và OPTICS chạy trong thời gian (miễn là chỉ mục cho phép truy vấn ).O ( log n )O(nlogn)O(logn)
Rõ ràng, một thuật toán chạy trong độ phức tạp này không xây dựng ma trận khoảng cách .O(n2)
Đối với một số thuật toán, chẳng hạn như phân cụm theo phân cấp với liên kết đơn và liên kết hoàn chỉnh, có các thuật toán tối ưu hóa có sẵn (SLINK, CLINK). Chỉ là hầu hết mọi người sử dụng bất cứ điều gì họ có thể nhận được và bất cứ điều gì dễ thực hiện. Và phân cụm phân cấp dễ thực hiện một cách ngây thơ, sử dụng lần lặp trên ma trận khoảng cách (dẫn đến thuật toán ...).n 2 O ( n 3 )nn2O(n3)
Tôi không biết một danh sách đầy đủ so sánh các thuật toán phân cụm. Có lẽ có hơn 100 thuật toán phân cụm. Có ít nhất một chục biến thể k-mean, ví dụ. Thêm vào đó, có độ phức tạp thời gian chạy cũng như độ phức tạp của bộ nhớ; có trường hợp trung bình và trường hợp xấu nhất. Có sự khác biệt lớn về triển khai (ví dụ: liên kết đơn được đề cập ở trên và các triển khai DBSCAN không sử dụng chỉ mục và do đó nằm trong và trong khi chúng không cần lưu trữ ma trận khoảng cách đầy đủ , sau đó họ vẫn cần tính tất cả các khoảng cách theo cặp). Thêm vào đó là hàng tấn thông số. Đối với phương tiện ,n × n k O ( n 2 ) O ( n ) O ( n log n ) O ( n )O(n2)n×nklà rất quan trọng Đối với hầu hết mọi thuật toán, hàm khoảng cách tạo ra sự khác biệt rất lớn (bất kỳ nhiều triển khai nào chỉ cho phép khoảng cách Euclide ...). Và một khi bạn có được các hàm khoảng cách đắt tiền (ngoài những thứ tầm thường như Euclide), số lượng tính toán khoảng cách có thể nhanh chóng là phần chính. Vì vậy, sau đó bạn cần phân biệt giữa tổng số thao tác và số lượng tính toán khoảng cách cần thiết. Vì vậy, một thuật toán trong các hoạt động nhưng chỉ tính toán khoảng cách có thể dễ dàng vượt qua thuật toán trong cả hai, khi các hàm khoảng cách thực sự đắt chính hàm là ).O(n2)O(n)O(nlogn)O(n)