Эффективный поиск самых коротких и длинных строк из массива длинных строк в C - PullRequest
1 голос
/ 10 сентября 2010

Учитывая массив указателей на обычные C-NUL-концевые (и обычно очень длинные) строки, как мы можем наилучшим образом найти самые маленькие и самые большие строки?

Ответы [ 5 ]

9 голосов
/ 10 сентября 2010

, используя strlen для каждой записи вашего массива.

4 голосов
/ 10 сентября 2010

Может быть, для их прохождения поможет? - Хорошо, вам не нужна идея C ++, давайте посмотрим:

Хорошо, еще раз:

char **strings; // initialized
int stringsNumber = 500; // number of string in first dimension
int longestLen = 0;
int shortestLen = MAX_INT; // or other REALLY BIG number ;]
char *longest = NULL;
char *shortest = NULL;
int current = 0;
for(int i =0; i < stringsNumber; i++)
{
  current = strlen(strings[i]);
  if(current > longestLen) { longestLen = current; longest = strings[i];  }
  if(current < shortestLen) { shortestLen = current; shortest = strings[i]; }
}
1 голос
/ 10 сентября 2010

Если строки действительно очень длинные, вы должны сохранить их с атрибутом длины, который вычисляется уже при вводе строк.

1 голос
/ 10 сентября 2010

У вас может быть другой массив указателей на символы размера n, указатель i-го которого указывает на начало строки i-й.

Увеличивайте каждый указатель, пока он не достигнет конца.

первым, который достиг конца, был указатель на самую короткую строку.

Последним, кто достиг конца, был указатель на самую длинную строку.

0 голосов
/ 10 сентября 2010

Если он дан вам, а вы не управляете им - итерация по массиву и strlen.

Если вам это удастся - рассмотрите возможность использования std::string или pair<char *, int> (строка, длина) для оптимизации вашего кода, а также замены массива указателей некоторым упорядоченным контейнером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...