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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL vector, помогите реализовать алгоритм 
:(
    Опции темы
Dray
  Дата 3.4.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Есть класс
Код

class CNode
{
public:
    CNode *m_pLeft, *m_pRight;
    
    unsigned int m_Char;
    unsigned int m_CharCount;
    
    CNode()                                        //!
    {
        m_pLeft = NULL;
        m_pRight = NULL;
        m_Char = 0;
        m_CharCount = 0;
    };

    CNode (unsigned int newChar)
    {
        m_pLeft = NULL;
        m_pRight = NULL;
        m_Char = newChar;
        m_CharCount = 0;
    };

    CNode (const CNode &node)
    {
        m_pLeft     = node.m_pLeft;
        m_pRight    = node.m_pRight;
        m_Char      = node.m_Char;
        m_CharCount = node.m_CharCount;
    };

    CNode (CNode *node)
    {
        m_pLeft     = node->m_pLeft;
        m_pRight    = node->m_pRight;
        m_Char      = node->m_Char;
        m_CharCount = node->m_CharCount;
    };

    CNode (CNode *pLeft, CNode *pRight)
    {
        m_pLeft  = pLeft;
        m_pRight = pRight;
        m_Char = 256;
        m_CharCount = pLeft->m_CharCount + pRight->m_CharCount;
    };

    bool operator < (const CNode &node)
    {
        return (m_CharCount < node.m_CharCount);
    };

    bool operator == (const CNode &node)
    {
        return (m_Char == node.m_Char);
    };

    const CNode& operator = (const CNode &node)
    {
        if (&node == this)return *this;
        m_pLeft  = node.m_pLeft;
        m_pRight = node.m_pRight;
        m_Char = node.m_Char;
        m_CharCount = node.m_CharCount;
        return *this;
    };
    
};


Контейнер:
Код

class CHufTree2  
{
private:
    CNode *m_Root;
    int   m_Count;
    
    bool  m_IsTree, m_IsInit;
    vector <CNode> m_List;
.........

};


Нужно из вектора построить дерево по след. алгоритму.
- Из списка находится два элемента с наименьшим m_CharCount.
- Удаляются из списка.
- Создается новый элемент типа CNode, где m_pLeft и m_pRight эти найденные элементы.
- m_CharCount нового эл-та - сумма m_CharCount'ов двух найденных эл-в.
- Новый элемент добавляется в список.
- Следующие наименьшие один или два элемента могут быть эти новые добавленные.
- Так повторяется пока список не иссякнится.

Помогите пожалуйста. Просто проблемы возникли из-за использования вектора.


--------------------
忍者

user posted image
PM MAIL   Вверх
bel_nikita
Дата 3.4.2005, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
Помогите пожалуйста. Просто проблемы возникли из-за использования вектора.
А какие именно проблемы? Вектор - тот же самый массив CNode m_List[n];


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Dray
Дата 4.4.2005, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Цитата(bel_nikita @ 3.4.2005, 23:45)
А какие именно проблемы?

Ну я делал так:
Код

int CHufTree2::CreateTree()
{
    if(!m_IsInit)return 1;
    CNode *buf1 = NULL;
    CNode *buf2 = NULL;
    vector <CNode>::iterator itr_min;
    while (!m_List.empty ())
    {
        itr_min = min_element(m_List.begin (), m_List.end ());
        buf1 = new CNode (itr_min);
        m_List.erase (itr_min);

        itr_min = min_element(m_List.begin (), m_List.end ());
        buf2 = new CNode (itr_min);
        m_List.erase (itr_min);

        m_Root = new CNode (buf1, buf2);
        m_List.push_back (*m_Root);
    };
    m_IsTree = true;
    return 0;
};

Однако стандартный min_element находит постоянно один и тот же элемент. Т. е. похоже, что erase его вообще не удаляет. smile

Это сообщение отредактировал(а) Dray - 7.4.2005, 16:09


--------------------
忍者

user posted image
PM MAIL   Вверх
yaja
Дата 5.4.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Конечно не мое дело, но по-видимому тебе надо написать сжатие Хафмана(или хотя бы его построение). С использованием спиаска ты сделаещь ето за O(n^2), а можно за O(n*log(n)). Да плюс stl, то сильно он у тебя тормозить будет...
Лучше использовать приоритетную очередь smile smile smile smile
PM MAIL   Вверх
DENNN
Дата 6.4.2005, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(yaja @ 5.4.2005, 23:29)
Да плюс stl, то сильно он у тебя тормозить будет...

Что-то сомневаюсь я smile smile smile
PM ICQ   Вверх
yaja
Дата 6.4.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Честно говоря стоит проверить. smile stl предоставляет большие возможности, которые вданном случае просто ни к чему smile Проетому уже при построении дерева для unicode (2^16 символов) ужедолжна быть разница, нежели написать самому простой список, позволяющий дделать элементарные операции с ним.
PM MAIL   Вверх
Dray
Дата 6.4.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Цитата(yaja @ 5.4.2005, 23:29)
по-видимому тебе надо написать сжатие Хафмана

Именно так. Это такое задание там где я учусь.
Цитата(yaja @ 6.4.2005, 11:52)
stl предоставляет большие возможности, которые вданном случае просто ни к чему

STL использовать надо. Т. к. это условие задания.


--------------------
忍者

user posted image
PM MAIL   Вверх
Dray
Дата 7.4.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Почти разобрался. Если не
Код
while (!m_List.empty ())

а
Код
while(m_List.size() >=1)

То все вроде работает. И элементы разные находятся.
Но есть еще вопрос. Как сдесь правильно сделать конструктор копирования, а то, вроде два объекта не должны ссылаться на один другой. Из-за этого могут быть серьезные проблемы.
И еще, я прочитал, что в векторе, если использовать erase, то все ссылки после удаленного элемента становятся недействительнами. Если это так, то как тогда удалять из середины вектора?


--------------------
忍者

user posted image
PM MAIL   Вверх
Fire-Plug
Дата 13.4.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dray @ 7.4.2005, 16:27)
что в векторе, если использовать erase, то все ссылки после удаленного элемента становятся недействительнами. Если это так, то как тогда удалять из середины вектора?

Oбрати внимание на возвращаемое значение метода vector::erase(). Это - итератор, указыв. на элемент, следующий за удаленным или же на конец вектора.
Все ссылки, полученные на основе этого итератора - корректны.
К примеру, след. фрагмент вполне работоспособен.
Код

vector <CNode>::iterator it= m_List.begin();
while(it != m_List.end ())
{
// что-то делаем юзая 'it'
   if(Some_erase_condition)
        it = m_List.erase (it); //  возвращаемый it указыв. на след. эл-т
   else
        it++;
}

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Fantasist
Дата 13.4.2005, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата(Dray @ 6.4.2005, 13:01)
STL использовать надо. Т. к. это условие задания.


Каким образом это сформулированно? Вообще, вектор и дерево просто разные структуры, и использовать одно для реализации другого выглядит слегка не логично.





--------------------
Волны гасят ветер...
PM MAIL   Вверх
Dray
Дата 16.4.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Спасибо, Fire-Plug за ответ.
Цитата(Fantasist @ 13.4.2005, 23:16)
Каким образом это сформулированно?

Вообще, как бы, в задании это не оговорено. Просто преподаватель дал условие - чтобы был STL. Типа показать что я умею с ним работать. smile


--------------------
忍者

user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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