Mục đích của việc phân cụm này là để đơn giản hóa việc hiển thị các ký hiệu điểm: khi nhiều điểm gần nhau trên bản đồ, chúng sẽ được thay thế bằng một ký hiệu duy nhất để biểu thị một nhóm.
Các yêu cầu chỉ ra nhu cầu về một giải pháp thích ứng đơn giản : các biểu tượng điểm có thể được cập nhật và khi người dùng phóng to, các biểu tượng khác nhau sẽ xuất hiện ở các vị trí khác nhau trên phạm vi bản đồ (hoặc màn hình).
Một ứng cử viên xuất sắc rõ ràng là một phần tư khu vực .
Có một phương pháp đơn giản hơn sẽ hoạt động như một phần tư khu vực. Nó đòi hỏi ít mã hóa hơn, không tạo ra cấu trúc dữ liệu trước, nhưng bạn phải trả một mức giá (nhỏ) bằng cách thực hiện một số tính toán nhanh chóng trong quá trình phóng to và xoay. Chỉ cần lưới bản đồ . Cụ thể, giả sử có các ký hiệu điểm n được vẽ trong phạm vi hiện tại của bản đồ có chiều dài dx và chiều cao của dy . Liên quan đến nguồn gốc của bản đồ, các ký hiệu cần được vẽ tại tọa độ ( x [i] , y [i] ), i = 1, 2, ..., n . Chọn một ô lưới của c phân vùng bản đồ thành một lưới các ô. Các tế bào trong đó vị trí (x , y ) thuộc hàng j ( y ) = Tầng [ y / c ] và cột j ( x ) (đếm từ 0, với các hàng đi từ dưới lên trên và các cột từ trái sang phải). Bạn có thể coi bất kỳ ô nào nhận được hai hoặc nhiều điểm là một "cụm". Biểu tượng cụm có thể được vẽ ở trung tâm của ô, có tọa độ. ( J + c / 2, k + c / 2).
Điều này dẫn đến giải pháp sau đây, được trình bày dưới dạng mã giả:
m = Floor(dy/c)+1
n = Floor(dx/c)+1
Dimension a[m,n] = 0
For each (x[i], y[i]) to be displayed:
Increment( a[ j(y[i]), j(x[i]) ] )
End for
For each (x[i], y[i]) to be displayed:
row = j(y[i])
col = j(x[i])
If a[row, col] > 1:
Draw a symbol for a cluster of k points at (c*(col+0.5), c*(row+0.5))
a[row, col] = 0
Else
Draw a point symbol at (x[i], y[i])
End if
End for
Rõ ràng gánh nặng tính toán của thuật toán là O (# điểm) trong thời gian và O (dx * dy / c ^ 2) trong bộ lưu trữ. Sự đánh đổi liên quan đến việc chọn các tế bào c là:
c nên càng lớn càng tốt: Dung lượng lưu trữ tỷ lệ nghịch với c ^ 2: giá trị nhỏ của c có nghĩa là lượng RAM lớn. (Lưu trữ có thể được giảm xuống O (# điểm) bằng cách sử dụng các mảng hoặc từ điển thưa thớt.)
c nên càng lớn càng tốt: Hai ký hiệu (điểm hoặc cụm) sẽ không bao giờ gần hơn c / 2.
c nên càng nhỏ càng tốt: mọi ký hiệu cụm đại diện cho các vị trí không quá c / sqrt (2) cách xa nó.
c nên càng nhỏ càng tốt: Các giá trị lớn của c có xu hướng tạo ra nhiều cụm và cho phép một vài điểm riêng lẻ xuất hiện.
Hãy phân tích nhanh về (4). Như một điểm khởi hành, giả sử các vị trí được ánh xạ xảy ra thống nhất ngẫu nhiên và độc lập với nhau. Số lượng ô là N ( c ) = (Tầng ( dx / c ) +1) * (Tầng ( dy / c ) +1), trong đó - ít nhất là đối với các giá trị lớn hơn của c - là tỷ lệ trực tiếp với c ^ 2. Sự phân bố số lượng tế bào sẽ theo một định luật Poisson với cường độ lambda = n / N ( c ) = n * c ^ 2 / ( dx * dy). Số lượng cụm dự kiến bằng
e ( c ) = n (1 - exp (- lambda ) (1 + lambda )).
Điều này trở nên nhỏ hơn khi lambda co lại thành 0; đó là, khi các tế bào c ngày càng nhỏ hơn. Điểm của phân tích này là công thức trước cho phép bạn dự đoán có bao nhiêu cụm, vì vậy bạn có thể chọn giá trị ban đầu của c mà e ( c ) dưới giá trị chấp nhận được (trong khi vẫn đủ lớn để giới hạn RAM yêu cầu). Không có giải pháp dạng đóng, nhưng một vài bước Newton-Raphson sẽ hội tụ nhanh chóng.
Cách tiếp cận này rất năng động - đủ nhanh để có thể tính toán phân cụm và kết quả phân cụm theo từng mức thu phóng và pan, và không yêu cầu cấu trúc dữ liệu được tính toán trước - rằng "sửa đổi gia tăng" mong muốn khi dữ liệu được cập nhật sẽ tự động xảy ra.