假设我们有一个基于数组的表A[0...N-1],并且我们想要删除所有相同的元素。lastPosition 初始值为N-1,但该值随着相同元素被删除而变得越来越小。考虑下图中的伪码程序段。过程Delete删除位置j上的元素并使表破坏。
/* 1*/ for (i=0; i<LastPosition; i++) { /* 2*/ j = i + 1; /* 3*/ while(j < LastPosition) /* 4*/ if (A [i] == A [j]) /* 5*/ Delete(j); else /* 6*/ j++; }
a. 解释该过程是如何进行工作的
b. 利用一般的表操作重写这个过程
c. 如用标准的数组实现,则这个过程的运行时间是多少?
d. 给出用链表实现的运行时间是多少?
e. 给出一个算法以O(NlogN)时间解决该问题。
f. 证明:如果只使用比较,那么解决该问题的任何算法都需要
次比较。
g. 证明:如果我们允许除比较之外的其他操作,并且这些关键字都是实数,那么我们不用元素间的比较就可以解决该问题。