XSLT中以下XPath表达式的索引访问的时间复杂度是什么?
<xsl:value-of select="User[2]/username"/>
我有一个已排序 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"/>
对我的需求来说太慢了。它是否执行线性搜索?
答案 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)。