在XSLT中使用的XPath表达式中的元素的索引访问的时间复杂度是多少?

时间:2012-12-17 05:41:54

标签: xslt xpath xslt-2.0 xpath-2.0

XSLT中以下XPath表达式的索引访问的时间复杂度是什么?

<xsl:value-of select="User[2]/username"/>
  1. O(的log(n))
  2. O(1)或
  3. O(n)的
  4. 我有一个已排序 xml文件,其中包含数千个用户,如下所示:

    <Users>
      <User>
        <idPerson>460</idPerson>
        <username>a_aker01</username>
      </User>
      <User>
        <idPerson>677</idPerson>
        <username>a_aker02</username>
      </User>
      <User>
        <idPerson>1844</idPerson>
        <username>a_aker03</username>
      </User>
      <User>
        <idPerson>2373</idPerson>
        <username>a_aker04</username>
      </User>
    </Users>
    

    我正在考虑在XSLT 2.0中编写二进制搜索功能(需要快速索引访问)以加快搜​​索速度,因为

    <xsl:variable name="targetId" select="2373" />
    <xsl:value-of select="User[idPerson=$targetId]/username"/>
    

    对我的需求来说太慢了。它是否执行线性搜索?

3 个答案:

答案 0 :(得分:3)

/Users/User[2]的时间复杂性是特定于实现的。最有可能的是它将是一个O(n)线性搜索,但也许有一个实现在智能条件下在O(1)中足够聪明。

但是,为什么不使用xsl:key而不是创建二进制搜索功能? (这也适用于XSLT 1.0。)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"/>

  <xsl:key name="user-for-idPerson" match="/Users/User" use="number(idPerson)"/>

  <xsl:template match="/">
    <xsl:variable name="targetId" select="2373" />
    <xsl:value-of select="key('user-for-idPerson', $targetId)/username"/>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

这完全取决于实施。

Saxon-HE将使用线性搜索实现User [idPerson = $ targetId],Saxon-EE可能会构建索引。

两种产品都具有时间复杂度O(n),用于子轴的数值滤波,如用户[2], 但是如果你使用一个变量($ User [2]),访问将花费不变的时间。

答案 2 :(得分:1)

为了不依赖于特定的XSLT处理器的实现,我建议使用密钥

<xsl:key name="kUserById" match="User" use="idPerson"/>

然后,当您需要User访问idPerson时,请执行以下操作:

key('kUserById', $targetId)

大多数XSLT处理器有效地实现密钥索引(即使用哈希表),因此,如果idPerson对于每个User是唯一的,则使用key()函数进行访问的时间为如上所示是O(1) - 常数。


关于您的其他问题

  

以下索引访问的时间复杂度是多少?   XSLT中的XPath表达式?

<xsl:value-of select="User[2]/username"/>

对于提供的XML文档,它很可能是O(1),但是对于Users不仅有User个孩子的文档,而且其他名字的孩子也是如此,访问时间可能是O(N) - 假设有1000个名为Customer的孩子,最后两个孩子名为User

  

我正在考虑在XSLT 2.0中编写二进制搜索功能   (需要快速索引访问)以加快搜​​索速度

二进制搜索算法假设要搜索的对象位于数组中(并且在数组中,索引的访问时间为O(1))。对于XSLT / XPath,这种假设是错误的,其中仍然没有数组数据结构。

一些XSLT处理器(如Saxon)可以以有效的方式(使用向量)实现序列,并且有时间访问O(1),但是其中许多处理器不执行此操作。

因此,访问:

 $seq[$mid]

通常采用O(N),并且应用于这样的序列的二分搜索算法是O(N ^ 2)。