public class DBScan {
//设定一个距离分步阶梯 默认3为基础一级精度
private static final int MAX_STEP = 3;
public static final Long calcMostPoint(List list,int PRE) {
long selid = 0;
double begin_value = 0;
Double[] plusArray = new Double[list.size()];
//第一步 计算每个点与原始点的距离 存入 plusArray
for (int i = 0; i < list.size(); i++) {
HashMap map = (HashMap) list.get(i);
if (i == 0) begin_value = new Double(map.get("value").toString());
long id = new Long(map.get("id").toString());
double value = new Double(map.get("value").toString());
plusArray[i] = value - begin_value;
}
//第二步 计算距离上下限距离
Double[] plusTemp = plusArray.clone();
double plus_distance = plusTemp[plusTemp.length - 1] - plusTemp[0];
//第三步 设置精度
double precision = plus_distance / (MAX_STEP+PRE);
//第四步 计算每个数以精度为半径 涵盖的数量
Integer[] cn = new Integer[plusArray.length];
for (int i = 0; i < plusArray.length; i++) {
int count = 0;
for (int j = 0; j < plusTemp.length; j++) {
double d = Math.abs(plusArray[i] - plusTemp[j]);
if (d < precision) count++;
}
cn[i] = count;
}
//第五步 计算 cn中最大的点 及位置
Integer[] cntemp = cn.clone();
int pos = getPos(cn, cntemp[cn.length - 1]);
if (pos==-1) return null;
//第六步 找出 list 中对应pos的id
HashMap map = (HashMap) list.get(pos);
selid = new Long(map.get("id").toString());
return selid;
}
public static int findValue(Integer[] array, int key) {
int left = 0; //数组第一个元素索引值
int right = array.length - 1; //数组最后一个元素的索引值
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] < key) {
left = mid + 1;
right = array.length;
mid = (right - left) / 2;
} else if (array[mid] > key) {
right = mid - 1;
left = 0;
mid = (right - left) / 2;
} else if (array[mid] == key) {
return mid;
}
}
return -1;
//元素不在该数组中 返回 -1
}
public static int getPos(Integer[] array, int key) {
for(int i=0;i<array.length;i++){
if(array[i]==key) return i;
}
return -1;
}
}
实现一个基于密度的聚类算法
最新推荐文章于 2025-12-02 15:32:05 发布
2726

被折叠的 条评论
为什么被折叠?



