美文网首页
JS二分法与二维数组的查找

JS二分法与二维数组的查找

作者: 下一站深圳 | 来源:发表于2018-03-15 10:48 被阅读0次

假如我们现在有个二维数组,数据量比较大,规律是: 每一行都是增加的,每一列也是增加的,即后面的数比前面的大。如下面的数组a。 如何查找某个元素在里面的坐标以及个数呢?
因为考虑二维数组的数据量很大,我们不可能全部遍历,所以采用二分法。
(右上角的数字就是该行最大,所在列最小的数字。如果这个数比要找的数还大,那么它之后的列就不需要再找,以这个规律以及二分法定位需要查找的最大列数来提高查询)。直接上例子

var a = [
  [1,2,8,9],
  [2,4,9,12],
  [4,7,10,13],
  [6,8,11,15]
]

// 查询最大列数
function halfFind(arr, num) {
  var max_index =  arr[0].length -1
  var min_index =  0
  var ret;
  if (arr[0][max_index] <= num) {
      return max_index
  }
  do {
    var half_index = Math.ceil((max_index + min_index)/2)
    var value = arr[0][half_index]
    if( value > num){
       max_index = half_index
    } else {
       min_index = half_index
    }
    ret = min_index
  } while (max_index - min_index >1)
  return ret
}

// 垂直查找最大行数
function halfFind_column(arr, num, column, init_min_index) {
   var max_index = arr.length -1
   var min_index = init_min_index || 0
   var ret
   if (arr[max_index][column] == num) {
      return max_index
   }
   do {
     var half_index = Math.ceil((max_index + min_index)/2)
     var value = arr[half_index][column]
     if(value > num) {
       max_index = half_index
     } else {
       min_index = half_index
     }
     ret = min_index
   } while (max_index - min_index >1)
   return ret
}
   
function getIndex(arr, num) {
  // 边界判定
  if(arr[0][0] > num || arr[arr.length - 1][arr[0].length - 1] < num ) {
     return -1
  }
 
  // 需要计算的最大列[0,column]列数区间
  var column = halfFind(arr, num)
  var result_arr = []
  var v_index = 0
  for (var i= column;i>-1;i--) {
    v_index = halfFind_column(arr, num, i, v_index)
    if (arr[v_index][i] == num) {
      result_arr.push([v_index, i])
    }
  }
  return result_arr
}

相关文章

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 前端面试之算法二分法

    使用二分法的前提是,目标数组的元素必须是有序排列的,所以二分法属于有序查找算法 二分法又称为“折半查找”,从数组的...

  • 二分法查找

    二分法查找 : 目的 : 查找一个数组中是否含义某个元素 : 有返回数组中的位置 ,没有返回 -1 算法: 二分法...

  • JS二分法与二维数组的查找

    假如我们现在有个二维数组,数据量比较大,规律是: 每一行都是增加的,每一列也是增加的,即后面的数比前面的大。如下面...

  • 解析前端面试之二分查找算法

    二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。 二分法查找的思路如下: (1)首先,从数组的...

  • 算法基础—二分法查找

    一、前言     二分法查找又称为折半查找,二分法查找的基本思想是把数组中的元素从小到大有序地存放进数组中,首先将...

  • 算法题

    行列都是有序的二维数组,查找k是否存在【查找法】 二维数组中的查找(行列分别有序数组的二分查找)【递归法】 快速排...

  • swift写二分法查找

    一、原理 1.二分法查找的前提是要先将数组进行排序 2.二分法查找是将数组逐次分成两个数组,然后再在分好的两个数组...

  • 刷前端面经笔记(九)

    1.JavaScript实现二分法查找? 二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找...

  • PHP中实现二分法查找的两种方法

    php实现二分法的查找其实很简单,跟我一起来看看怎么实现吧。 二分法查找需要数组是一个递增的数组。 想要写出二分法...

网友评论

      本文标题:JS二分法与二维数组的查找

      本文链接:https://www.haomeiwen.com/subject/ytgcqftx.html