如果一個點 p 在距離 ε 範圍內有至少 minPts 個點(包括自己),則這個點被稱為核心點,那些 ε 範圍內的則被稱為由 p 直接可達的。根據定義,沒有任何點是由非核心點直接可達的。
如果存在一條道路p1, ..., pn ,有 p1 = p和pn = q, 且每個 pi+1 都是由 pi 直接可達的(道路上除了 q 以外所有點都一定是核心點),則稱 q 是由 p 可達的。
所有不由任何點可達的點都被稱為局外點。
如果 p 是核心點,則它與所有由它可達的點(包括核心點和非核心點)形成一個集群,每個集群擁有最少一個核心點,非核心點也可以是集群的一部分,但它是在集群的「邊緣」位置,因為它不能達至更多的點。
「可達性」(英文:Reachability )不是一個對稱關係,因為根據定義,沒有點是由非核心點可達的,但非核心點可以是由其他點可達的。所以為了正式地界定 DBSCAN 找出的集群,進一步定義兩點之間的「連結性」(英文:Connectedness) :如果存在一個點 o 使得點 p 和點 q 都是由 o 可達的,則點 p 和點 q 被稱為(密度)連結的,而連結性是一個對稱關係。
DBSCAN(D, eps, MinPts) {
C = 0
for each point P in dataset D {
if P is visited
continue next point
mark P as visited
NeighborPts = regionQuery(P, eps)
if sizeof(NeighborPts) < MinPts
mark P as NOISE
else {
C = next cluster
expandCluster(P, NeighborPts, C, eps, MinPts)
}
}
}
expandCluster(P, NeighborPts, C, eps, MinPts) {
add P to cluster C
for each point P' in NeighborPts {
if P' is not visited {
mark P' as visited
NeighborPts' = regionQuery(P', eps)
if sizeof(NeighborPts') >= MinPts
NeighborPts = NeighborPts joined with NeighborPts'
}
if P' is not yet member of any cluster
add P' to cluster C
}
}
regionQuery(P, eps)
return all points within P's eps-neighborhood (including P)
注意這個算法可以以下方式簡化:其一,"has been visited" 和 "belongs to cluster C" 可被結合起來,另外 "expandCluster" 副程式不必被抽出來,因為它只在一個位置被调用。以上算法沒有以簡化方式呈現,以反映原本出版的版本。另外,regionQuery 是否包含 P 並不重要,它等價於改變 MinPts 的值。