在c中搜索数组类型struct的元素

时间:2015-05-14 08:34:13

标签: c arrays database search optimization

我有一系列结构,可以存储公司内部关于个人电脑的一些基本信息(代码,模型,连接到互联网)。

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个电脑中搜索过,就像在示例中一样。但它也被卡住了。

我做错了什么?当我真的不得不通过很多电脑时,这可以做得更快吗?

2 个答案:

答案 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;
}