我想计算书籍作者之间的距离。 一起出版书籍的作者的距离为1。 此外,如果a和b没有一起出版一本书,但它们都与c一起出版,则a和b之间的距离为2.
这是一个XML文件,例如:
ScriptManager.RegisterStartupScript(this,GetType(),"showalert","alert('Only alert Message');",true);
对于我的XML文件中的每个作者X,我需要计算与所有其他作者y的距离(x!= y,所以不是同一作者) anabody知道如何在XQUery中编写代码吗?或者有算法的想法?
任何帮助表示赞赏, 谢谢!
答案 0 :(得分:0)
您需要以某种方式在内存中表示您的图形,以便您可以在其上运行最短路径算法。事实上,您的上述文档可以被视为图形表示,但它可能是多余的(同一对作者可能已经共同出版了多本书)。
更好的图形表示可以是(其中)邻接列表,邻接矩阵或事件矩阵。见这里:http://en.wikipedia.org/wiki/Graph_%28abstract_data_type%29
由于您的图表可能很稀疏,因此您应该选择邻接列表。邻接列表具有节点 - >的形式。 List [Node],表示它将每个节点映射到其相邻节点的列表。在Java中,您可以选择Map(例如HashMap)将其存储在内存中。为了运行图算法,数据结构应具有较低的查找时间。 XQuery没有映射,但您可以创建xml片段作为变量的值。这是一个例子:
let $a :=
<map>
<author>
<name>Luc</name>
<coauthors>
<name>Thibault</name>
</coauthors>
</author>
<author>
<name>Jay</name>
<coauthors>
<name>Henry</name>
<name>Luc</name>
</coauthors>
...
</author>
</map>
请注意,这不是完整的图表表示,而只是边缘的子集。您需要定义一个子程序,用于从输入文档计算此中间结果。然后,您可以定义一个实用程序函数,该函数使用此中间结果为您提供给定作者姓名的紧邻作者。基于此,您可以实现最短路径算法。
请注意,上面的图表表示对查找相邻节点效率不高,我认为很难为相邻节点编写有效的查找函数。上面提到的查找函数需要在最坏的情况下遍历整个中间结果(如果你查找最后一个作者的相邻节点)。如果您担心运行时,我建议您使用您选择的通用编程语言(例如Java)。如果图形表示不适合存储器,则使用某种磁盘索引结构(例如由关系数据库提供)。