随机化算法
实验要求
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;}
更多详细内容::::去学习