Red de conocimiento informático - Conocimientos de programación - Programación para determinar si hay dos números cuya suma es igual a un número k dado en una matriz que contiene una secuencia creciente.

Programación para determinar si hay dos números cuya suma es igual a un número k dado en una matriz que contiene una secuencia creciente.

La complejidad del tiempo O(nlogn) es mejor que O(N^2)

#include

#include

#define SUM_OK1

#define SUM_FAIL0

typedef struct _Pair{

int a;

int b ;

}Par;

Par ret estático;

int sum_binary_search( int * datas, int start, int len, int match )

{

int low =-1;

int pos = -1;

//Para facilitar la prueba, la longitud fija es 10 y la Los siguientes datos también son Puedes escribirlos primero

if (datas[7]

//assert(datas[low]=match)

if (datas[low+4]

//assert(datas[low]=match)

if (datas[low+2]

//assert(datas[low]=match)

if (datas[low+1]

//assert(datas[low]< coincidencia && datos[ low+1]>=match)

pos = low+1;

if (pos>10 || datos[pos]!=match)

{

pos = -1;

}

else{

ret.b = datos[pos];

}

return pos;

}

int search_pair( int * datas, int suma, int len ​​​​)

{

int i;

int retVal = SUM_FAIL;

int *pair_datas = (int*)calloc(len,sizeof(int ));

for (i = 0;i

pair_datas[i] = suma -datas[i];

for ( i = 0;i< len;i++) //O(n)

{

ret.a = suma - pair_datas[i];

if (-1 != sum_binary_search (datas,0,len,pair_datas[i])) //O(lgn)

{

retVal = SUM_OK;

printf("(% d,%d)\n",ret.a,ret.b);

break;/-----------Si desea imprimir todos los resultados apropiados y eliminar este descanso, puede usar los parámetros de entrada para controlarlo usted mismo

}

} //-----> O(nlgn)

free(pair_datas);

pair_datas = NULL;

regresar retVal;

}

int comparar(const void* a,const void* b){

int* t = (int*)a;int* s = (int*)b;

return (*t-*s);

}

int main(){

int (*cmp)(const void*,const void*) = comparar;

int datos[10] = {2,10,5,3,4,6,13,7,11, 9} ;

int suma = 13;

int len ​​​​= 10;

qsort(datas,len,sizeof(int),cmp);

search_pair(datas,sum,len);

devuelve EXIT_SUCCESS;

}