我有一个5 MB的XML平面结构,我想稍后访问它的数据。我在Java中使用XOM Parser来解析XML,并且我不希望每次因为文件大小而需要一段时间来检索数据时都在整个树上循环。
XML看起来像这样
<TypeDesc Type="Person" Id="1" PKey="X0" xml:lang="EN" ShDes="t1" LongDes="test 1"/>
<TypeDesc Type="Person" Id="2" PKey="X1" xml:lang="EN" ShDes="t2" LongDes="test 2"/>
<TypeDesc Type="Person" Id="3" PKey="X3" xml:lang="EN" ShDes="t3" LongDes="test 2"/>
...
<TypeDesc Type="Person" Id="n" PKey="PAYMN" xml:lang="EN" ShDes="PAYMN" LongDes="payment"/>
<TypeDesc Type="Student" Id="1" PKey="X0" xml:lang="EN" ShDes="t1" LongDes="good"/>
<TypeDesc Type="Student" Id="2" PKey="X1" xml:lang="EN" ShDes="t2" LongDes="bad"/>
<TypeDesc Type="Student" Id="3" PKey="X3" xml:lang="EN" ShDes="t3" LongDes="fair"/>
...
<TypeDesc Type="Student" Id="n" PKey="PAYMN" xml:lang="EN" ShDes="PAYMN" LongDes="fair"/>
在我的LOGIC中,我想检索节点的longDes,如果PKEY = SOMESTUFF AND Type = OtherStuff
如果满足其他属性,那么循环整个并检索longDes非常昂贵。
如何存储我的数据以便我可以在O(1)而不是O(n)中访问它们,这样我就可以在整个XML上循环一次并访问数据结构以供以后迭代。
答案 0 :(得分:1)
您不太可能找到以其当前形式满足此要求的常量查找过程。此外,恒定时间查找是一个特定的要求,还是作为项目状态/设置的盲目观点的一部分?又名"the XY problem"。您可能找到的最好的是O(n log n)
或O(log n)
算法;请参阅Big O Cheatsheet
我建议您查看能够解析此结构的现有框架:
如果您对XOM感到满意,请不要费心移动,但我相信您在搜索时需要考虑数据结构,例如使用索引或以有效的形式存储数据 - 例如一个前缀树/特里 - 然后将其序列化到磁盘/存储,以便通过明显的空间/时间权衡重新解析更快?
除此之外,您的数据是否采用XML格式?你能把它转换成另一种格式吗?例如Protocol Buffers,或者将数据放在数据库(SQL或NoSQL)中,虽然根据你正在做的事情,这可能有点过分了?
我也会问自己以下问题:
答案 1 :(得分:0)
我使用哈希表来存储数据。 为每种类型构建一个哈希表。每个哈希表的关键是我要检查的所有属性的连接,并且存储的值是我想要检索的。它非常有效并且接近O(1)