【问题标题】:How to search a big array for an object?如何在大数组中搜索对象?
【发布时间】:2012-04-07 15:14:07
【问题描述】:

我今天有一个面试,我被问到如何在一个数组中搜索一个数字,我说二进制搜索,他问我一个有数千个对象(例如股票)的大数组如何搜索例如按价格股票,我又说二分法了,他说在应用二分法之前对数千个数组进行排序需要很多时间。

你能忍受我并教我如何解决这个问题吗? 谢谢 感谢您的帮助。

【问题讨论】:

  • 一般来说,要搜索一大堆东西,会使用某种哈希表。
  • @Josh -- 技巧问题。如果一切都很好地排序并且您永远不会修改要搜索的集合,则二进制搜索会更快。但这不是现实生活。在现实生活中,哈希表几乎总是获胜。

标签: arrays search sorting comparator


【解决方案1】:

我被问到了一个类似的问题。转折是先搜索排序的数组,然后搜索未排序的数组。这些都是我的答案,都没有被接受

  1. 对于排序,我建议我们可以找到中心并进行线性搜索。二进制搜索也可以在这里工作
  2. 对于未排序的我再次建议线性。
  3. 然后我建议使用二进制,这有点错误。
  4. 建议将数组存储在哈希集中并利用哈希。 (由于空间复杂度高,不接受)
  5. 我建议 Tree Set,它是一棵非常适合查找的红黑树。(由于空间复杂度高,不接受)
  6. 复制到 Arraylist 蚀刻也被认为是开销。

最后我得到了负面反馈。 虽然我们可能认为上述其中之一是解决方案,但在线性搜索中肯定有一些我缺少的特殊之处。

需要注意的是,在搜索之前进行排序也是一种开销,尤其是当您在两者之间使用任何额外的数据结构时。

欢迎任何 cmets。

【讨论】:

  • 我会说对于已排序的二叉树和未排序的二叉树,您可以将其排序为 1) 答案。另一种方法是遍历数组并将数据保存到哈希表 O(n) 并在哈希表上查找数据将是 O(1)。但是查找应该在循环内。如果数据存在,则无需保存。你怎么看?
【解决方案2】:

我想面试官希望你在不同的情况下分析数组初始状态,你会使用什么算法。当然,你必须知道你可以建立一个哈希表,然后 O(1) 可以找到数字,或者当数组被排序时(可能涉及排序花费的时间),你可以使用二进制搜索,或者使用其他一些数据结构来完成工作。

【讨论】:

  • 所以最后我的意思是这个问题没有固定的答案。
【解决方案3】:

我不确定他的想法。

如果你只想找到第一次,而你不能保证数组是否排序,那么我认为你无法击败线性搜索。平均而言,您需要在数组的中途寻找值,即预期的运行时间 O(N);排序时,您必须至少触摸每个值一次,并且可能不止一次,即预期的运行时间 O(N log N)。

但是,如果您需要找到多个值,那么花在排序上的时间很快就会得到回报。使用排序后的数组,您可以在 O(log N) 时间内进行二进制搜索,因此如果您花时间进行排序,那么在第三次搜索时肯定会领先。

如果允许您构建不同的数据结构来帮助解决问题,您可以做得更好。您可以构建某种索引,例如哈希表;但这类问题的冠军数据结构可能是某种树结构。然后,您可以将新值插入到树中,而不是附加新值并重新排序数组,并且查找仍然需要 O(log N) 才能找到任何值。有不同种类的树可用:二叉树、B-tree、trie 等。

但正如@Hot Licks 所说,哈希表通常用于此类事情,而且更新起来非常便宜:您只需在主数组上附加一个值,然后更新哈希表以指向新值.哈希表非常接近 O(1) 时间,这是您无法击败的。 (如果没有哈希冲突,哈希表 O(1);假设一个好的哈希算法和足够大的哈希表几乎不会发生冲突。我想你可以说哈希表是 O(N),其中 N 是每个“桶”的平均哈希冲突数。如果我错了,我希望很快得到纠正;这是 StackOverflow!)

【讨论】:

  • 我不明白您所说的第三次搜索是什么意思?有什么例子吗?
  • 如果你只需要搜索一次,然后你就完成了,线性搜索是最快的。如果你必须搜索两次,线性搜索可能仍然比排序加二分搜索快;平均而言,线性搜索需要遍历大约一半的值,因此两次线性搜索平均需要遍历所有值。如果你必须搜索 3 次,排序一次然后使用二进制搜索进行 3 次搜索应该是最快的。如果必须搜索四次或更多次,则与三次相同:先排序,然后进行二进制搜索。
  • 如果您必须搜索两次以上,您最好使用哈希表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多