У меня есть простой метод в C++, который ищет строку в связанном списке. Это работает хорошо, но мне нужно сделать это быстрее. Является ли это возможным? Может быть, мне нужно вставить элементы в список в алфавитном порядке? Но я не думаю, что это может помочь в серфинге. В списке имеется около 300 000 наименований (слов).Как улучшить поиск связанных списков. C++
int GetItemPosition(const char* stringToFind)
{
int i = 0;
MyList* Tmp = FistListItem;
while (Tmp){
if (!strcmp(Tmp->Value, stringToFind))
{
return i;
}
Tmp = Tmp->NextItem;
i++;
}
return -1;
}
Метод возвращает номер позиции, если найденный элемент, в противном случае возвращает -1. Любой sugesstion будет полезен.
Спасибо за ответы, я могу изменить структуру. У меня есть только одно ограничение. Код должен реализовывать следующий интерфейс:
int Count(void);
int AddItem(const char* StringValue, int WordOccurrence);
int GetItemPosition(const char* StringValue);
char* GetString(int Index);
int GetOccurrenceNum(int Index);
void SetInteger(int Index, int WordOccurrence);
Какая структура будет по вашему мнению наиболее подходящей?
Есть ли причина, по которой вы используете связанный список? Если вы использовали 'std :: set', вам было бы намного меньше беспокоиться о сложности выполнения. Есть больше орудий, но, возможно, этого уже достаточно. –
Wintermute
Честно говоря, исправление заключается в том, чтобы не использовать связанный список. – Borgleader
Храните строки лексикографически в 'std :: vector' и используйте' std :: lower_bound'. Это 'O (log (n))' сложность. Вы также можете использовать 'std :: unordered_set', который теоретически имеет сложность« O (1) », но вы должны измерить, прежде чем решите наилучшее. – 101010