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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самый быстрый способ сортировки строк 
:(
    Опции темы
Riddik
Дата 30.6.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Строки лежат в vector.
Код

vector<string> rezalt;



Сортировка по алфавиту осуществляется так:

Код

sort(rezalt.begin(), rezalt.end(), less<string>());


Ф-ия вызывается около 1000 раз за 1-2 сек, строк много.  Важно сэкономить даже мс, как можно гораздо быстрее отсортировать по алфавиту? Какие ещё способы, более скоростные?

Или, может лучше из STL что-нибудь другое, чтобы сразу при добавлении строки сортировалось по алфавиту? Как быстрее?

Строки добавляются так: 
Код

rezalt.push_back(str);


Это сообщение отредактировал(а) Riddik - 30.6.2009, 17:18
PM MAIL   Вверх
azesmcar
Дата 30.6.2009, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Riddik @  30.6.2009,  17:13 Найти цитируемый пост)
Или, может лучше из STL что-нибудь другое, чтобы сразу при добавлении строки сортировалось по алфавиту? Как быстрее?

std::set
PM   Вверх
hsilgos
Дата 30.6.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Или, может лучше из STL что-нибудь другое, чтобы сразу при добавлении строки сортировалось по алфавиту? Как быстрее?

Вопрос: а зачем сортировать 1000 раз в секкунду? 
Если вставка относительно редка - std::set подойдет, но нет доступа по индексу.
PM MAIL   Вверх
Riddik
Дата 30.6.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо. 
Всё равно не укладывается в 2 секунды, где ж узкое место...

Добавлено @ 17:29
Задача это. Time limit 2 секунды.

Вставка частая. 

Вот блин... народ за 0.02 сек решает, а я в 2-е не могу уложиться.

Это сообщение отредактировал(а) Riddik - 30.6.2009, 17:30
PM MAIL   Вверх
azesmcar
Дата 30.6.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Riddik

а что надо сделать то? smile 

PM   Вверх
Riddik
Дата 30.6.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Исходные данные
В первой строке указано число n — количество объектов (2 ≤ n ≤ 1000). Каждая из следующих n строк содержит название объекта, двоеточие, пробел и набор ассоциаций этого объекта, разделённых пробелом. Название объекта и ассоциации состоят только из строчных латинских букв. В следующей строке указано число m — количество наборов объектов, для которых нужно найти общие ассоциации (1 ≤ m ≤ 1000). Каждая из следующих m строк содержит эти наборы в виде перечисления через пробел названий объектов. В каждом наборе не меньше двух объектов. Все строки не превышают 250 символов в длину.
Результат
Для каждого набора объектов выведите на отдельной строке все общие ассоциации этих объектов, отсортированные по алфавиту и разделённые пробелом. Если у объектов в наборе нет общих ассоциаций, выведите строку «No solution.»


Пример:
исходные данные    
6
whale: big black water animal
penguin: black white ice beak
piano: keyboard black white wire
jackboot: leather heel black
train: rail wheel black
rose: red green thorn
3
whale penguin piano jackboot train
penguin piano
jackboot rose

Результат
black
black white
No solution.
PM MAIL   Вверх
Riddik
Дата 30.6.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот скажите мне честно, эта ж очень лёгкая задача?

Я с 8 утра над ней сижу и выдавить ничего путного не могу. Мой мусорный код не может уложиться в 2 секунды, и не факт, что правильно всё делает.

Вот так поздно чем-то начинать заниматься... 

Надо было в школе или в универе хотя бы учиться программированию... 

Такие моменты крылья напрочь отрезают и жутко в себе разочаровывают.
PM MAIL   Вверх
zim22
Дата 30.6.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Riddik @  30.6.2009,  17:54 Найти цитируемый пост)
Такие моменты крылья напрочь отрезают и жутко в себе разочаровывают.

критический момент называется. если продержитесь - умней станете. нет - не умней smile

Цитата(Riddik @  30.6.2009,  17:35 Найти цитируемый пост)
Пример:исходные данные    

ваши исходные данные очень смахивают на данные из базы данных. нельзя их положить в БД и одним запросом за 1 миллиардную секунды получить нужный ответ!?
Цитата(Riddik @  30.6.2009,  17:35 Найти цитируемый пост)
Для каждого набора объектов выведите на отдельной строке все общие ассоциации этих объектов, отсортированные по алфавиту

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

Это сообщение отредактировал(а) zim22 - 30.6.2009, 19:45


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


любитель
****


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

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



Цитата(zim22 @  30.6.2009,  18:43 Найти цитируемый пост)
вам нужно результат выборки вывести в отсортированном виде. строки до выборки сортировать не нужно.

так он только результат и сортирует :
Цитата(Riddik @  30.6.2009,  16:13 Найти цитируемый пост)
sort(rezalt.begin(), rezalt.end(), less<string>());


Цитата(Riddik @  30.6.2009,  16:54 Найти цитируемый пост)
код не может уложиться в 2 секунды

покажите для начала как храните исходные данные.



--------------------
PM MAIL WWW   Вверх
kamre
Дата 30.6.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно еще входной файл увидеть, на котором так долго работает? 
PM MAIL   Вверх
Soah
Дата 30.6.2009, 20:10 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM MAIL   Вверх
kamre
Дата 30.6.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Soah @ 30.6.2009,  20:10)
если кому-то интересно, вот задача

