Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Си] Сравнение элементов, Помогите с алгоритмом 
:(
    Опции темы
Alkash
Дата 24.2.2012, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Доброе время суток господа. Собственно суть задачи: есть некоторые данные, которые можно представить как набор чисел вида "96959", естественно различные. Чисел этих - может быть - как 10, так и n. В процессе работы - к данным числам по определенному событию добавляться ещё несколько. При запуске программы - мы получаем так сказать - эталонный список данных чисел. Так вот, в процессе работы программы - необходимо получать всю эту кучу чисел по определенному событию, и выискивать числа - которых в эталонном списке нет. Вопрос: каким образом наиболее рационально реализовать данную задачу, чтобы это на отожрало кучу времени, и памяти ? 


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
ColdSpirit
Дата 24.2.2012, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Записать эталонный список допустим в массив, и потом сравнивать с новым?
PM MAIL   Вверх
Alkash
Дата 24.2.2012, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Я уже думал об этом, а если элементов массива будет скажем n, но менее n в десятой степени?


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
ColdSpirit
Дата 24.2.2012, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Для новых данных сделать другой массив и ничего не надо сравнивать)))
PM MAIL   Вверх
Alkash
Дата 24.2.2012, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Эм, так мне надо неким чудным образом - новые появляющиеся данные, отсутствующие в массиве первом - запихивать в массив финальный получается, без элементов эталонного массива. И как я создав новый массив с новыми данными - узнаю, без сравнения,какие из данных новые, если порядок расположения в принципе может быть рандомный?-))

Это сообщение отредактировал(а) Alkash - 24.2.2012, 22:07


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
ColdSpirit
Дата 24.2.2012, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Тоесть новые данные поступают несколько раз и нужно узнать только данные которые только что поступили?
Если да, тогда нужно три массива:
{эталонный массив}, {массив неэталонный}, {массив с новыми данными},
причем при каждом добавлении новых чисел, старые числа переходят из {массива с новыми данными} в {массив неэталонный}

Если надо, чтобы массив был один (допустим для рандомного расположения элементов), то можно реализовать как выше, и добавить еще один массив, с ссылками на элементы других массивов
PM MAIL   Вверх
Alkash
Дата 24.2.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Эта схема понятна. Тут вся беда то вот в чем: мы получаем временный массив - в виде смеси из данных эталонных и данных новых, Поэтому - вопрос по сути заключается в том, как отделить старые данные от новых, с минимальными потерями производительности.


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
ColdSpirit
Дата 24.2.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: нет
Всего: 2



Боюсь в таком случае кроме обычного сравнения ничего предложить не могу, но я заметил, что в гугле много информации на этот счет

#конкретные ссылки показать не могу, боюсь модерация этого не одобрит =)

Это сообщение отредактировал(а) ColdSpirit - 24.2.2012, 22:38
PM MAIL   Вверх
Dem_max
Дата 26.2.2012, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



использовать vector

Код

#include <vector>

typedef struct
{
    int Chislo;
    bool bEtalon;
} CHISLO;

std::vector<CHISLO> chislo;

    CHISLO ch;

    // Добавили эталонное
    ch.Chislo = 100000;
    ch.bEtalon = true;
    chislo.push_back(ch);

    // Добавили не эталонное
    ch.Chislo = 99999;
    ch.bEtalon = false;
    chislo.push_back(ch);





Это сообщение отредактировал(а) Dem_max - 26.2.2012, 07:53


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
fish9370
Дата 27.2.2012, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



эта задача довольно типична, решается с помощью таблиц с вычисляемым входом: 
1) вычисляешь хеш строки (некое число которое можно спроецировть на таблицу определенного размера)
2) по указанному индексу проверяешь не занята ли ячейка (не существует хеш функции, которая бы не порождала бы коллизий)
3) записываешь значение

коллизии можно разрешать двумя способами: 
1) вводом признака занятости ячейки и увеличением индекса при занятости
2) созданием списка и занесением элемена в список

вся сложность алгоритма заключается в написании хорошей хеш-функции (в простом случае это может быть взятие остатка от деления на количество элементов таблицы)

этот способ применяется: 
при поиске процесса в ядре линукса
для нахождения мак-адреса в коммутаторе
вобщем, передовой метод


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.