Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 20:16   #1
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию Быстрая сортировка слов из текста

Язык C++ ;Задача такая : Дан файл 1.txt (в нем содержится текс романа “Война и мир”). Необходимо в файл 2.txt выписать все встречающиеся слова (по одному в строке) с сортировкой по уменьшению частоты появления этого слова (слова учитываются без знаков препинания и длиной не менее 4х символов). Необходимо вывести на экран время работы программы.

Вопрос в том что здесь лучше использовать чтобы время было минимальным ( VS 2008 )

Последний раз редактировалось matrosken; 17.05.2010 в 20:22.
matrosken вне форума Ответить с цитированием
Старый 17.05.2010, 23:06   #2
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Используете map, где храните по ключу типа "стринг" значение типа "инт", которое будет показывать, сколько раз встречается слово. Потом закидываете в массив из мэпа пары "стринг-инт" и вызываете встроенную сортировку с компаратором по частоте встречания. Сложность будет
O(nlogn+t+klogk)=O(max(t,klogk)), где n - количество уникальных слов, t-количество символов в тексте, k- количество всех слов.

Для замера времени есть встроенные функции (названия не помню). Посмотрите на cplusplus.com/reference
O(n)
sabbathist вне форума Ответить с цитированием
Старый 18.05.2010, 19:12   #3
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию

Какой массив стринг-инт? и какая встроенная сортировка?
matrosken вне форума Ответить с цитированием
Старый 18.05.2010, 19:18   #4
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

массив лучше всего реализовывать как вектор пар. встроенную сортировку вызываете так:
sort(v.begin(),v.end(),comp), где v - ваш вектор пар ,а comp - компаратор (его напишете сами) булевского типа.


В начале программы не забудьте
Код:
 #include <algorithm>
- там лежит sort
O(n)

Последний раз редактировалось sabbathist; 18.05.2010 в 19:22.
sabbathist вне форума Ответить с цитированием
Старый 18.05.2010, 20:41   #5
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию

Код:
bool my_greater(pair<string, int> const& x, pair<string, int> const& y)
{
    return x.second > y.second;
}

 . . .

    typedef map<string, int> my_map_t;
    my_map_t my_map;
    // fill my_map here
    typedef vector<pair<string, int> > my_vector_t;
    my_vector_t my_vector;
    copy(my_map.begin(), my_map.end(), back_inserter(my_vector));
    sort(my_vector.begin(), my_vector.end(), my_greater);
надо бы так, только почему то когда пишу map<string,int> откудато появляются 17 ошибок зато если написать const char* вместо string то они исчезают и вроде как работает
matrosken вне форума Ответить с цитированием
Старый 19.05.2010, 00:07   #6
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Хм. Интересно. Возможно, вы чего-то не договариваете). Но если работает - думаю, вы не в обиде.
O(n)
sabbathist вне форума Ответить с цитированием
Старый 19.05.2010, 12:33   #7
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию

не знаю
правда не const char* а char*
string не работает не знаю почему
matrosken вне форума Ответить с цитированием
Старый 20.05.2010, 19:05   #8
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию

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

Последний раз редактировалось matrosken; 20.05.2010 в 19:42.
matrosken вне форума Ответить с цитированием
Старый 21.05.2010, 17:16   #9
sabbathist
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 66
По умолчанию

Ну, я слова выбирал след. образом: читал весь текст, а потом парсил руками. два потока через fopen (как им пользоваться - на cplusplus.com/reference а сам я не помню : ). при выводе пишете не сout имя подгруженного потока (вроде бы). если поток вывода перегружать через freope, то можно и cout.
O(n)
sabbathist вне форума Ответить с цитированием
Старый 30.05.2010, 09:53   #10
matrosken
 
Регистрация: 17.05.2010
Сообщений: 8
По умолчанию

Спасибо за помощь
matrosken вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка Serious Общие вопросы Delphi 2 02.11.2010 13:38
быстрая сортировка настолько быстрая Serg12 Помощь студентам 8 28.03.2010 21:31
Быстрая сортировка _Studentka_ Помощь студентам 9 20.11.2009 00:19
Быстрая сортировка Syltan Общие вопросы C/C++ 7 18.09.2009 17:35
быстрая сортировка ГРИГОРИЙ-кореш Помощь студентам 1 16.04.2009 18:13