【问题标题】:Data structure for making decisions on multiple conditions用于在多个条件下做出决策的数据结构
【发布时间】: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)。如果&lt;mapping&gt; 中的所有参数都与客户端请求中的参数匹配,我将返回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


【解决方案1】:

其实你描述的不是决策树的例子。仍然有一些方法可以优化您的流程。我建议您为每个映射中的属性集计算某种哈希值。对于未设置的属性,添加另一个表示“未设置”的“假”值。 之后迭代文件并将为查询的属性集计算的散列与行中每个映射的属性集的散列进行比较。仅在哈希相同时比较属性(以避免冲突问题)。这种方法应该可以显着加快比较速度。

您可以进一步改进上述方法 - 在哈希码和具有此哈希码的映射之间创建一个哈希映射。不要将哈希码的映射与文件中的顺序保持一致!之后,您将只迭代具有相同哈希码的映射,并且在没有发生冲突的完美情况下,这将尽可能好。

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多