Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Javascript Leetcode 973使用快速选择算法的错误_Javascript_Algorithm - Fatal编程技术网

Javascript Leetcode 973使用快速选择算法的错误

Javascript Leetcode 973使用快速选择算法的错误,javascript,algorithm,Javascript,Algorithm,我正在使用快速选择算法来解决此问题,我遇到了以下算法的Max call stack extered错误,但无法找出错误所在: 我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点 (此处,平面上两点之间的距离为欧几里德距离。) 您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序) 代码: /** *@param{number[][]}点 *@param{number}K *@return{number[][]} */ var kClosest=函数(点,K){ 快速选择(点,K,

我正在使用快速选择算法来解决此问题,我遇到了以下算法的
Max call stack extered
错误,但无法找出错误所在:

我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点

(此处,平面上两点之间的距离为欧几里德距离。)

您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序)

代码:

/**
*@param{number[][]}点
*@param{number}K
*@return{number[][]}
*/
var kClosest=函数(点,K){
快速选择(点,K,0,点。长度-1)
返回点。切片(0,K)
};
功能快速选择(点、K、低、高){
如果(低>=高)返回;
const partitionIndex=分区(点、低、高);
如果(分区索引===K-1)
返回;
如果(分区索引>2]
//日志('pivot:',pivot,(低+高)>>2);
while(低getDist(枢轴)){
高--;
}

如果(low)你不能对它们进行
排序吗?排序不会产生最佳的解决方案。快速选择会给你
O(n)
运行时间与排序
O(n log n)
@guest做了什么?我的意思是,你可能对平均情况是正确的,但QuickSelect算法最糟糕的情况下的时间复杂度是
O(n^2)
,它不如具有
O(NlogN)
最坏情况时间复杂度的排序算法。
pivot=points[(低+高)>>2]
是错误的。您需要
pivot=points[(低+高)>>1]
你说得对!它解决了。@MattTimmermans我需要解决一些边缘问题,但在大多数情况下,它现在可以工作了。位移1位数就像/2,这是我的问题,而不是位移2位数。你不可以对它们进行排序吗?排序不会产生最佳解决方案。快速选择会给你
O(n)
运行时vs.排序
O(n log n)
@guest这样做吗?我的意思是,你可能对它的平均情况是正确的,但QuickSelect算法的最坏情况时间复杂度是
O(n^2)
,这低于具有
O(NlogN)
最坏情况时间复杂度的排序算法。
pivot=points[(低+高)>>2]
是错误的。你想要
pivot=points[(低+高)>>1]
你是对的!它修复了它。@MattTimmermans有一些边缘情况我需要修复,但大部分情况下,它现在可以工作了。位移1位就像/2,这是我的问题,而不是位移2
/**
 * @param {number[][]} points
 * @param {number} K
 * @return {number[][]}
 */
var kClosest = function(points, K) {
    quickSelect(points, K, 0, points.length - 1)
    return points.slice(0, K)
};

function quickSelect(points, K, low, high) {
  if (low >= high) return;
  const partitionIndex = partition(points, low, high);
  if (partitionIndex === K - 1) 
    return;
  if (partitionIndex < K - 1) {
    quickSelect(points, K, partitionIndex + 1, high);
  } else {
    quickSelect(points, K, low, partitionIndex - 1);
  }
}

function partition(points, low, high) {
  const pivot = points[(low+high)>>2]
  //console.log('pivot:', pivot, (low+high)>>2);
  
  while(low <= high){
    while(getDist(points[low]) < getDist(pivot)){
      low++;
    }
    while(getDist(points[high]) >getDist(pivot)){
      high--;
    }
    
    if(low <= high){
      swap(points, low, high);
      low++;
      high--;
    }
  }
  
  return low;
}

function getDist(point) {
  return point[0] * point[0] + point[1] * point[1];
}

function swap(arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
}