Skip to content

Instantly share code, notes, and snippets.

@sgfsdfgsdfhgsfhdfhj
Last active June 16, 2016 15:31
Show Gist options
  • Save sgfsdfgsdfhgsfhdfhj/1053eaf3bfef96b840b754ee732760ac to your computer and use it in GitHub Desktop.
Save sgfsdfgsdfhgsfhdfhj/1053eaf3bfef96b840b754ee732760ac to your computer and use it in GitHub Desktop.
ееее, я таки слепил strstr на основе сортировки работающего быстрее стандартного, хотя и требующего дополнительно в параметр - длину строки
/*ееее, я таки слепил strstr на основе сортировки работающего стабильно быстрее
стандартного, хотя и требующего дополнительно в параметр - длину строки,
хотя max_len ещё можно настроить, что-б ещё побыстрее было
скорость кажется такая:
P + n/P * ЧТО_ТО_ТАМ
где:
n=strlen(str1)
m=strlen(str2)
max_len - это сейчас константа там внутри
P=Min(max_len,m)
ЧТО_ТО_ТАМ - голова болит сейчас думать
лучшая соответственно примерно(это когда ничего не найдёт из-за того что буквы попадутся несуществующие в str2):
P + n/P
худшая примерно:...
*/
char * my_strstr(const char * str1, const char * str2, size_t slen)
{
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
unsigned int max[256];
unsigned int min[256];
memset(max,0xff,sizeof(unsigned int)*256);
memset(min,0xff,sizeof(unsigned int)*256);
char *cp2 = (char*)str2;
unsigned char v;
unsigned int len =0;
const unsigned int max_len = 90;
while(v=*cp2){
max[v]= len;
if(min[v]==0xffffffff)
min[v]=len;
len++;
cp2++;
if(len>=max_len)
break;
}
len = cp2-str2;
if(len > slen){
return NULL;
}
char *cp = (char *) str1;
char *cp_end= cp+slen;
while (cp<cp_end)
{
v= *cp;
char *b_ind = (char*)cp-max[v];
if(b_ind!=0xffffffff){
char *e_ind = (char*)cp-min[v];
if(e_ind <str1){
}
else{
b_ind = b_ind >=str1 ? b_ind : str1;
while(b_ind<=e_ind)
{
s1 = b_ind;
s2 = (char*)str2;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(b_ind);
b_ind++;
}
}
}
cp+=len;
}
return(NULL);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment