· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Мне бы сортировочку

<< . 1 . 2 . 3 .

Посл.отвђт Сообщен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;
}


А вообще, просто здорово, что есть варианты и для списка, и для массива.

<< . 1 . 2 . 3 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076