⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbscan.cpp

📁 聚类研究
💻 CPP
字号:
// Dbscan.cpp: implementation of the Dbscan class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cluster.h"
#include "Dbscan.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Dbscan::Dbscan()
{
	dis = NULL;
	C = NULL;
	p = NULL;
}

void Dbscan::set(int _n,int _Eps,int _Minpts)
{
    dis = new int * [_n];
	for(int i = 0; i < _n; i++)
		dis[i] = new int [_n];
	for(int j = 0; j <_n; j++)
		for(int k = 0; k <_n; k++)
			dis[j][k] = 0 ;
    Eps = _Eps;
	N = _n;
	Minpts = _Minpts;
	p = new point[_n];
	C = new int[_n];
	for(int l = 0 ; l < _n ; l++)
		C[l] = -2;
	Class = 0;
}

void Dbscan::init_dis()
{
	int i,j;
	for(i = 0 ; i < N; i++)
		for(j = 0 ; j < N; j++)
			if( distance(p[i],p[j]) <= Eps*Eps )
				dis[i][j] = 1;
}

Dbscan::~Dbscan()
{
	if( p )
		delete [] p;
	if( C )
		delete [] C;
	if( dis )
	{
		for(int i = 0; i < N; i++)
			delete []dis[i];
		delete [] dis;
	}
}

long Dbscan::distance(point p1,point p2)
{
	long dis = 
		(p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
	return dis;
}

bool Dbscan::Core(int i)
{
	int sum = 0 ;
	for(int j = 0 ; j < N; j++)
		sum += dis[i][j];
	if(sum >= Minpts )
		return true;
	return false;
}

int Dbscan::visit_next()
{
	for(int i = 0; i < N ; i++)
		if( C[i] == -2 )
			return i;
	return -1 ;
}

void Dbscan::Db_scan()
{
	init_dis();
	time_t t;  
	srand((unsigned) time(&t));  
	int p = rand()%N;
	C_n q(N);
	do{
		if( Core(p) )
		{
			q.i = 0; 
			q.j = 0 ;
			q.Id[ q.j++ ] = p;
			C[p] = Class;
			for(int i = 0 ; i < N ; i ++)
				if( dis[p][i] == 1 && C[i] < 0 )
				{
					q.Id[ q.j++ ] = i;
					C[i] = Class;
				} 
			while( q.i < q.j )
			{
				if( Core( q.Id[ q.i ] ) )
					for( int j = 0 ; j < N; j++)
						if( dis[ q.Id[ q.i ] ][j] == 1 && C[ j ]< 0 )
						{
							q.Id[ q.j++ ] = j;
							C[ j ] = Class;
						}
				q.i++;
			}
			Class++;
		}
		else
			C[ p ] = -1;  //noise point
		p = visit_next();
		if( p < 0 )
			break;
	}while( true );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -