проблема с буферами Part 3

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 18 Dec 2008.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    есть два буфера нужно определить входит ли первый буфер в состав второго

    что-то типа этого

    PHP:
    #include <stdlib.h>
    #include <string.h>


    void main ()
    {


    char *"aaagggbbb"

    char *"ggg";



    int n проверитьb);


    }
    какие функции есть в C, что бы это выполнить
     
  2. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    char *strstr(char *, char *)
    Ищет первое вхождение одной строки в другой и возвращает указатель на него. А вообще почитай что-нибудь про стандартную библиотеку. MSDN тотже.
     
  3. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    2 izlesa

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


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

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

    Code:
    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. это к разговору давнишнему (применение олимпиадных технологий в жизни) !
     
    #3 Delimiter, 18 Dec 2008
    Last edited: 18 Dec 2008
  4. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    2Delimiter
    Ну в вопросе присутствовали строки ).
    Но алгоритм хорош ^______^
     
  5. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Code:
    int FindStr(char *str1,char *str2)
    {
    	int nstr1,nstr2,i,j,nstr,sstr;
    	nstr1=strlen(str1);
    	nstr2=strlen(str2);
    	if(nstr1>nstr2)
    	{
    		nstr=nstr1-nstr2;
    		for(i=0;i<nstr;i++)
    		{
    			sstr=0;
    			for(j=0;j<nstr2;j++)
    			{
    				if(str1[j+i]==str2[j])
    				{
    					sstr++;
    				}
    			}
    			if(sstr==nstr2)
    			{
    				return 1;
    			}
    		}
    	}
    		else
    		{
    			return -1;
    		}
    		return 0;
    }
    Не уверен как будет работать strlen с 0х00 ну при необходимости можно и переписать