【问题标题】:Can I do a binary search on an array of objects?我可以对对象数组进行二进制搜索吗?
【发布时间】:2021-03-26 16:13:06
【问题描述】:

我目前正在学习如何使用搜索和排序算法,并且在对一组客户数据对象进行二进制搜索时遇到了问题。客户数组按名字和姓氏排序。

目标是找到客户的电子邮件并返回索引。

数据如下:

[
  {
    "username": "Maude.Torp",
    "email": "Taya.Kerluke53@gmail.com",
    "address": {
      "street": "Rowe Fields",
      "suite": "Suite 231",
      "city": "Tiannamouth",
      "zipcode": "07584-6653",
      "geo": { "lat": "75.0283", "lng": "-17.1824" }
    },
    "phone": "795-827-5446 x18366",
    "website": "nico.com",
    "company": {
      "name": "Champlin, Feest and Barrows",
      "catchPhrase": "Object-based user-facing orchestration",
      "bs": "transition integrated content"
    },
    "firstName": "Maida",
    "lastName": "Feeney"
  },
  ...
]

我的二分查找函数如下:

function searchByEmail(email, customers) {
  let start = 0;
  let end = customers.length - 1;

  while (start <= end) {
    let middle = Math.floor((start + end) / 2);

    if (customers[middle] === email) {
      return middle;
    } else if (customers[middle] < email) {
      start = middle + 1;
    } else {
      end = middle - 1;
    }
  }
  return -1;
}

在已排序的数字数组上,我能够返回所需键的索引。

let customers = [1, 10, 45, 56, 66, 567]
...
console.log(searchByEmail(66, customers))

// --> 4

当我查看这个对象数组时,我只返回 -1。如何更改此算法以适用于数组中的对象?

【问题讨论】:

  • 客户数组是否按电子邮件地址排序?这就是您需要能够对电子邮件进行二分搜索。
  • 对,和我要说的一样:)
  • 另请注意,如果您从数据库中获取了这么大的数组,您可能希望使用一些过滤器对其进行查询,而不是检索所有客户,然后从完整列表中查找一个或多个
  • @Zorgatone 太棒了,我很感激。你帮了大忙!
  • @alexwhit 不客气

标签: javascript arrays object binary-search-tree


【解决方案1】:

您应该能够对客户数组进行二进制搜索,前提是它是通过客户电子邮件订购的。

稍微更改代码以比较电子邮件而不是整个对象,访问对象的电子邮件属性。

function searchByEmail(email, customers) {
  let start = 0;
  let end = customers.length - 1;

  while (start <= end) {
    let middle = Math.floor((start + end) / 2);

    // NOTE the ".email" part added
    if (customers[middle].email === email) {
      return middle;
    } else if (customers[middle].email < email) {
      start = middle + 1;
    } else {
      end = middle - 1;
    }
  }
  return -1;
}

【讨论】:

  • 这种调整是有道理的。如果这个函数是按名字和姓氏排序而不是按电子邮件排序,会有什么变化?
  • 它不会正确找到结果。数组必须按您要进行二分搜索的键排序
  • 如果不是email排序的,可以先排序后再进行二分查找。它仍然应该比我认为的整个数组更好(取决于c的排序算法)
  • 在最好的情况下,排序需要 N*log(N) 步。在最坏的情况下,一次搜索需要 N 步。对数组进行排序只是为了搜索是没用的imo
  • 如果您要进行多次搜索,那还是值得的
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2020-05-16
相关资源
最近更新 更多