我正在实现一个算法,它将在csv文件中搜索一个字符串,该字符串包含一个列,该列具有用户输入的前缀。在找到第一个搜索结果后,用户可以输入不同的前缀来执行第二次搜索。列号只指定一次,并且在后续搜索过程中只允许更改前缀。这将持续到用户输入“end”为止。
搜索示例:
文件数据:
1, "Adam", "Computer Science"
2, "Liza", "Condensed Matter Physics"
3, "Bob", "Electrochemistry"
4, "Eva", "Material Culture"
搜索参数:
column: 3, prefix: "Co"
搜索结果:
1, "Adam", "Computer Science"
2, "Liza", "Condensed Matter Physics"
我的算法必须满足特定条件:
- 每次搜索时不阅读文件中的所有行
- 不将所有文件数据存储在内存中(不管它是字节数组还是包含所有文件数据的任何其他结构)
- 不编辑文件,不创建其他文件(也不使用数据库)
结果是,每次搜索操作都必须处理整个文件,因为文件中的任何字符串都可以有指定的前缀。如何在不违反上述条件的情况下实现这一点?也许你知道在这种情况下可以使用的算法?
根据我的猜测,无论如何我们都需要处理整个文件,这意味着在每次搜索时阅读其中的所有行,或者将其完全存储在内存中,以排除对文件的访问并使用此结构,这两种选择都违反了问题的条件。
2条答案
按热度按时间6ioyuze21#
我认为这是不可能的,因为所有的列都可以匹配请求,并且请求可以针对每一列,在最坏的情况下,你必须返回洞文件。如果你不能保存在内存中,那么它必须来自文件。
当然,你可以作弊,只在内存中保留一个固定的部分(例如,文件的最后10%),然后总是读取文件的前90%,其余的形成内存。严格地说,这样你就满足了要求。
disho6za2#
要高速缓存文件以避免在每次搜索迭代中阅读该文件,可以使用高速缓存机制将文件内容存储在内存中。这可以显著减少每次搜索读取文件所需的时间和资源。
以下是缓存文件的一些步骤:
将文件内容读入内存:使用文件输入流或读取器将文件的内容读入字符串或缓冲区。可以将文件的内容存储在哈希Map或树Map等数据结构中,以便进行高效搜索。
缓存文件的内容:使用高速缓存机制(如最近最少使用(LRU)高速缓存或固定大小高速缓存)将文件内容存储在内存中。LRU高速缓存将在达到其最大容量时自动从该高速缓存中逐出最近最少使用的项。固定大小高速缓存将在内存中存储固定数量的项,并在添加新项时逐出最旧的项。
使用缓存文件进行搜索:查找数据时,首先检查数据是否已缓存在内存中,如果已缓存,则从该高速缓存中检索,如果未缓存,则从文件中读取并添加到缓存中。
修改文件时该高速缓存:如果文件的内容经常更改,则每当修改文件时,都需要更新该高速缓存。为此,可以使缓存无效并重新读取文件,也可以检测文件的更改并相应地更新缓存。
总的来说,高速缓存文件的内容是提高基于文件的搜索性能的有效方法。但是,在决定使用高速缓存机制时,考虑文件的大小和可用内存非常重要。