|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 27, 2003 12:33:12 А ведь все сводится к теории множеств :) т.е. проверка при добавлении :DD |
|
|
Дата: Авг 27, 2003 12:55:28 2 volodya: Зачем тебе произвольная вставка, когда у тебя элементы добавляются только в конец? Последний вариант по сути есть самый очевидный: "в лоб", с проверкой всех найденых значений на каждый элемент, зачем-то оформленный в виде списка. До этого тебе предлагались гораздо более продвинутые алгоритмы, делающие на каждый элемент меньше сравнений. Вообще, на 20 элементах будет работать любой алгоритм, в среднем 10 сравнений на элемент - это фигня. Если их было бы 2000 разница была бы намного заметнее. ;) В любом случае, списки здесь не нужны совершенно. Предложи другую структуру Навскидку, вариант "в лоб" без списков: typedef struct { int i1, i2; } STRUCT;
STRUCT *p = NULL;
int count = 0, size = 0;
void add(int i1, int i2)
{
int a;
for(a=0; a<count; a++) if((p[a].i1 == i1) && (p[a].i2 == i2)) return;
if(count == size) p = realloc(p, sizeof(STRUCT) * (size += 20));
p[count].i1 = i1; p[count++].i2 = i2;
}
Он ничем не хуже твоего чуда со списком, а по памяти намного экономнее, хотя бы потому, что malloc-ов на каждый элемент нет. ;) Более правильные варианты - в прошлых мессагах. |
|
|
Дата: Авг 27, 2003 13:06:46 2 Artem: А может, задача может быть решена с использованием контейнеров STL? Только в том случае, когда тебе нужен результат. Когда тебя интересует сам процесс... ;)) Тем более, что из-за 20 элементов и заморачиваться смысла нет. :) 2 DaemoniacaL: А ведь все сводится к теории множеств :) т.е. проверка при добавлении Естественно. Различается только вычислительная сложность проверки. Одно дело последовательный поиск по несортированному массиву, другое - бинарный по сортированному. А непосредственный доступ к битовому флагу - третье. ;) |
|
|
Дата: Авг 27, 2003 14:22:51 bsl_zcs Все, в свою очередь, сводится к организации списка (ну, или любой другой структуры хранения данных) |
|
|
Дата: Авг 27, 2003 18:48:39 Он ничем не хуже твоего чуда со списком, а по памяти намного экономнее, хотя бы потому, что malloc-ов на каждый элемент нет. ;) Хм... Зато есть реаллоки! :) Тем не менее - спасибо огромное. Я многому научился. Кстати, свой вариант со списком я переписал еще раз - он стал еще шустрее. На нем и остановлюсь. А твою идею - начнем с того, что это одно и тоже в двух вариантах - для массива и для списка. У тебя жрет realloc массива, у меня жрет malloc списка. Устроим борьбу шварцами? :))) |
|
|
Дата: Авг 27, 2003 20:12:43 · Поправил: volodya Версия 0.03 - пререлиз :)))
void AppendNode(slist **headRef, int num, int num2)
{
slist *current = *headRef;
slist *endRef = NULL; //важно иметь КОНЕЦ списка под рукой
while(current)
if(current->val == num && current->val2 == num2)
return;
else
{
endRef = current;
current = current->next;
}
current=malloc(sizeof(slist));
current->val=num;
current->val2=num2;
current->next=NULL;
if(endRef)
endRef->next=current;
else
*headRef = current;
}
А вообще, просто здорово, что есть варианты и для списка, и для массива. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |