我应该使用哪种数据结构从CSV中搜索字符串?

我有一个csv文件,有近200000行,包含两个列 – 名称和作业。 然后用户输入一个名称,比如user_name,我必须搜索整个csv以查找包含模式user_name的名称,最后将输出打印到屏幕。 我在Java中使用ArrayList实现了这一点,我将整个名称从csv放到ArrayList中,然后在其中搜索模式。 但在这种情况下,搜索的总时间复杂度为O(n)。 Java中是否有任何其他数据结构可用于执行o(logn)搜索或比ArrayList更高效的搜索? 顺便说一句,我不能使用任何数据库方法。 如果我可以用任何其他语言建立一个良好的数据结构来实现我的目标,那么请向我推荐一下吗?

编辑 – 输出应该是csv中包含模式user_name作为最后一部分的名称。 例如:如果我的输入是“儿子”,那么它应该返回“jackson”等。 现在我到目前为止所做的是将csv的name列读取到字符串ArrayList,然后读取ArrayList的每个元素并使用正则表达式(Java的模式匹配器)来查看该元素是否具有user_name作为最后一部分。 如果是,则打印出来。 如果我在multithreading环境中实现它,它会增加我的程序的可伸缩性和性能吗?

您可以使用:

  • TreeMap ,它是红黑树,

如果您无法使用商业数据库,那么您将不得不编写代码来模仿某些数据库的function。

要在O(n)时间内按顺序搜索整个数据集,您只需读取它并搜索每一行。 如果你编写一个程序将数据加载到内存映射中,你可以在分摊的O(1)时间内搜索Map,但是你每次都要将它加载到内存中,这是一个O(n)操作,什么都没有。

因此,下一个方法是构建某种基于磁盘的索引,您可以在不读取整个文件的情况下高效搜索,然后使用索引来告诉您所需记录的位置。 这将是O(log n) ,但现在您处于极其复杂的状态,构建,维护和管理基于磁盘的索引。 这是数据库系统优化的function。

如果您有200万行,那么唯一可行的解​​决方案就是使用数据库。 对于200 THOUSAND行,我的建议是每次只扫描文件(即使用grep或者如果不可用则写一个简单的程序来做类似的事情)。

顺便说一句,如果你想找到一个“模式”意味着你需要搜索正则表达式,那么每次都必须扫描整个文件,因为你不知道你不能建立索引的模式。

总结:使用grep