Data structures 如果有一个超过50000的大型数据库,我如何快速搜索所需的点

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分钟以上才能找到所需的输出,这当然不是一个好的解决方案 有人能给我

我有一个超过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。

在这种情况下,什么是“期望点”?您当前使用的算法/查询中有哪些性能不令人满意?对“期望输出”不太清楚,您是否介意重新措辞并澄清描述?看起来您正在选择帕累托最优点。在这种情况下,“期望点”是什么?您当前使用的性能不令人满意的算法/查询是什么?对“期望输出”的描述“不太清楚,你介意重新措辞并澄清描述吗?看起来你在选择帕累托最优点。