我正在尝试实现一种算法来搜索特定记录的多个XML文件。
已知记录未排序(我没有索引ID)。
搜索该记录的最快算法是什么?
如果有什么不清楚的地方请告诉我
提前谢谢
答案 0 :(得分:6)
您需要决定的所有内容都在Sorting Algorithms
答案 1 :(得分:4)
没有排序线性搜索是最好的选择。想一想。
正如我在评论中所说:如果您想要搜索一次或多次,这很重要。因为那时你可能需要建立一个索引。但如果你只搜索一次就没用了。
答案 2 :(得分:3)
这实际上取决于您希望在这些文件上执行任务的频率。如果记录未排序,则只能线性搜索它们。但是,如果您必须在同一组记录上更频繁地执行此操作,则可以创建索引,或在第一次运行期间对它们进行排序。
答案 3 :(得分:2)
galambalazs是正确的:未分类的数据意味着你必须全部通过它来搜索你需要的东西。但这只涉及问题的一小部分。
在处理多个文件时,文件I / O可能会占用大部分处理时间。按计算机标准,在目录中查找文件并打开它需要很长时间。但是,无论您最终使用哪个程序,这都会产生费用。
性能方程的另一部分是您使用的解析器类型。根据XML的结构,您可以选择使用手写解析器,DOM XML解析器或Sax解析器。
如果搜索到的数据周围的标记始终与该数据位于同一行,并且不存在歧义,则逐行读取文件并通过字符串搜索或regexp进行搜索是一种有效的可能性。 SO上的许多人都会抗议正则表达式匹配是一种处理XML的可怕方式,这通常是正确的;在一组特定且有限的案例中进行搜索是一种快速而肮脏的方式,并且与您最终使用的XML结构相比非常脆弱。
DOM解析器将整个XML文档“吸入”到内存结构中,然后您的应用程序可以按顺序搜索它。当你想在XML树上做许多复杂的操作时,DOM很棒;对于顺序搜索,他们是一个可怕的想法,因为
因此,最推荐的方法是使用SAX解析器。谷歌搜索将找到你最喜欢的语言。 SAX解析器扫描您的输入文件一次,在您可以(并且必须!)以适当方式处理的每个元素上生成事件。数据按顺序处理,除了您决定对所找到的数据执行操作外,没有其他存储空间。 SAX解析器通常比DOM解析器快得多,但需要对如何处理事件进行一些规划。
答案 4 :(得分:0)
想到了连续的逐行搜索。使用多个线程一次获取多个文件。