如果您拥有的唯一信息是它是一个未排序的数组,索引和值之间没有关系,并且没有辅助数据结构,那么您可能需要检查 每个元素,看看它是否包含你想要的信息。
不过,面试的目的是将小麦与谷壳分开,因此重要的是要意识到他们希望了解您如何解决问题。因此,我们的想法是提出问题,看看是否有更多信息是(或可以提供),这些信息可以使您的搜索更有效率。
类似的问题:
1/ 数据是否经常变化?
如果没有,那么您可以使用额外的数据结构。
例如,维护一个最初为 true 的 dirty 标志。当你想找到一个项目并且它是真的时,构建一个额外的结构(排序数组、树、散列或其他),这将大大加快搜索速度,然后将 dirty 标志设置为 false,然后使用该结构来查找项目.
如果你想找到一个项目并且dirty标志是假的,只需使用结构,不需要重建它。
当然,对数据的任何更改都应将 dirty 标志设置为 true,以便下一次搜索重建结构。
这将大大加快(通过摊销)对读取频率远高于写入频率的数据的查询。
换句话说,更改后的第一次搜索会相对较慢,但后续搜索会快得多。
您可能希望将数组包装在一个类中,以便正确控制dirty 标志。
2/ 我们是否允许使用与原始数组不同的数据结构?
这将与上面给出的第一点相似。如果我们将数据结构从数组修改为任意类包含该数组,您仍然可以获得所有优点,例如快速随机访问每个元素。
但我们获得在数据发生变化时更新数据结构中的额外信息的能力。
因此,与其使用dirty 标志并在下次搜索时进行large 更新,我们可以在数组为改变了。
这通过在所有更改中摊销成本(每个更改的成本很小)来消除更改后第一次搜索的缓慢响应。
3.列表中通常会有多少项?
这实际上比大多数人意识到的更重要。
除非您的数据集相对较大并且性能实际上很重要,否则所有关于优化的讨论往往都是无用的。
例如,如果您有一个 100 项的数组,那么即使使用脑死亡冒泡排序也是完全可以接受的,因为它与您能找到的最快排序之间的时间差异往往是无关紧要的(除非您需要当然每秒执行数千次)。
对于这种情况,查找给定值的第一个索引,只要您的数组保持在特定大小以下,进行顺序搜索可能是完全可以接受的。
最重要的是,您在那里证明自己的价值,而面试官(通常)在那里为您提供指导。除非他们是虐待狂,否则他们很乐意你向他们提问以缩小问题的范围。
提出问题(因为您有可能对数据进行排序。即使您无法提出一个解决方案。
事实上(我过去也这样做过),他们可能会拒绝你所有可能的方法(不,它没有排序,不,不允许其他数据结构,等等)只是为了看看你能走多远得到。
也许,只是也许,就像小林丸,它可能不是关于胜利,它可能是你如何处理失败:-)