什么可能是不能(合理地)用XML表达的数据结构的例子?这是一个面试问题,我找不到任何相关内容。
答案 0 :(得分:6)
tl; dr 我不知道,我尝试了很多的数据结构。但是,有些表示效率适中,所以它不一定是最好的选择,即使是非常明智的。
这是一个棘手的问题。 XML是一种非常不受限制的树,它已经覆盖了所有数据结构的一半。即使是最奇特,最复杂的树木仍然是树木 - 我仍然不太了解vBE trees的创建和操纵,但我知道它是一棵树,所以我可以将给定的vBE树变成XML。
为每个节点分配一个ID,或设计另一个轻量级方案来引用一个节点而不使其成为引用者的子节点,并且您可以毫无困难地构建任何类型的图形。图表几乎是通用数据结构的全部和最终结果。例如,有向循环图如下:
<graph>
<vertex id="1">
<!-- vertex data -->
<edge to="3"/>
</vertex>
<vertex id="2">
<!-- vertex data -->
<edge to="1"/>
<edge to="3"/>
</vertex>
<vertex id="3">
<!-- vertex data -->
<edge to="1"/>
<edge to="2"/>
</vertex>
</graph>
这显然是如何映射到邻接列表的。支持更复杂的图形,如超图(边可以包含任意数量的顶点),您只需要一个单独的边列表,每个边都包含一个顶点引用列表(参见下面的列表)。
更多普通数据结构更容易映射到XML:
<seq>
父节点中,使它们成为兄弟节点。<tuple>
节点,并且不需要标识符,因为节点顺序(与属性顺序不同)将被保留。这些表示中没有一个像真正的交易一样好,但你可以很好地使用它们并在内存中构建真实的数据结构是一个小而简单的循环与正确的库(例如Python中的lxml,部分原因是XPath)。
有一类数据结构不能轻易映射到树相当。当你为每个元素(或每个true
元素或每个元素使用几十个字节时,布尔矩阵,位掩码等从每个元素的单个位获得效率会大大增加{1}}元素 - 问题仍然存在)。但是,较少以树为中心的编码可以解决这个问题。例如,您可以为一维位掩码存储base64字符串,并使用更高维度的序列(包括布尔矩阵)。将这些位连接起来形成一个数字,并在base64中对其进行编码 - 或者更确切地说是在线进行编码以避免大精度算术。结果不是完全XML,但仍然足够简单,可以生成和解析。
因此,我无法为您提供无法在XML中合理表示的数据结构。它太笼统了,特别是当我们利用在base64等中嵌入任意二进制数据的能力时。如果你因为不是纯XML而拒绝它,那么请回家:位掩码和布尔矩阵无法在纯 XML中有效地表示 。但请注意,纯XML编码仍然是合理的,它只占用大量空间。如果伪值的真实值很少(例如非常密集或稀疏的图的邻接矩阵),通过仅存储稀有的值并使另一个隐含,则可以减轻这种情况。
然而,这并不意味着XML是最佳,甚至是编码这些数据结构的好选择。它是一种流行的数据交换格式,但对于任何给定的数据结构,都有更简单,更有效的表示。因此,如果您不需要灵活性并且可以承担额外的工作,请不要使用它。或者使用其他通用数据格式之一。上面描述的所有编码都在YAML中完美地工作,并且更少详细,并且有些工作甚至更好,因为内置了映射和数组。树木变得更加难看,因为你必须将它们编码为嵌套记录(读取:列表/映射) ,但这就是你用编程语言代表它们的方式。我也很确定JSON可以处理所有这些,但由于我没有花费大量时间生成和解析它(我使用XML和YAML),我不能肯定地说。
答案 1 :(得分:5)
表示无限系列元素的结构。例如,在scala中我可以创建 fibonacci 序列,如下所示:
lazy val fibs: Stream[Int]
= 0 #:: 1 #:: ((fibs zip fibs.tail) map { case (n, s) => n + s })
如何用XML表示这种结构?我想你可以说它有效: - )
<structure lang="scala">
<[[CDATA [
lazy val fibs: Stream[Int]
= 0 #:: 1 #:: ((fibs zip fibs.tail) map { case (n, s) => n + s })
]>
</structure>
答案 2 :(得分:4)
如果这是一个面试问题,那么我谦虚地建议,或许你可能根本不想要这份工作 ......
答案 3 :(得分:2)
我认为我们无法“理智地”在XML中表达HashTable数据结构。 因为HashTable的基础说我们必须在O(1)次中获取数据,并且我们通过对每个对象进行索引来使数组成为可能。但是在XML中它不可能,我们必须每次都遍历xml来获取对象。
答案 4 :(得分:1)
几乎所有东西都可以用XML表达。我想你会在以下时候避免它:
编码/解析XML对于您的目的而言太慢(例如在视频游戏中)或消耗太多内存(例如在移动电话应用中)。
并且,您不需要在您自己的应用程序之外的任何内容中读取该格式。
答案 5 :(得分:1)
P.S。:问题中“明智”是什么意思?
[...]一种无法(合理地)用XML表达的数据结构。
如果你手动写出你的XML,那么低信噪比(即过多的尖括号,经常重复的元素名称)很可能是你判断XML“不合理”的原因。
我的回答不考虑这些问题。我相信 XML作为一种由机器而不是人类编写和读取的数据交换格式更有用,从这个观点来看,“明智”意味着别的东西(因为你不再做重复的打字或者decyphering,XML序列化软件也不会抱怨):
“从概念上将数据结构映射到合适的XML架构有多困难?”
我认为这取决于使用的具体XML模式。
XML本身就是一种非常通用的格式。 XML格式不是限制可以在其中表达的内容。与自然语言相比,XML本身更类似于大写和标点符号(“拼写法”)而非语法。 “语法”或有效内容的结构将更准确地放置在XML模式(XSD)中。在这方面,它与大多数编程语言不同,后者通常具有一个固定的语法。
让我们简单地离题并进行类比。我们假设the Eskimo language has more words for snow than the English language。这是否意味着英语无法准确描述各种形式的雪?不,它只意味着你可能需要一个完整的句子来传递相同的意思,而不是一个精确的单词。换句话说,英语足够灵活,允许限制。
回到XML:如果你需要一个XML模式来描述雪,并且它缺少一个元素frobble
,这意味着,“雪就像17天后一样冻结“,那么也许你可以在模式中引入必要的元素,以便你能够表达这种描述。
在另一种编程语言中,如果您发现类型系统的功能不足以描述某些数据结构,那么您作为语言设计师会做些什么?您可能只是扩展类型系统。 (例如,从一开始就没有Java和C#中的泛型。也可以将C风格的union
引入C#。)同样的事情可以在XML中完成,只有在这里你才能做到不得不扩展XML规范,也不得扩展XML Schema规范,而是使用具体的XML模式。
总而言之,我的主要观点是:XML作为一种格式不对内容施加限制,仅限于内容的呈现形式(“拼写法”)。另一方面,具体的XML模式定义了什么是有效内容,什么不是(语法)。您可以提出任意简单或复杂的语法来满足您的需求。
因此,我确信可以用XML描述任何数据结构。
答案 6 :(得分:1)
您可以用XML表示任何数据结构,就像您可以表示位序列中的任何数据结构一样。这都是表示方便的问题。例如,XML对于表示一般图表并不是特别理想,但它当然可以完成。
答案 7 :(得分:1)
每个数据结构都可以用xml表示。
每个数据可以表示为0和1,或者表示为“字节”。您可以将每个数据编码为可打印的格式,例如使用base64编码,然后你只需编写
<data>your_base64_data</data>
你有XML! :d