【算法】利用随机化算法对顺序表进行搜索【原创技术】

随机化算法

实验要求

1. 理解计算机随机数的产生;

2. 理解随机化算法原理及一般应用;

3. 编程实现典型随机算法,理解算法思想,并对算法进行验证分析。

实验内容

利用随机化算法对顺序表进行搜索:

l 随机抽取有序表元素;

l 从最接近待查元素开始搜索。

实验结果

定义一个60000个元素的数组,元素值依次为2,4,6…120000。

随机抽取300次,根据抽取的元素就近查找某数是否存在。

输入元素为待查找整数,结果为元素下标位置(从0开始)。

——————————————–

示例输入:

1999

示例输出:

-1

——————————————–

示例输入:

6

示例输出:

2

源代码:

//科目:算法实验

//题目:利用随机化算法对顺序表进行搜索:

//

随机抽取有序表元素;

//

从最接近待查元素开始搜索。

//作者:武叶

//语言:C语言

//创作时间:2012年5月6日

#include<stdio.h>

#include<math.h>  #define M 60000

long m[60000];

long n[60000];

int suiji[300];

int  search(int result)

{

int address,address1,address2,min,j,k,temp;

int  locate=-1;

int b=245;

int c =  23;

n[0]=m[0];

suiji[0]=0;

for(k=0;k<299;k++)

{

suiji[k+1] =  (suiji[k] * b + c)%M;

}  //对suiji[300]数组的随机值进行冒泡排序

for(k=0;k<=299;k++)

{

for  (j=0;j<300-k;j++)

if  (suiji[j]>suiji[j+1])

{

temp=suiji[j];

suiji[j]=suiji[j+1];

suiji[j+1]=temp;

}

}  //根据suiji数组的值将相应的x数组中的值存在y数组中 for(k=0;k<300;k++)

{

j=suiji[k];

n[j]=m[j];

}  min=(int)fabs(n[0]-result);  //求result与抽取数组中的元素之差的绝对值

address=0;

for(k=0;k<j;k++)  //根据抽取的元素就近查找某数是否存在

{

if((int)fabs(n[k]-result)<min)

{

min=(int)fabs(n[k]-result);

address=k;

}

}  //判断元素在x数组中的位置

if(min==0)

{

return  address;

}

else

{

address1=address-min/2;//元素可能出现下标位置范围

address2=address+min/2;

for(k=address1;k<=address2;k++)

{

if(result==m[k])//查找下标

{

locate=k;

break;

}

}

return  locate;

}

} int main()

{

int i, search_num,location;  //location为查找元素的位置 search_num为要查找的数

for(i=0;i<60000;i++)

m[i]=(i+1)*2;  //定义m[i]为2,4,6…120000。

scanf(“%d”,&search_num);

if(search_num<0||search_num>120000||search_num%2==1)

{

printf(“-1\n”);

}

else

{

location=search(search_num);

printf(“%d\n”,location);

}

return  0;}

更多详细内容::::去学习

点赞