正如标题所示,我有一个包含在A-Z中排序的词汇表(每个在一行上)的文件,我想检索具有给定前缀的所有词汇表。 问题是该文件包含多个A-Z排序运行,每个表示不同的语言。对数据文件进行预处理是不可能的,因为你无法确定排序运行的长度,我想不出比简单遍历整个文件更好的方法,并在运行时比较O(n )。是否可以使用这个奇怪的排序文件来实现O(logN)?
答案 0 :(得分:1)
如果在运行未知大小时既不允许索引也不允许更改文件,则无法比完整文件扫描更好。
但是,如果每次运行的起始端偏移量已知,则只需要完成一次完整文件扫描,并且可以在每个部分中使用二进制搜索 - 对于索引构建后的〜O(k lg (n/k))
。在程序期间,起始偏移很容易获得,并且可以根据需要存储在缓存文件中。
如果起始端索引还包含相关的顶级前缀(例如起始字母),则可以进一步划分初始搜索空间并避免一些搜索。
如果文件很小,并且内存足够,那么也可以选择将所有内容保存在内存中。寻找像SQLite这样的现有商店也是值得的;虽然据说预处理不可行。
答案 1 :(得分:0)
您可以将k个列表合并为1个排序列表(k way merge),这是一次o(n * lg(k))任务。之后,您将能够在o(log n)中运行。