【发布时间】:2012-12-25 02:14:59
【问题描述】:
我有一个具有这种结构的 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>
客户端向我的应用程序发出请求,并根据他们请求中包含的一些参数,我返回一些文件。我上面的映射文件将参数映射到正确的文件。 mapping 元素中的 path 属性是包含这些文件的目录的文件路径。
我从上到下解析文件,一次操作一个映射,最坏的情况是 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.
因为由于所有可能的组合,这个文件可以增长到大量的映射,所以我想知道是否有一些数据结构(决策树)可以更快地解析/比较。
文件本身必须保持相同的结构,但我可以解析它并在内存中创建不同的结构。
【问题讨论】:
-
情况并非如此(因此是评论而不是答案),但对于二元条件,可以使用Binary Decision Diagram (BDD) - 在时间和空间上都比决策树更好。当然你可以枚举文件,然后使用 log(M) 不同的 BDD,但我怀疑这是一个很好的解决方案。
-
这不是一个二元决定,我必须匹配参数。对于 BDD,我必须为每个客户端、设备、网络和所有其他标识符创建一个。它会变成可笑的大结构。
-
是的,正如我所说 - 事实并非如此。只需链接 DS,以便您(或其他读者)可能会得到想法并想到适合此处的修改。如果这是一个答案,我会这样发布。
-
难道你不能将数据结构保存在服务器端的内存中,并使用一些散列或字典索引方案在 O(log(n)) 时间内访问正确的映射吗?
-
是的,我会在地图中的地图中找到地图,令人作呕。我们拥有的参数可以更改,这可能无法使用嵌套哈希进行管理。
标签: algorithm data-structures decision-tree