Показать сообщение отдельно

  #3  
Старый 18.12.2008, 18:54
Delimiter
Banned
Регистрация: 08.04.2005
Сообщений: 446
С нами: 11099536

Репутация: 518
По умолчанию

2 izlesa

справдедиво лишь для буферов хранящих строки! Хотя все равно не понятно .... а сравнивать ли символы после 0x00. To do or not to do! What is the question!


в общем же случае ... вычисляется хэш равный сумме малого буфера
ХЭШ=Сумма(b[i])
.... вычислетя хэш "плавающего" фрагмента большого буфера
ХЭШ2=Сумма_фрагмента(a[i])
и пусть buf_length - длинна большого буфера
а buf2_length -длина малого буфера

тогда ...далее

Код:
int find_inside(char *a,char *b,int buf_length,int buf2_length)
{
int i,j,ex;
long ХЭШ,ХЭШ2;
for(j=0,ХЭШ=0,ХЭШ2=0;j<buf2_length;j++)
{   ХЭШ+=b[j];     ХЭШ2+=a[j]; }

for(i=0,ex=-1;i<buf_length-buf2_length && ex==-1;i++,ХЭШ2=ХЭШ2-a[i-1]+a[i+buf2_length])
{
  if(ХЭШ==ХЭШ2)
    if(memcmp(a+i,b,buf2_len)==0)
      ex=i;
}
return ex;
}
если возвращает -1 не было совпадений если >-1 то это отступ от начала буфера

суть должна быть понятна... технология быстрого поиска подстроки в строке, но на манер буферов! 8))


СУПЕР-быстродействие ! Быстрее не получится!

P.S. это к разговору давнишнему (применение олимпиадных технологий в жизни) !

Последний раз редактировалось Delimiter; 18.12.2008 в 20:34..
 
Ответить с цитированием