Database 修改的预订单和仅预订单之间有什么区别?
我读过关于树遍历和树数据结构的书,所以我现在知道了什么是前序树遍历,但是我也看到了一种叫做修改后的前序树遍历的东西,但是我发现要找到关于这两者之间的区别的好答案或文档有点困难。有人能对此发表评论吗?我确实找到了一篇关于解释它的文章,但是这个图表看起来很像常规的前序,作者写的唯一一件事是一个节点有两个附加值,我不确定这是否正确 我读到的文章是: 我也看了一遍:但我很难相信作者,他说他是大学经济学专业的学生,写的是关于树结构的文章。 Django的mptt模块是其使用的一个地方:Database 修改的预订单和仅预订单之间有什么区别?,database,data-structures,tree,Database,Data Structures,Tree,我读过关于树遍历和树数据结构的书,所以我现在知道了什么是前序树遍历,但是我也看到了一种叫做修改后的前序树遍历的东西,但是我发现要找到关于这两者之间的区别的好答案或文档有点困难。有人能对此发表评论吗?我确实找到了一篇关于解释它的文章,但是这个图表看起来很像常规的前序,作者写的唯一一件事是一个节点有两个附加值,我不确定这是否正确 我读到的文章是: 我也看了一遍:但我很难相信作者,他说他是大学经济学专业的学生,写的是关于树结构的文章。 Django的mptt模块是其使用的一个地方: 当我在谷歌上搜索时
当我在谷歌上搜索时,似乎有好几个地方都在使用这种预排序树遍历的修改版本,所以我发现没有更多的文章来解释这种差异有点奇怪。我稍微不同意这个命名,也许你方对此有些困惑 我将“遍历”定义为遍历的过程 我们从遍历中得到的结果,我可能称之为“表示” MPTT与其说是遍历,不如说是表示 此外,左边的值可以被认为是前序,而右边的值可以被认为是后序(我们将讨论…) 因此,我可能更愿意将其命名为“组合前/后顺序遍历表示”
现在看看这到底是什么 如上所述,它只是一个表示 让我们看看从树生成此表示的算法:
traverse(node, index)
node.left = index
for each child c of node
traverse(c, ++index)
node.right = ++index
从上面的代码可以看出,我们在递归到子节点之前和之后都对节点进行了处理,因此可以将其视为前序和后序遍历的某种组合
现在,这个和前序或后序之间更重要的区别在于它的使用方式
Pre-Order或postorder通常是在树上运行或用于生成树的内容(可能是为了将其紧凑地存储到磁盘,而在实际需要使用树时,可能会在内存中生成典型的基于指针的表示)
但对于MPTT,这将是您在使用它时实际表示树的方式。这在数据库中特别有用,因为数据库并不特别关注递归
您可以将MPTT值存储在表中,这样可以有效地执行各种查询。例如:(派生自)
- 要获取一个节点的所有子体,需要在该节点的左值和右值之间查找左值
- 要获取节点的/所有祖先的路径,需要查找左值小于此左值且右值大于此右值的节点
以上两项都可以使用单个查询执行,其中作为递归表示,路径中的每个节点都需要一个查询,并且。。。一些是给后代的。如果你引用了一篇文章,至少要添加一个链接或引用。“Modified preorder”听起来像是有人为了自己的需要修改了preorder遍历的概念。我看到“Modified preorder tree traversal”这个词有很多地方,所以它似乎被用在了很多地方。我将添加几个链接。谢谢你的回答。结合这些图表,我现在可以看出,这比常规预订单要快得多,效率更高。因此,如果您有一个线程评论系统,例如,您将只执行一个查询,而不是遍历树,这将花费更多的时间。