Data structures 二项堆的正确函数实现

Data structures 二项堆的正确函数实现,data-structures,functional-programming,sml,purely-functional,binomial-heap,Data Structures,Functional Programming,Sml,Purely Functional,Binomial Heap,我正在阅读中的二项式堆 insTree函数的实现让我很困惑。这是一组代码 datatype Tree = Node of int * Elem.T * Tree list fun link (t1 as Node (r, x1, c1), t2 as Node (_, x2, c2)) = if Elem.leq (x1, x2) then Node (r+1, x1, t2::c1) else Node (r+1, x2, t1::c2) fun rank (Node (r, x

我正在阅读中的
二项式堆

insTree
函数的实现让我很困惑。这是一组代码

datatype Tree = Node of int * Elem.T * Tree list

fun link (t1 as Node (r, x1, c1), t2 as Node (_, x2, c2)) = 
  if Elem.leq (x1, x2) then Node (r+1, x1, t2::c1)
  else Node (r+1, x2, t1::c2)

fun rank (Node (r, x, c)) = r

fun insTree (t, []) = [t]
  | insTree (t, ts as t' :: ts') =
      if rank t < rank t' then t::ts else insTree (link (t, t'), ts')
这背后的一个重要细节是,二项式堆不是任何碰巧有k个子树的树。这是一棵被严格定义为

阶数为0的二叉树是单个节点,并且 n阶二叉树是一个节点,其子节点为0、1、2、…、n-1阶二叉树


这就解释了为什么构造二项式堆所需的insert函数不能管理这些情况(理论上不会发生)。也许您建议的案例对于合并操作是有意义的(但底层实现应该有所不同)

insTree是一个用户不可见的助手函数。用户调用insert,insert依次调用具有等级为0的树和等级递增的树列表的insTree。insTree有一个不变量,即t的秩是insTree的
不是将树插入到另一棵树中,而是将树插入到堆中
到堆
可能有这些情况。insTree
的目的是使用二项式堆和树构建二项式堆。只有当您的初始二项堆格式良好(否则这不是二项堆),并且树(将要插入的树)的排名高于初始二项堆中的任何树时,才会发生这种情况。这解释了为什么您找不到由insTree函数管理的这些提取案例。您能定义格式良好的二项式堆吗?为什么要插入的树必须有一个更大的等级?你是对的,我把二项堆和二项树混淆了。你的问题是一个复杂的问题。很抱歉有分歧没问题。我自己只是想把一切弄清楚谢谢你的回答克里斯。我也这么认为,但是在
有趣的合并
(同一页22)中,insTree被用作通用函数,不管它是公共函数还是私有函数
else insTree(link(t1,t2),merge(tsp',tsp'))
,显然
link(t1,t2)
不一定是秩0。对,link(t1,t2)不是秩0,但它仍然是秩0
fun insTree (t, []) = [t]
      | insTree (t, ts as t' :: ts') =
          if rank t < rank t' then t::ts 
          else if rank t = rank t' then insTree (link (t, t'), ts')
          else t'::(insTree (t, ts'))