Data structures 如果有一个超过50000的大型数据库,我如何快速搜索所需的点
我有一个超过50000点的数据库。每个点有3个维度。让我们给它们贴上标签[i,j,k] 我希望找出它在某些方面比另一点更好的地方 例如,对象A[10103]和对象B[114],对象C[1111],对象D[1110] 那么期望的输出将是A和D(因为C比它们都糟糕,B在维度[k]中击败A,但在维度[k]中击败B) 我尝试了一些基本的比较算法(例如if-else语句),当我减少数据库大小时,这些算法确实有效。但是对于50000,需要10分钟以上才能找到所需的输出,这当然不是一个好的解决方案 有人能给我推荐一两种最快的方法吗 谢谢 编辑:Data structures 如果有一个超过50000的大型数据库,我如何快速搜索所需的点,data-structures,Data Structures,我有一个超过50000点的数据库。每个点有3个维度。让我们给它们贴上标签[i,j,k] 我希望找出它在某些方面比另一点更好的地方 例如,对象A[10103]和对象B[114],对象C[1111],对象D[1110] 那么期望的输出将是A和D(因为C比它们都糟糕,B在维度[k]中击败A,但在维度[k]中击败B) 我尝试了一些基本的比较算法(例如if-else语句),当我减少数据库大小时,这些算法确实有效。但是对于50000,需要10分钟以上才能找到所需的输出,这当然不是一个好的解决方案 有人能给我
谢谢,我想我已经做到了您可以对代码进行许多优化:
{
vector<bool> isinterst(n, true);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if (isinterst[i]) {
bool worseelsewhere=false;
for (int k=0; k<d; k++)
{
if (point[i][k]<point[j][k])
{
worseelsewhere=true;
break; //you can exit for loop if worseelsewhere is set to true
}
}
if(worseelsewhere == false)
{
continue; //skip the rest if worseelsewhere is false
}
bool worse=true;
for (int k=0; k<d; k++)
{
if (point[i][k]>point[j][k])
{
worse=false;
break; //you can exit for loop if worse is set to false
}
}
if (worseelsewhere && worse) {
isinterst[i]=false;
//cout << i << " Not desirable " << endl;
}
}
}
}
{
向量isinterst(n,真);
对于(int i=0;i您可以对代码进行许多优化:
{
vector<bool> isinterst(n, true);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if (isinterst[i]) {
bool worseelsewhere=false;
for (int k=0; k<d; k++)
{
if (point[i][k]<point[j][k])
{
worseelsewhere=true;
break; //you can exit for loop if worseelsewhere is set to true
}
}
if(worseelsewhere == false)
{
continue; //skip the rest if worseelsewhere is false
}
bool worse=true;
for (int k=0; k<d; k++)
{
if (point[i][k]>point[j][k])
{
worse=false;
break; //you can exit for loop if worse is set to false
}
}
if (worseelsewhere && worse) {
isinterst[i]=false;
//cout << i << " Not desirable " << endl;
}
}
}
}
{
向量isinterst(n,真);
对于(int i=0;i,如果不知道您对“更好”的定义,在这里提出具体建议有点困难。但是,我注意到,您似乎在处理空间数据。处理空间数据时经常使用的数据结构是R-Tree()。这为多维信息提供了有效的索引
也许boost::geometry库中有一些工具可以提供帮助:在不知道“更好”的定义的情况下,这里很难给出具体的建议。但是,我注意到,您似乎在处理空间数据。处理空间数据时经常使用的数据结构是R树()。这为多维信息提供了有效的索引
也许boost::geometry库中有一些工具可以提供帮助:您正在寻找帕累托最优点。这些点形成一个凸包。这在二维中最容易看到。使用迭代算法确定前N个点的帕累托最优点。对于N=1,这只是第一个点。对于N=2,下一个点是do或do被第一个淘汰(第二次淘汰),支配第一个(第一次淘汰),位于左上方或右下方(也是帕累托最优)
您可以通过保持凸包的简化上下界来加快分类速度,例如,仅单点{minX,minY,minZ}
和{maxX,maxY,maxZ}
。如果p={x,y,z}
由{minX,minY,minZ}控制
那么它被目前为止的所有帕累托最优点支配,并且可以被丢弃。如果P支配{maxX,maxY,maxZ}
,它也支配目前为止的所有帕累托最优点,您可以丢弃所有这些点
快速O(对数N)初始步骤是首先按X对集合排序,以找到最大X的点,然后按Y排序,以找到最大Y的点,最后按最大Z排序。在N=3子集中查找帕累托最优点很容易,并且可以硬编码。然后可以将此集合用作第一近似值
一个更精确的解决方案是,然后按X+Y
、X+Z
、Y+Z
和X+Y+Z
进行排序,并找到这些最大值。同样,这会产生一些很好的初始候选点,因为它们将支配许多其他点
例如,在您的情况下,按X排序和按Y排序都将产生点A;按Z排序将产生点D,两者都不占优势,然后您可以快速丢弃B和C。您正在寻找帕累托最优点。这些点形成凸壳。这在二维中最容易看到。使用迭代算法确定帕累托最优点到前N个点的最佳点。对于N=1,这只是第一个点。对于N=2,下一个点要么由第一个点支配(放弃第二个),要么由第1个点支配(放弃第1个),位于左上方或右下方(也是帕累托最优)
您可以通过保持凸包的简化上下界来加快分类速度,例如,仅单点{minX,minY,minZ}
和{maxX,maxY,maxZ}
。如果p={x,y,z}
由{minX,minY,minZ}控制
那么它被目前为止的所有帕累托最优点支配,并且可以被丢弃。如果P支配{maxX,maxY,maxZ}
,它也支配目前为止的所有帕累托最优点,您可以丢弃所有这些点
快速O(对数N)初始步骤是首先按X对集合排序,以找到最大X的点,然后按Y排序,以找到最大Y的点,最后按最大Z排序。在N=3子集中查找帕累托最优点很容易,并且可以硬编码。然后可以将此集合用作第一近似值
一个更精确的解决方案是,然后按X+Y
、X+Z
、Y+Z
和X+Y+Z
进行排序,并找到这些最大值。同样,这会产生一些很好的初始候选点,因为它们将支配许多其他点
例如,在您的情况下,按X排序和按Y排序都将产生点A;按Z排序将产生点D,两者都不占优势,然后您可以快速放弃B和C。在这种情况下,什么是“期望点”?您当前使用的算法/查询中有哪些性能不令人满意?对“期望输出”不太清楚,您是否介意重新措辞并澄清描述?看起来您正在选择帕累托最优点。在这种情况下,“期望点”是什么?您当前使用的性能不令人满意的算法/查询是什么?对“期望输出”的描述“不太清楚,你介意重新措辞并澄清描述吗?看起来你在选择帕累托最优点。