在登录时间内搜索多个条目

| 我必须编写一个程序来创建一个通讯录,该程序可以在具有大量记录的多个字段上提供搜索功能。二进制搜索是一个选项,但棘手的部分是用户可以搜索四个字段(firstName,lastName,phoneNumber,City)中的任何一个。因此,没有可以对列表进行排序的特定列。该程序还应该以对数时间返回搜索结果。 现在,我创建了一个通用的arraylist ,其中包含所有四个字段。 任何人都可以提出在日志时间内使搜索生效的最佳方法是什么。     
已邀请:
        一种稍微占用内存的方法是建立四个并行的二进制搜索树(或四个“ 0”,它们的比较器一次比较一个字段)。这样,您可以在任何树上进行搜索,以找到具有O(lg n)时间的特定字段的节点。     
        使用数据库并定义所需的索引。 如果您不能使用数据库,则进行排序和搜索。您可以在所需的任何字段上按O(log n)时间排序。然后,您可以在已排序的字段上搜索O(log n)时间。不是在生产环境中执行此操作的方法,而是作为一项任务,您可以声明:“总时间复杂度:O(log n)。”     
        使用4棵树和一个arraylist存储它。 4棵树仅应考虑索引。您不必将每个字符串的全部存储在树中,只需存储足够的字符串即可将其与其余字符串区分开(即,将字符存储在节点上,并且当有足够的字符串时,您将到达叶子)前缀以标识字符串)。通过用“跳过n个字母”节点注释树可以有点聪明,这样当子树中的所有字符串在接下来的n个字母相等时,您就不会存储内部节点。 然后,数组列表存储记录。 在树的叶子处,您只需将索引存储到arraylist中。 如果正确执行此操作,则使用350,000 * 2 * 4(整数字节)+ X〜= 3MB + X其中X是文件的大小,您的系统肯定有这么多吗?您甚至可以将数据保留在文件中并索引到文件中。     

要回复问题请先登录注册