在阅读问题并在 cmets 中得到澄清后,我认为对我来说显而易见的是:您需要提出后续问题。
我会尝试将其分解并提供我希望对您有所帮助的 cmets,因为我也知道“当下”是什么感觉,以及当您最不需要的时候神经会如何刺伤您的背部.
我们有一个包含数十亿条目的数据结构,我们需要在该数据结构中搜索特定的单词。
我认为一个很好的后续问题应该是:
问:什么特定的数据结构被用来包含所有这些数据?
我会一直按,直到他们给我一个实际名称并解释为什么不能命名一个 Java 算法/库。如你所知,数据结构可能是String[]、Set<String>,甚至是磁盘上文件的花哨名称(如果他们想把你赶走的话)。他们也可以澄清并说 DS 不相关,您可以选择 您 认为最好的任何 DS。
措辞还暗示他们实现了该结构,并且它已经填充在一个系统中,并且大概有足够的内存来容纳所有这些。要求确认这是真的案例,本可以为您提供有用的信息。
例如:“根据措辞,这个神秘的数据结构似乎已经实现并完全填充在一个有足够内存的系统的内存中。你能确认我的理解是正确的吗?如果不是,您能否进一步澄清一下?”
考虑到建议的措辞,以及我们没有额外的说明的事实,我将假设,为了这个答案,我的假设确实是正确的。 p>
请注意,如果你被要求设计数据结构来保存所有这些信息,你将不得不问非常不同的问题,考虑内存限制,甚至可能询问字符集/编码(例如 ASCII 与多字节 Unicode)。
此外,如果您被要求设计搜索算法,那么了解 DS 是先决条件,而不知道这一点可能会使这项任务变得不可能。例如,如果您使用数组和二叉搜索树,二叉搜索算法的实现看起来会非常不同,尽管两者都会提供 O(lg n) 时间复杂度。
那么我们可以使用哪个 java 特性/库来尽可能快地进行搜索?
与第一部分一致,此问题仅询问您会选择哪些预先存在/内置的 Java 代码来执行搜索。这里的“可能的最快时间”应该让您考虑 O(1) 中的解决方案,即恒定时间。但是,数据结构可能会为您打开/关闭大门。
Java 中的一些搜索算法适用于泛型,而另一些则适用于其他类型,例如数组。一些算法适用于Maps,而另一些则适用于Lists、Sets,等等。第一部分的后续问题可能有助于回答这个问题。
也就是说,即使你知道DS,但当时想不出具体的方法名称之类的,我也认为提到接口或至少是相关的包并说如果您需要更具体的说明,可以在 Java 文档中查看更多详细信息,因为这就是它的用途。
我们可以将值存储在地图中并在地图中搜索单词(但卡住了如何确定地图中的键值对)。
鉴于措辞,我对他们问题的解释是不是“您将使用哪种数据结构?”,而是“您会选择哪种预先存在的搜索算法?”。在我看来,他们似乎需要回答有关 DS 的问题。
也就是说,如果您确实被问到“您将使用哪种数据结构?”,那么 Map 仍然对您不利,因为您实际上并不需要 映射 值的键。您只需要存储一个值(即单词)。因此,Set,特别是HashSet,会是一个更好的选择,因为它还可以避免重复,并且应该在进程中消耗更少的内存,因为它存储奇异值,而不是键/值对。
当然,这仍然是基于我之前所做的假设。如果内存限制被认为是一个问题,那么水平扩展至多台服务器等可能是必要的。
我如何才能理解这个问题的确切答案以及最佳解决方案是什么?
考虑到他们给你的信息不足,他们可能想看看你是否会跟进问题。