二进制搜索树:min元素

时间:2013-04-16 06:28:30

标签: prolog

我试图搜索这个,但没有运气;如果问题已经得到解答,请告诉我!

假设我有一个二进制树,其键值对形式为:

  • t/0:空树
  • t/4t(Key, Value, Left, Right)
  • 的树节点

现在我想获得第一个(min)元素。显而易见的(对我来说)实施是:

min0(t(K,V,t,_), K, V) :- !.
min0(t(_,_,L,_), K, V) :- min0(L, K, V).

然而,SWI-Prolog library(assoc)中的实现与以下几行有关:

min(t(K,V,L,_), Key, Val) :- min(L, K, V, Key, Val).
min(t,K,V,K,V).
min(t(E,K,V,_), _, _, Key, Val) :- min(L, K, V, Key, Val).

maxget等其他操作在方法上表现出相同的差异。

为什么呢?我在这里错过了什么?据我所知,我的版本没有创建选择点。但话又说回来,我需要在基本情况下进行削减。

1 个答案:

答案 0 :(得分:3)

当考虑执行子句时,您的版本 会创建一个选择点。 !/0切断了之前创建的选择点。您的版本不允许对第一个参数进行索引,但依赖于术语中更深处的统一。您是否已经在大型二叉树上对这两个版本进行了基准测试?除此之外,我发现SWI版本更优雅,因为您提到的两个树术语自然会出现在其中。