----------------------android培训、java培训、期待与您交流! ----------------------
顺序查找(Sequential Search)也称线性查找(Liner Search)是最为简单的查找算法形式,当然,它的查找效率也是最低的。从开始元素起,它按顺序的方式依次检查每个元素,直到找到要查找的元素或到达数组末尾为止。
例如你在一辆行驶的列车上寻找某人时,你也许会使用顺序查找的方式来进行寻找,如图1所示。
图1 顺序查找
算法2.1 顺序查找
前提条件(输入):s={ 是n各类型为x的有序值序列。
后置条件(输出)当某个 时,返回索引值I,否则,返回-1。
1. 重复步骤2~3 n次,从i为0到n-1。
2. (不变式)子序列{ }中没有与x相等的元素。
3. 假如
4. 返回 -1。
在算法2.1中,我们使用前提和后置条件来说明算法的功能,并用循环不变式来证明算法的正确性。对每个算法均给出Java代码实例。
例1 顺序查找
public static int sequentialSearch(int [] a,int x)
{
//前提条件:returns i; if i>=0, then a[i] == x;
// otherwise i == -1;
for (int i = 0; i<a.length ;i++ ) //步骤1
//不变式:if a[k] == x then i<=k<a.length; //步骤2
//不变式:a[k]!=x,for 0<=k<i; //步骤2
if(a[i]==x) return i; //步骤3
return -1; //步骤4
}
定理1 顺序查找算法是正确的
证明:当n=0时,序列为空,所以循环体将不会被执行,只有步骤4将被执行,立即返回-1 。此时它满足后置条件:x不等数组中的任意一个元素,因为数组为空时它没有任何元素。
当n=1时,循环迭代依次,此时i=0,在此次循环中,s0=x或s0=x。当s0=x时返回0,并满足后置条件。当s0=x时,循环将被终止,不走4将被执行,返回-1。此时它满足后置条件:序列中的那个单一元素不等于x。
假如n>1,则在循环中的第一次迭代中,i=0,子序列{s0...si-1}为空,所以第二步中的循环不变式自然为真。在第三步时,s0=x或s0=x,当s0=x时,返回0,并满足后置条件。当s0=x时循环将被继续进行。当存在第二次迭代时(也就是说s0=x),则i=1,由于子序列{s0...si-1}等于{s0} 并且s0=x,所以第二步中的不变式再次为真。
假设在循环迭代的第k次中,循环不变式为真,即子序列{s0...si-1 }中没有一个元素等于x,则在该次迭代中,在第三步时,s0=x或s0=x。当s0=x时,返回k,并满足后置条件。当s0=x时,循环将被继续进行。
由数学归纳原理可知,在每一个循环迭代之后,算法要么在后条件为真的情况下终止,要么用于下次迭代的循环不变式为真。因此,假如在任意步中没有终止,则在最后迭代之后(当i=n-1),对于i=n次迭代时,用于该次迭代的循环不变式为真,也就是说,子序列{s0...si-1 }中没有任意元素等于x。此时,将返回-1,并满足后置条件。
下面的定理中使用了O()记号。
定理2 顺序查找算法的运行时间是O(n)
证明:如果x 位于序列中,假设在i处,x=si ,且i<n,则循环将迭代i次。在这种情况下,运算时间正比于I,即为O(n)(因为i<n)。
假如x不在序列中,循环将迭代n次,使得运行时间正比于n,也就是O(n)。
例2 测试顺序查找算法
import schaums.dswj.ArraysDemo;
public class Testingss
{
private static final int SIZE = 16;
private static final int START = 40;
private static final int RANGE = 20;
private static int [] a = new int[SIZE];
public static void main(String [] args)
{
ArraysDemo.load(a,START,RANGE);
ArraysDemo.print(a);
test();
test();
test();
test();
}
public static void test()
{
int x = ArraysDemo.load(START,RANGE);
System.out.print("Searching for x = " + x + ":\t");
int i = ArraysDemo.sequentialSearch(a,x);
if (i >=0 ) System.out.println("a[" + i +"] = "+a[i]);
else System.out.println("i = " + i + " ==> x not found");
}
}
该程序的输出结果为:
本程序测试顺序查找算法,在有load()产生的数组上进行4次查找。第一次找x=43,但失败返回-1。第二次查找x=53,并在a[5]处找到该元素。第三次查找小x=59,但失败返回-1。第四次查找x=56,并在a[15]处找到该元素。注意该值也存在于a[10]处。顺序查找算法一旦找到目标,就放弃对数组中其余部分的查找。
为了访问的方便,每个数组查找算法均加入到achuams.dswj.ArraysDemo类中。例如,对顺序查找算法的测试,我们呢将该类引入,然后调用ArraysDemo.sequentialSearch()即可。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima