Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 按最近点对位置数组排序_Algorithm - Fatal编程技术网

Algorithm 按最近点对位置数组排序

Algorithm 按最近点对位置数组排序,algorithm,Algorithm,所以问题是这样的: 给定一个位置X和一个位置数组,我想得到一个数组 最接近位置X的位置的数量,换句话说,按 最近的距离 我解决这个问题的方法是迭代每个位置数组,计算X和特定位置之间的距离,存储该距离,并使用比较器按距离对位置进行排序。完成!有更好的方法吗?假设排序是合并排序,它应该是O(n logn) 您应该尝试使用最小堆ds来实现这一点。只需继续使用key=diff of X将位置存储在堆中,如果使用基于比较的排序,那么该位置就不会比O(n log n)更好。但是,如果您想讨论代码的微观优化,

所以问题是这样的:

给定一个位置X和一个位置数组,我想得到一个数组 最接近位置X的位置的数量,换句话说,按 最近的距离


我解决这个问题的方法是迭代每个位置数组,计算X和特定位置之间的距离,存储该距离,并使用比较器按距离对位置进行排序。完成!有更好的方法吗?假设排序是合并排序,它应该是O(n logn)

您应该尝试使用最小堆ds来实现这一点。只需继续使用key=diff of X将位置存储在堆中,如果使用基于比较的排序,那么该位置就不会比O(n log n)更好。但是,如果您想讨论代码的微观优化,有些想法包括

  • 按平方距离排序;没有理由使用sqrt()-sqrt()是昂贵的

  • 仅在必要时计算平方距离;如果| dx1 |如果我理解正确,您可以对多个查询快速执行此操作-如中所示,给定多个X值,您不必每次都对解决方案数组重新排序。以下是您的操作方法:

  • 对数组进行初始排序(O(n logn)-调用此预处理)
  • 现在,在每个查询X上,二进制搜索数组中的X(或小于X的最近数字)。保持两个索引i和j,一个指向当前位置,一个指向下一个位置。其中一个显然是列表中最接近X的数字。选择距离较小的一个,并将其放入解决方案数组中。现在,如果我被选中,减小i,如果j被选中,增加j。重复此过程,直到所有数字都在解决方案数组中
    这需要对每个查询进行O(n+logn)预处理。当然,如果我们只讨论一个X,这一点也不好

    用矛盾来证明你不能做得更好:

    众所周知,基于比较的排序是对任意数字(可能包括无理数)进行排序的唯一方法,而且它们的性能不可能比n*log(n)时间更好


    如果您在O(n)时间内浏览列表并选择最小的数字,然后将其用作X,然后以某种方式得出一个按距离X排序的数字列表,那么您在不到O(n*log(n))时间内对n个数字进行了排序

    你描述的问题对我来说听起来像是个难题

    因此,如果我正确理解了你的问题,即
    位置
    是多维度量空间中的向量,而
    距离
    是这个空间中的适当度量,那么将
    位置数组
    放在。 您曾经有一些树构建的开销,但是您随后会得到对
    O(logn)
    的搜索


    这样做的一个好处是,假设您只对最近的可用位置
    m
    感兴趣,您不需要每次搜索新的
    X

    时都计算所有
    n
    距离。我假设运行时间相同,O(n log n)?或者它是O(logn),它将是O(nlogn),但它将避免使用额外的空间在单独的DS中存储差异。虽然存储点是有争议的:)实际上,我的例子中的diff也存储在Location类中,所以它不会花费很多,只是在Location类中有一个额外的double来表示diffsThats为什么我说它是有争议的。我认为你已经在做的事情是正确的:)。然而,如果我们知道这些位置的确切输入,问题可能会更快地得到解决。例如,如果我们认为这些位置坐标是整数,并且在a和b之间(两者都不高),那么我们可能会在这里使用基数之类的东西。如果问题更一般,那么你的解决方案似乎是正确的。是的,我认为没有那么详细。。无论如何,感谢堆输入排序,利用数据的好方法。这里的要点是避免每次X发生变化时都进行O(n*log(n))工作。您当前的工作有什么问题?你喜欢改进你答案的哪一部分?面试官问你能做得更好吗,这就是我问的原因。。我喜欢我的解决方案他可能想让你证明为什么你不能做得更好(有一个关于排序算法下限复杂性的证明,它是O(n*logn))@xonegirlz我的道歉-我肯定没有注意到你在存储计算的距离。是的,但我们谈论的是1D。(所以根本没有理由把它摆正。)@muntoo:真的吗?它说我们在哪里可以假设1D?我只看到“位置”被抛来抛去。“给定一个位置X和一组位置”我们不知道什么是
    给定的.Y
    ,所以如果它是二维的,我们就无法对它进行真正的排序<代码>(给定的.X)^2+(?)^2=?
    @muntoo:哦,我明白了。所以我们讨论的是一个一维系统,它是用X来表示初始点的。自然地,在数学中——在编程中也是如此——将许多不同维度空间中的点和向量与字母x、y和z关联是很常见的。如果OP真的想把讨论限制在一维空间,我同意关于欧几里德距离的事情并不那么重要。然而,在这一点上,问题本可以更清楚一些。