Google Apps脚本的二进制搜索算法

时间:2016-11-14 19:01:02

标签: google-apps-script google-sheets google-form

我必须在电子表格中搜索,第一列是没有@part的电子邮件列表。例如

aadb.asdf
asdfsd.asdf
asdfsad.asdfsdf
asdfsdf.asdfsdf

以下是我的二进制搜索代码:

function testSubmit() {


  var email = "aadb.asdf";
  var s = SpreadsheetApp.openById("spreadsheetID");
  var sheet = s.getSheets()[0];
  var emailColumn = sheet.getRange(1,1, sheet.getLastRow()).getValues(); 

  var l1 = 0;
  var h1 = Number(sheet.getLastRow()) - 1;  


  while(h1 >= l1) {

    var middle = parseInt((l1 + h1) / 2);
    var item = emailColumn[middle][0].valueOf();
    Logger.log("Binary -> middle : " + middle + " data : " + emailColumn[middle][0]);

    if(item == email) {

    }

    if(item.charAt(0) < email.charAt(0)) {
      l1 = middle + 1;
    }

    if(item.charAt(0)  > email.charAt(0)) {
      h1 = middle - 1;
    }
  }

}

但是我的脚本卡住并给出了消息,如下面的截图。

enter image description here

然而,当我运行线性搜索时,它工作正常。我的脚本有问题吗?

 for (var row in emailColumn) {
   for (var col in emailColumn[row]) {
     if(email == emailColumn[row][col]) {
     Logger.log("row : " + row + " col : " + col + " data : " + emailColumn[row][col]);
     }
   }
  }

1 个答案:

答案 0 :(得分:0)

查看你的While语句......可能是某个特定时刻的h1和l1不再被改变,因此它会陷入循环中。