Спасибо, что-то я не догадался сразу поискать эту задачку в гугле.
На Java решение в лоб сразу же прошло (0.718 / 15 998 KB):
Код

  private Map<String, Set<String>> itemProperties;
  private List<Set<String>> queries;

  private void processQueries() {
    for (Set<String> query : queries) {
      Set<String> common = null;
      for (String item : query) {
        Set<String> properties = itemProperties.get(item);
        if (common == null) {
          common = new HashSet<String>(properties);
        } else {
          common.retainAll(properties);
          if (common.isEmpty())
            break;
        }
      }
      if (common == null || common.isEmpty()) {
        System.out.println("No solution.");
      } else {
        Iterator<String> iterator = new TreeSet<String>(common).iterator();
        StringBuilder builder = new StringBuilder();
        builder.append(iterator.next());
        while (iterator.hasNext()) {
          builder.append(" ").append(iterator.next());
        }
        System.out.println(builder);
      }
    }
  }


PM MAIL   Вверх
zim22
Дата 30.6.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Riddik @  30.6.2009,  17:13 Найти цитируемый пост)
? Какие ещё способы, более скоростные?

вы уверены, что вам нужен именно скоростной метод сортировки, а не алгоритм нахождения пересечений слов?
***
предлагаю свой медленный smile алгоритм:
считать первую часть исходных данных в map<string / * название объекта */ , set<string> /* набор ассоциаций */ > object_map;
Код

6
whale: big black water animal
penguin: black white ice beak
piano: keyboard black white wire
jackboot: leather heel black
train: rail wheel black
rose: red green thorn


Для каждой строки создавать set<string>, содержащий все значения для выбранных ключей
Например для первой строки:
set<string> union_phrases = object_map[whale] + object_map[penguin] + ... + object_map[train]
В цикле проверять наличие слова из union_phrases одновременно во всех ключах из object_map
Код

3
whale penguin piano jackboot train
penguin piano
jackboot rose


Это сообщение отредактировал(а) zim22 - 30.6.2009, 21:13


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


Опытный
**


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

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



Я  очень и очень криво всё реализовал. Думаю, для вас далее последует анекдот и попадёт в перлы.

Создал структуру, у которой есть string для имени объекта, указатель на string для его ассоциаций и unsigned short для числа ассоциаций. Т.е. структура описывает один объект:
Код

struct Mind
{
    string name;
    string *assot;
    unsigned short cw;
    Mind() {cw=0;}
    ~Mind() {delete []assot;}
};


Далее считывается первое число из входного потока  - количество всех объектов. И столько создаётся Mind объектов:

Код

unsigned short g;
cin>>g;
Mind *mind=new Mind[g];


Далее считывает имя объекта в mind[i].name, считываются его ассоциации, всё после двоеточия и пробела считывается в строку, затем эта строка по словам заносится в mind[i].assot[cwi], по количеству ассоциаций для текущего объекта создаётся столько же "стрингов": 
Код

mind[i].assot=new string[col];  //col = mind[i].cw;


Всё это в цикле, число итераций которого равно первому считанному числу из входного потока.

Таким образом есть база объектов mind, каждый объект "знает" своё имя, свои ассоциации и количество своих ассоциаций. 
Далее считывается следующее целое из входного потока - число наборов объектов, для которых надо искать ассоциации. Это число итераций для следующего блока. 
Считывается строка - набор объектов. Далее по порядку, каждое слово сравнивается со всеми mind[i].name, когда совпадение найдено, в vectot помещается номер (unsigned short) нужного mind. И параллелльно ищется объект с самым маленьким количеством ассоциаций - по нему и надо искать совпадение ассоциааций. 
Таким образом, мы имеем vector, хранящий номера нужных mind-ов для текущий выборки и номер mind'а с самым маленьким набором ассоциаций.  
Код

for(per=0; per<mind[minim].cw; per++)  

где mind[minim].cw - это число ассоциаций, которое самое маленькое из всех mind'ов/ попавших в текущий набор. Чтобы делать наименьшее число итераций.

Далее вложенный цикл, проходит по всем mind'aм, номера которых в vector'е., и соответсвенно ещё вложенный цикл по ассоциациям текущего mind, как только встречается mind, у которого нет текущей ассоциации - эта ассоциация отбрасывается (break) и проверяется следующая. Если текущая ассоциация встретилась у всех объектов из текущего набора - она ложиться в rezalt. Сначала rezalt был vector'ом и пополнялся так: rezalt.push_back(assot);
Потом сортировал  sort(rezalt.begin(), rezalt.end(), less<string>());

Потом посоветовали set, его заполнял rezalt.insert(mind[minim].assot[per]).
После выводил резал через пробел или No solution., если ни одной ассоциации не было. 
И всё по-новой, пока не обойдёт все наборы. vector с номерами и rezalt очищались после каждой проверки очередного набора.
Вот так всё ужасно. Кирпичом мне по голове.
PM MAIL   Вверх
mes
Дата 30.6.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



имхо узкое место в поиске объекта.  Поэтому объекты лучше хранить в отсортированном векторе и применять соотвествующий поиск,
либо чтоб не изобретать велосипед использовать map (multimap)



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

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

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

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

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


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

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


 




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


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

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