如何在大数组中搜索对象?

时间:2012-03-23 00:58:58

标签: arrays search sorting comparator

我今天接受了一次采访,有人问我是如何在数组中搜索一个数字的,我说二元搜索,他问我一个有数千个对象(例如股票)的大数组如何通过价格搜索库存,我再次说二元搜索,他说在应用二元搜索之前,对数千个数组进行排序会花费很多时间。

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

3 个答案:

答案 0 :(得分:2)

我被问到一个类似的问题。扭曲是搜索排序,然后是一个未排序的数组。这些是我的答案都是未被接受的

  1. 对于排序我建议我们可以找到中心并进行线性搜索.Binary搜索也可以在这里工作
  2. 对于未分类,我再次建议使用线性。
  3. 然后我建议Binary有点不对。
  4. 建议将数组存储在哈希集中并使用散列。 (自高空间复杂城市以来不接受)
  5. 我建议使用Tree Set,它是一种非常适合查找的红黑树。(因为高空间复杂性而不被接受)
  6. 复制到Arraylist蚀刻也被视为开销。
  7. 最后我收到了负面反馈。 虽然我们可能认为以上其中一个是解决方案,但肯定在线性搜索中有一些特殊的东西我不知道。

    需要注意的是,在搜索之前进行排序也是一种开销,特别是如果您在其间使用任何额外的数据结构。

    欢迎任何评论。

答案 1 :(得分:1)

我不确定他的想法。

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

但是如果你需要找到多个值,那么分类所花费的时间会很快得到回报。使用排序数组,您可以在O(log N)时间内进行二进制搜索,因此如果您投入时间进行排序,第三次搜索肯定会提前进行搜索。

如果允许您构建不同的数据结构来帮助解决问题,您可以做得更好。您可以构建某种索引,例如哈希表;但这类问题的冠军数据结构可能是某种树形结构。然后,您可以比添加新值并重新排序数组更快地将新值插入树中,并且查找仍然是O(log N)以查找任何值。有不同种类的树可供选择:二叉树,B树,特里等等。

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

答案 2 :(得分:1)

我认为面试官希望你根据不同情况分析阵列初始状态,你将使用什么算法。当然,你必须知道你可以构建一个哈希表,然后O(1)可以找到数字,或者当数组被排序时(可能需要关注排序的时间),你可以使用binarysearch,或者使用其他一些数据结构来完成这项工作。