C 在包含一些空字符串的已排序字符串数组中查找字符串
字符串数组是按排序顺序给出的,但它之间可以有任意数量的空字符串。我需要在字符串数组中搜索一个字符串。如果找到字符串,则返回该字符串的索引,否则返回-1 我使用strcmp()编写了以下代码,它只适用于不带空字符串的字符串数组。如何将其扩展到同样适用于具有空字符串的数组C 在包含一些空字符串的已排序字符串数组中查找字符串,c,arrays,string,C,Arrays,String,字符串数组是按排序顺序给出的,但它之间可以有任意数量的空字符串。我需要在字符串数组中搜索一个字符串。如果找到字符串,则返回该字符串的索引,否则返回-1 我使用strcmp()编写了以下代码,它只适用于不带空字符串的字符串数组。如何将其扩展到同样适用于具有空字符串的数组 #include<stdio.h> #include<stdlib.h> #include<string.h> int search(char *arr[], char *strtofin
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int search(char *arr[], char *strtofind, int l, int r)
{
int mid , val;
if(l <= r)
{
mid = (l+r)/2;
val = strcmp(strtofind, arr[mid]);
if(val == 0)
return mid;
else if(val > 0)
{
return search(arr, strtofind,mid+1,r);
}
else
{
return search(arr, strtofind, l, mid-1);
}
}
return -1;
}
int main(int argc, char** argv)
{
int idx;
//char *arr[] = {"STR1", "STR2","STR3","STR4","STR5","STR6","STR7"}; // WORKS HERE
char *arr[] = {"STR1", "STR2","STR3",NULL,"STR4",NULL,"STR5"}; // NOT WORKS HERE
idx = search(arr, "STR4", 0, 6);
printf("Found at = %d\n", idx);
printf("Will is Everything.");
return (EXIT_SUCCESS);
}
#包括
#包括
#包括
整数搜索(char*arr[],char*strofind,intl,intr)
{
int mid,val;
if(l0)
{
返回搜索(arr、STROFIND、mid+1、r);
}
其他的
{
返回搜索(arr、STROFIND、l、mid-1);
}
}
返回-1;
}
int main(int argc,字符**argv)
{
int-idx;
//char*arr[]={“STR1”、“STR2”、“STR3”、“STR4”、“STR5”、“STR6”、“STR7”};//在这里工作
char*arr[]={“STR1”、“STR2”、“STR3”、NULL、“STR4”、NULL、“STR5”};//在这里不起作用
idx=搜索(arr,“STR4”,0,6);
printf(“位于=%d\n”,idx);
printf(“意志就是一切”);
返回(退出成功);
}
类似的内容将跳过空值。一旦找到空值,它就会求助于线性搜索,但我想不出更好的方法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int search(char arr[][20], char *strtofind, int l, int r)
{
int mid , val, down = 1, start;
if(l <= r)
{
mid = (l+r)/2;
start = mid;
while(0 == arr[mid])
{
if(down)
{
if(mid >= l)
{
mid--;
}
else
{
down = 0;
mid = start;
}
}
else
{
if(mid <= r)
{
mid++;
}
else
{
return -1;
}
}
}
val = strcmp(strtofind, arr[mid]);
if(val == 0)
return mid;
else if(val > 0)
{
return search(arr, strtofind,mid+1,r);
}
else
{
return search(arr, strtofind, l, mid-1);
}
}
return -1;
}
int main(int argc, char** argv)
{
int idx;
char arr[][20] = {"STR1", "STR2","STR3","STR4"};
int num = sizeof(arr)/sizeof(arr[0]);
idx = search(arr, "STR2", 0, num-1);
if(-1 != idx)
{
printf("Found at = %d\n", idx);
}
else
{
printf("Not found");
}
return (EXIT_SUCCESS);
}
#包括
#包括
#包括
整数搜索(char arr[][20],char*strofind,intl,intr)
{
int mid,val,down=1,开始;
如果(l=l)
{
中--;
}
其他的
{
向下=0;
mid=开始;
}
}
其他的
{
如果(中间0)
{
返回搜索(arr、STROFIND、mid+1、r);
}
其他的
{
返回搜索(arr、STROFIND、l、mid-1);
}
}
返回-1;
}
int main(int argc,字符**argv)
{
int-idx;
字符arr[][20]={“STR1”、“STR2”、“STR3”、“STR4”};
int num=sizeof(arr)/sizeof(arr[0]);
idx=搜索(arr,“STR2”,0,num-1);
如果(-1!=idx)
{
printf(“位于=%d\n”,idx);
}
其他的
{
printf(“未找到”);
}
返回(退出成功);
}
执行strcmp()时,请检查是否为NULL。如果为空,则选择该索引-1。它将起作用。更改比较代码。arr[mid]
中的NULL
本质上是“跳过”此元素,因此比较需要线性搜索到下一个或前一个元素
为了防止最坏的情况真正弄乱代码,请确保对列表的两部分的后续搜索不会重新扫描一组关于mid
的NULL
元素。注意列表两端的NULL
最坏的情况是O(n*n)
,它与大量NULL
一起出现。否则,O(n*ln2(n))
如果NULL
很少,则可以预期性能
此外,不需要递归调用。见评论
int search(const char *arr[], const char *strtofind, int l, int r)
while (l <= r) {
int mid = (l+r)/2;
int right_min = mid + 1;
while (arr[mid] == NULL) {
// If entire left side and mid are NULL ...
if (mid == 0) {
return search(arr, strtofind, right_min, r);
// or { l = right_min; continue; }
}
mid--;
}
int cmp = strcmp(strtofind, arr[mid]);
if (cmp == 0) {
return mid;
}
if(val > 0) {
return search(arr, strtofind, right_min, r);
// or { l = right_min; continue; }
}
int left_max = mid - 1;
return search(arr, strtofind, l, left_max);
// or { r = left_max; }
}
return -1;
}
int搜索(常量字符*arr[],常量字符*strofind,int l,int r)
while(l0){
返回搜索(arr、strofind、right\u min、r);
//或{l=right_min;continue;}
}
int left_max=mid-1;
返回搜索(arr、strofind、l、left_max);
//或{r=left_max;}
}
返回-1;
}
建议:使用const
如果所有
NULL
的arr[]
位于一端,则存在一种有效的方法O(n*ln2(n))
您必须检查arr[mid]!=空
在使用strcmp之前@esskar:好的,如果它为空,我应该如何继续如果(arr[0][mid]==NULL)返回-1代码>二进制搜索对已排序的数据有效。如果arr[index]
为空,那么我们现在应该在数组的左侧还是右侧进行搜索?如果数组中的随机位置存在空值,则无法决定如何继续。所以你必须使用线性搜索。我肯定看到了与其他人不同的东西。我仍然想知道如何在数组数组中存储空指针,数组的每个元素都是char[20]
。这是一个char*arr[]={…}代码>这是有道理的。如文所述,这一点也不重要。