我有一个具有以下结构的XML映射文件:
<mappings>
<mapping path="first">
<parameter name="client_identifier">value1</parameter>
<parameter name="device_identifier">value2</parameter>
<parameter name="network_identifier">value3</parameter>
</mapping>
<mapping path="second">
<parameter name="client_identifier">value1</parameter>
<parameter name="device_identifier">value2</parameter>
<parameter name="network_identifier">value4</parameter>
</mapping>
<mapping path="third">
<parameter name="client_identifier">value1</parameter>
<parameter name="device_identifier">value2</parameter>
</mapping>
<!-- hundreds/thousands more -->
</mappings>
客户端向我的应用程序发出请求,并根据其请求中包含的一些参数返回一些文件。我上面的映射文件将参数映射到正确的文件。 path
元素中的mapping
属性是包含这些文件的目录的文件路径。
我从上到下解析文件,一次操作一个映射,O(n)最坏的情况。如果<mapping>
中的所有参数与客户端请求中的参数匹配,则返回path
中的目录值。
示例客户端请求
client_identifier = value1
device_identifier = value2
network_identifier = value10213
The third mapping with path=third will be returned because the other mappings don't match network_identifier.
因为所有可能的组合,这个文件可以增长到大量的映射,我想知道是否有一些数据结构(决策树)可能更快解析/比较。
文件本身必须保持相同的结构,但我可以解析它并在内存中创建不同的结构。
答案 0 :(得分:1)
实际上,您描述的不是决策树的示例。您仍有一些方法可以优化您的流程。我建议你为每个映射中的属性集计算某种哈希值。对于未设置的属性,添加另一个“假”值,表示“未设置”。 之后迭代文件,并将为查询的属性集计算的哈希值与行中每个映射的属性集的哈希值进行比较。仅在哈希值相同时才比较属性(以避免碰撞问题)。这种方法应该显着加快比较。
您可以进一步改进上述方法 - 在哈希码和具有此哈希码的映射之间创建哈希映射。不要以与文件中找到的顺序相同的方式保留哈希码的映射!之后,您将只迭代具有相同哈希码的映射,并且在没有发生冲突的完美情况下,这将尽可能好。