我有一系列结构,可以存储公司内部关于个人电脑的一些基本信息(代码,模型,连接到互联网)。
typedef struct database{
char code[5];
char brand[20];
char model[20];
int lab;
int connect;
}database;
现在我想搜索数组以找到与代码C01A
对应的pc
这里有一个存储在struct中的信息的小例子:
C01A HP SJH1740 1 0
B02A HP SJ1290 3 1
A03B DELL PQ240 2 1
A02B DELL PQ240 3 1
C09H FUJITSU NP0001 1 0
A06D DELL PQ240 3 1
C00X FUJITSU LP1050 2 0
B89A HP SJ1290 3 1
A03F DELL PT1000 2 0
C12P HP AA0012 1 1
D01D DELL BB2300H 3 0
您可以看到第一台电脑的代码为C01A
。在这里,我们看到我从文件中随机挑选的11个PC,其中可以有数百万台PC(想想一个大公司,阵列能够容纳1000万台PC,因为我可以)。
我可以搜索数组中的每个元素,直到找到正确的元素。但是(使用快速计算dunno,如果没关系)。这意味着我必须滚动10.5MB的内存,如果搜索过程没有最优化,这是非常多的。
所以我想出了这个:
步骤1:在程序启动时对数组进行排序。
第2步:从数组的中间开始并检查该元素
步骤3:如果我要搜索的元素小于选中的元素,请检查上半部分的中间,否则检查下半部分的中间
步骤4:重复直到找到元素或者直到检查相同的元素两次,在这种情况下元素不存在。
这是我尝试的快速代码:
database searchpc(database temp[],int n){
int i=n/2;
char code [5];
printf("incerici codice da cercare: ");
scanf("%s",code);
getchar();
while(strcmp(temp[i].code,code)!=0){
if(strcmp(temp[i].code,code)>0)
i=i/2;
else
i=i*2;
}
return temp[i];
}
如果找到则返回元素,否则它会陷入循环(这是正在进行的工作)
我在上面的信息中对其进行了测试,并且我在C01A
个电脑中搜索过,就像在示例中一样。但它也被卡住了。
我做错了什么?当我真的不得不通过很多电脑时,这可以做得更快吗?
答案 0 :(得分:0)
如果i
为零且您尝试将其减半,或者i * 2
大于n
,则无法找到结构。
答案 1 :(得分:0)
您尝试实施的是二进制搜索。您的实施不正确。它应该类似于:
/*
* searches for a value in sorted array
* arr is an array to search in
* value is searched value
* left is an index of left boundary
* right is an index of right boundary
* returns position of searched value, if it presents in the array
* or -1, if it is absent
*/
int binarySearch(int arr[], int value, int left, int right) {
while (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] == value)
return middle;
else if (arr[middle] > value)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}