我必须编写一个程序来创建一个地址簿,该地址簿可以在多个字段上提供搜索功能,并具有大量记录。二进制搜索是一种选择,但棘手的部分是用户可以搜索四个字段中的任何一个(firstName,lastName,phoneNumber,City)。所以我没有特定的列可以对列表进行排序。该程序还应以对数时间返回搜索结果。 现在我已经创建了一个通用的arraylist< contacts>其中包含所有四个字段。 任何人都可以建议什么是使搜索在日志时间工作的最佳方式。
答案 0 :(得分:3)
一种有点内存密集的方法是构建四个并行二进制搜索树(或四个Set
,其比较器一次比较一个字段)。这样,您可以在任何树上搜索,以在O(lg n)时间内找到具有特定字段的节点。
答案 1 :(得分:1)
使用数据库并定义所需的索引。
如果您不能使用数据库,则排序和搜索。您可以在任何需要的字段中按O(log n)时间排序。然后,您可以在排序字段上搜索O(log n)时间。不是在生产环境中这样做的方式,但作为一项任务,您可以声称“总时间复杂度:O(log n)。”
答案 2 :(得分:0)
使用4棵树和一个arraylist存储它。
4棵树应该只考虑指数。您不必将每个字符串的全部内容存储在树中,只需将字符串足以将其与其余字符串区分开来(即在节点处存储字符,当您有足够的前缀时,您会得到一个叶子识别字符串)。通过使用“跳过n个字母”节点对树进行注释,您可以有点聪明,这样当下一个n个字母中该子树中的所有字符串相等时,您就不会存储内部节点。
然后arraylist存储记录。
在树叶处,您只需将一个索引存储在arraylist中。
如果你这样做,你使用350,000 * 2 * 4(整数字节)+ X~ = 3MB + X其中X是你文件的大小,你的系统肯定有这么多吗?您甚至可以将数据保留在文件中并索引到文件中。