Это бинарный поиск К тому же, я провел тесты. Добавлялись строки из 5 случайных символов. На 10000 элементов мой код выполнился за 150 миллисекунд, ваш за 6 секунд. На 50000 мой за 2 секунды, ваш 115 секунд На 100000 мой 7 секунд, окончания вашего я так и не дождался PS Научись хотя бы иногда уступать Код теста, если интересно И я конечно же сознаю что мой код далеко не самое лучшее решение, но все же лучше вложенного цикла. Просто ТСу и этого хватит имхо, а если нет то пусть сам курит алгоритмы удаления дубликатов
А что если совместить: 1. Раскидываем стринглист в массив строк 2. Циклом от конца до начала проходим по нему и двоичным поиском выкидываем дубли 3. Собираем массив, исключая пустые строки? По идее должно работать еще быстрее, но кодить это мне уже лень
интересная табличка получилась провел тесты processing 100000 added 99612 equal 388 time 1(sec) processing 200000 added 198540 equal 1460 time 4(sec) processing 300000 added 296892 equal 3108 time 6(sec) processing 400000 added 394336 equal 5664 time 8(sec) processing 500000 added 491254 equal 8746 time 10(sec) processing 600000 added 587555 equal 12445 time 12(sec) processing 700000 added 683437 equal 16563 time 14(sec) processing 800000 added 778758 equal 21242 time 17(sec) processing 900000 added 873159 equal 26841 time 20(sec) processing 1000000 added 967745 equal 32255 time 22(sec) processing 1100000 added 1061361 equal 38639 time 25(sec) processing 1200000 added 1154678 equal 45322 time 28(sec) processing 1300000 added 1246899 equal 53101 time 32(sec) processing 1400000 added 1338997 equal 61003 time 34(sec) processing 1500000 added 1431406 equal 68594 time 38(sec) processing 1600000 added 1522871 equal 77129 time 41(sec) processing 1700000 added 1613904 equal 86096 time 44(sec) processing 1800000 added 1704782 equal 95218 time 47(sec) processing 1900000 added 1794751 equal 105249 time 52(sec) processing 2000000 added 1885085 equal 114915 time 57(sec) processing 2100000 added 1974475 equal 125525 time 60(sec) если студия стоит затестите у себя все есть только скомпильте как C а не C++ C/C++\Advanced\Compile As\Compile As C Code(/TC) да и #include <headutil.h> можно безболезненно стереть привычка писать код в одном и том же солюшене в итоге заголовочники от старых мини проектов остаются Code: #include <conio.h> #include <stdio.h> #include <stdlib.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <time.h> #include <assert.h> #include <headutil.h> static char ** vector; static size_t all_elements; typedef struct _node node; struct _node { char *str; node *right, *left; }; node * add_string(node **root, const char *str) { node *new; if (!*root) { vector = realloc(vector, sizeof(char*) * (all_elements+1)); if (!vector) __asm int 3; new = malloc(sizeof(node)); if (!new) __asm int 3; new->str = vector[all_elements++] = strdup(str); if (!new->str) __asm int 3; new->left = new->right = NULL; return *root = new; } if (strcmp((*root)->str, str) < 0) return add_string(&(*root)->left, str); else if (strcmp((*root)->str, str) > 0) return add_string(&(*root)->right, str); return NULL; } void show_or_save_to_file(void) { size_t i; for (i = 0; i < all_elements; i++) puts(vector[i]); all_elements = 0; } void free_tree(node *root) { if (root->left) free_tree(root->left); if (root->right) free_tree(root->right); free(root->str); free(root); } void free_tree_and_vector(node **root) { node *dup_root = *root; free_tree(dup_root); free(vector); *root = NULL; vector = NULL; } char * rndnick(char * strbuf); #define MAX_STRING_SIZE 1024 DWORD MAX_APPEND_TRYING = 100000; int main(void) { CHAR Buff[MAX_STRING_SIZE]; node *tree; clock_t start; SIZE_T i, added, equal; again: start = clock(); equal = added = 0; tree = NULL; for (i = 0; i < MAX_APPEND_TRYING; i++) { if (!add_string(&tree, rndnick(Buff))) equal++; else added++; } free_tree_and_vector(&tree); printf("processing %8.lu added %8.lu equal %8.lu time %8.lu(sec)\n", MAX_APPEND_TRYING, added, equal, (clock() - start) / 1000, MAX_APPEND_TRYING); all_elements = equal = added = 0; MAX_APPEND_TRYING += 100000; goto again; return 0; } unsigned long mwc ( void ) { static unsigned long x = 123456789, y = 362436069, z = 77465321, c = 13579; unsigned long long t; t = 916905990LL * x + c; x = y; y = z; c = ( t >> 32 ); return z = ( t & 0xffffffff ); } char * rndnick ( char * strbuf ) { int n, nl; char nick [ 12 ]; LARGE_INTEGER perf; QueryPerformanceCounter ( &perf ); memset ( nick, 0, sizeof ( nick ) ); nl = ( mwc ( ) ^ perf.LowPart ) % 6 + 4; for ( n = 0; n < nl; n++ ) nick [ n ] = ( mwc ( ) ^ perf.LowPart ) % 25 + 97; nick [ n + 1 ] = '\0'; strncpy ( strbuf, nick, 12 ); return strbuf; }
greki_hoy круто, ну это же Си Я щас смог пока добиться 2.5 секунды в дельфи на 100000 Тебе не кажеться что слишком много совпадений у тебя?
я взял код генерации рандомных ников из старого проекта он и раньше так генерил примерно на миллион 100 тысяч одинаковых как раз для нашей задачи подходит хорошо сделал еще замер но в релизе с оптимизацией 100000 меньше секунды выполнилось не отобразилось даже processing 100000 added 99635 equal 365 time (sec) processing 200000 added 198571 equal 1429 time 2(sec) processing 300000 added 296865 equal 3135 time 3(sec) processing 400000 added 394439 equal 5561 time 4(sec) processing 500000 added 491461 equal 8539 time 6(sec) processing 600000 added 587702 equal 12298 time 7(sec) processing 700000 added 683579 equal 16421 time 8(sec) processing 800000 added 778644 equal 21356 time 10(sec) processing 900000 added 873523 equal 26477 time 12(sec) processing 1000000 added 967515 equal 32485 time 14(sec) processing 1100000 added 1061124 equal 38876 time 16(sec) processing 1200000 added 1154273 equal 45727 time 17(sec) processing 1300000 added 1246800 equal 53200 time 19(sec) processing 1400000 added 1339224 equal 60776 time 22(sec) processing 1500000 added 1431755 equal 68245 time 24(sec) processing 1600000 added 1523122 equal 76878 time 26(sec) processing 1700000 added 1613692 equal 86308 time 29(sec) processing 1800000 added 1704272 equal 95728 time 31(sec) processing 1900000 added 1795504 equal 104496 time 34(sec) processing 2000000 added 1885197 equal 114803 time 37(sec) processing 2100000 added 1975226 equal 124774 time 39(sec)