2.2.3 顺序表其它算法举例 例2-4 试编写算法"比较"两个顺序表的大小。 算法的基本思想为:若 =,则 j 增 1,之后继续比较后继元素;否则即可得出比较结果。显然,j 的初值应为 0,循环的条件是 j 不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有三种可能出现的情况需要区分。 根据以上分析可得下列算法。
算法 2.9 上述算法中只有一个 while 循环,它的执行次数依赖于待比较的顺序表的表长,因此,算法2.9 的时间复杂度为 O (Min(A.length, B.length))。 |
何谓顺序表的"大""小"?现作如下规定: 设 A=(a1,…,am)和 B=(b1,…,bn)均为顺序表,又A'和B'分别为 A 和 B中除去最大共同前缀后的子表(例如,A=(y,x,x,z,x,z), B=(y,x,x,z,y,x,x,z),则两者中最大的共同前缀为(y,x,x,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z)和 B'=(y,x,x,z))。若A'=B'=空表,则 A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于B'的首元,则 A<B;否则 A>B。 解题分析: (1) 算法要求对两个顺序表进行"比较",是一种"引用型"操作,因此在算法中不应该破坏已知表。 (2) 按注解中的规定,只有在两个表的长度相等,且每个对应元素都相同时才相等;否则两个顺序表的大小主要取决于两表中除去最大公共前缀后的第一个元素。 因此,比较两表的大小不应该先比较它们的长度,而应该设一个下标变量 j 同时控制两个表,即对两表中"位序相同" 的元素进行比较。 |